为什么我的程序出现分段错误?
why got segmentation error in my program?
https://www.hackerrank.com/challenges/gridland-metro/problem
这是黑客等级问题的link。
#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 段错误的原因:
- 正如其他人所说,您必须 首先分配 memory/initialize 向量。它会自动不知道要取多大尺寸。
- 在你的问题中 n 的值,m < = 10^9,如果你分配的内存包含那么多条目那么它可能至少达到(500 MB)这是非常大。
1 个可能的超时原因:
- 从 1 到 n 有一个 for 循环 运行,在最坏的情况下可能是 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);
}
https://www.hackerrank.com/challenges/gridland-metro/problem 这是黑客等级问题的link。
#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 段错误的原因:
- 正如其他人所说,您必须 首先分配 memory/initialize 向量。它会自动不知道要取多大尺寸。
- 在你的问题中 n 的值,m < = 10^9,如果你分配的内存包含那么多条目那么它可能至少达到(500 MB)这是非常大。
1 个可能的超时原因:
- 从 1 到 n 有一个 for 循环 运行,在最坏的情况下可能是 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);
}