为什么我的程序出现分段错误?

问题描述 投票:1回答:1

https:/www.hackerrank.comchallengesgridland-metroproblem这是黑客排名中的问题链接。

#include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  int tot = n * m;
  vector<vector<int>> track;

  for (int i = 1; i <= n; i++) {
    track[i][0] = INT_MAX;
    track[i][1] = INT_MIN;
  }

  while (k--) {
    int r, c1, c2;
    scanf("%d%d%d", &r, &c1, &c2);

    if (track[r][0] > c1 && track[r][1] < c2) {
      if (track[r][0] == INT_MAX && track[r][1] == INT_MIN) {
        track[r][0] = c1;
        track[r][1] = c2;
        tot -= c2 - c1 + 1;
      } else {
        tot -= (track[r][0] - c1) + (c2 - track[r][1]);
        track[r][0] = c1;
        track[r][1] = c2;
      }
    } else if (track[r][0] <= c1 && track[r][1] >= c2) {
      tot -= 0;
      continue;
    } else if ((track[r][1] > c1 && track[r][0] < c1) && track[r][1] < c2) {
      c1 = track[r][1] + 1;
      tot -= c2 - c1 + 1;
    }
  }

  printf("%lld", tot);
}

这是我的问题的代码,我得到的分段故障在这。PLz告诉我这个程序的正确方法,因为我想我的代码是蛮力的一个,如果它是正确的。

c++ c++11 compiler-errors segmentation-fault c++14
1个回答
0
投票

这可能会对你有所帮助,但是你必须改变你的思维方式:

2個原因的分割故障 :

  1. 正如别人所讲的,你要 首先分配内存初始化 的矢量。它自动不知道该取什么大小。
  2. 在你的问题中 n , m < = 10^9如果你分配的内存包含这么多的条目,那么它可能会达到至少(500 MB),这是非常大的。

1个可能的原因是超时。

  1. 有一个 从1到n的循环 可以在最坏的情况下 10^9 次。即使你设法分配了内存,这本身也会超时。关于超时问题请参考这里。

尽管如此,对于你的蛮力方法,你可以试试这个。

#include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  int tot = n * m;
  vector<vector<int>> track(n+1);
  //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  for (int i = 1; i <= n; i++) {
    track[i] = vector<int>(2);
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^
    track[i][0] = INT_MAX;
    track[i][1] = INT_MIN;
  }

  while (k--) {
    int r, c1, c2;
    scanf("%d%d%d", &r, &c1, &c2);

    if (track[r][0] > c1 && track[r][1] < c2) {
      if (track[r][0] == INT_MAX && track[r][1] == INT_MIN) {
        track[r][0] = c1;
        track[r][1] = c2;
        tot -= c2 - c1 + 1;
      } else {
        tot -= (track[r][0] - c1) + (c2 - track[r][1]);
        track[r][0] = c1;
        track[r][1] = c2;
      }
    } else if (track[r][0] <= c1 && track[r][1] >= c2) {
      tot -= 0;
      continue;
    } else if ((track[r][1] > c1 && track[r][0] < c1) && track[r][1] < c2) {
      c1 = track[r][1] + 1;
      tot -= c2 - c1 + 1;
    }
  }

  printf("%lld", tot);
}
© www.soinside.com 2019 - 2024. All rights reserved.