競技プログラミングを始めたばかりの初心者です。ある程度入力が大きくなってくると、
コード:
long long costs[1000000000];
のようなことがしたくなってくるのですが、頻繁にstartupルーチンの最中に落ちてしまいます。
以下は、プリムのアルゴリズムを書こうとした途中のコードです。
コード:
#include <iostream>
using namespace std;
#define MAXN 100000
#define min(a, b) ((a) < (b) ? (a) : (b))
#define abs(a) ((a) < 0 ? - (a) : (a))
#define BIGNUM 10000000000
int main(void)
{
int N;
static long x[MAXN];
static long y[MAXN];
static long d[MAXN][MAXN];
int flag[MAXN] = {0};
cin >> N;
for(int i=0; i<N; i++) {
cin >> x[i] >> y[i];
}
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
d[i][j] = min(abs(x[i]-x[j]), abs(y[i]-y[j]));
}
}
flag[0] = 1;
long long ans = 0;
for(int i=1; i<N; i++) {
long long mintemp=BIGNUM;
long long minindex;
for(int j=0; j<N; j++) {
if(flag[j] == 1) {
if(mintemp > d[i][j]) {
mintemp = d[i][j];
minindex = j;
}
ans += mintemp;
flag[minindex] = 1;
}
}
}
cout << ans << endl;
return 0;
}
こちらを
のようにコンパイルし、実行したのですが、
コード:
~/p/a/a/065 $ ./a.out
fish: “./a.out” terminated by signal SIGSEGV (Address boundary error)
このようにSEGVで落ちてしまいます。
SEGVするところをgdbで確認したところ、
コード:
(gdb) run
Starting program: /home/tep/projects/atcoder/abc/065/a.out
During startup program terminated with signal SIGSEGV, Segmentation fault.
(gdb) quit
このように出ます。このような現象は、巨大配列を静的に確保しようとした時によく発生するような気がします。staticをつけて解決できる時もあるのですが、解決できないことのほうが多いです。何かご存じの方がいらっしゃったら、助言いただけるとありがたいです。
競技プログラミングを始めたばかりの初心者です。ある程度入力が大きくなってくると、[code]long long costs[1000000000]; [/code]のようなことがしたくなってくるのですが、頻繁にstartupルーチンの最中に落ちてしまいます。
以下は、プリムのアルゴリズムを書こうとした途中のコードです。
[code]
#include <iostream>
using namespace std;
#define MAXN 100000
#define min(a, b) ((a) < (b) ? (a) : (b))
#define abs(a) ((a) < 0 ? - (a) : (a))
#define BIGNUM 10000000000
int main(void)
{
int N;
static long x[MAXN];
static long y[MAXN];
static long d[MAXN][MAXN];
int flag[MAXN] = {0};
cin >> N;
for(int i=0; i<N; i++) {
cin >> x[i] >> y[i];
}
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
d[i][j] = min(abs(x[i]-x[j]), abs(y[i]-y[j]));
}
}
flag[0] = 1;
long long ans = 0;
for(int i=1; i<N; i++) {
long long mintemp=BIGNUM;
long long minindex;
for(int j=0; j<N; j++) {
if(flag[j] == 1) {
if(mintemp > d[i][j]) {
mintemp = d[i][j];
minindex = j;
}
ans += mintemp;
flag[minindex] = 1;
}
}
}
cout << ans << endl;
return 0;
}
[/code]
こちらを[code]g++ D.cpp -Wall -g[/code]のようにコンパイルし、実行したのですが、
[code]~/p/a/a/065 $ ./a.out
fish: “./a.out” terminated by signal SIGSEGV (Address boundary error)[/code]
このようにSEGVで落ちてしまいます。
SEGVするところをgdbで確認したところ、
[code]
(gdb) run
Starting program: /home/tep/projects/atcoder/abc/065/a.out
During startup program terminated with signal SIGSEGV, Segmentation fault.
(gdb) quit
[/code]
このように出ます。このような現象は、巨大配列を静的に確保しようとした時によく発生するような気がします。staticをつけて解決できる時もあるのですが、解決できないことのほうが多いです。何かご存じの方がいらっしゃったら、助言いただけるとありがたいです。