c++ - 为什么在我的程序中出现段错误?

标签 c++ c++11 compiler-errors segmentation-fault c++14

https://www.hackerrank.com/challenges/gridland-metro/problem
这是黑客等级问题的链接。

#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 告诉我执行这个程序的正确方法,因为我猜我的代码是蛮力的,如果它是正确的

最佳答案

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

段错误的 2 个原因:

  • 正如其他人所说,您必须 首先分配内存/初始化 vector 。它自动不知道要采取什么尺寸。
  • 在您的问题中, 的值n , m < = 10^9 ,如果您分配的内存包含那么多条目,那么它可能至少达到(500 MB),这是非常大的。

  • 1 个可能的超时原因:
  • 有一个 for 循环从 1 运行到 n 最坏的情况可能是 10^9 次。即使您以某种方式设法分配内存,这本身也会超时。 Refer this for timeout issues.

  • 不过,对于您的蛮力方法,您可以尝试以下方法:
    #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);
    }
    

    关于c++ - 为什么在我的程序中出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61988168/

    相关文章:

    c++ - CodeLite 立即关闭终端

    c++ - 求 vector int 的一部分的总和

    android - 多个 dex 文件错误

    c++ - Linux 内存分析工具

    c# - 使用 C++ 保存 wav 文件时音频数据不正确(基于 C# 程序)

    c++ - 容器的 3D 网格:嵌套 std::vector 与 std::unordered_map

    c++ - 使用派生自 `std::get` 的元素在 `std::tuple` 上调用 `std::tuple` - 格式错误?

    c++ - 我可以在 std::function 中使用模板类型 T 来传递 lambda 类型函数 C++11 吗?

    cocoa - 使用多个 XCTestCase 类进行 UITesting

    java - Java方法不断给我: “cannot find symbol” [duplicate]