y总已经修正bug了,没事了,下面的内容是修正前写的,参考参考就完事了
这是y总代码中定义数组的顺序
typedef long long LL;
const int N = 1000010, M = N * 2;
int n;
int h[N], e[M], w[M], ne[M], idx;
int fu[N], fw[N], q[N];
int cir[N], ed[N], cnt;
LL s[N], d[N * 2], sum[N * 2];
bool st[N], ins[N];
LL ans;
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
如果我把q数组放到ans下面定义,就会 Segmentation Fault,不信大家可以试试,就像下面这样
typedef long long LL;
const int N = 1000010, M = N * 2;
int n;
int h[N], e[M], w[M], ne[M], idx;
int fu[N], fw[N];
int cir[N], ed[N], cnt;
LL s[N], d[N * 2], sum[N * 2];
bool st[N], ins[N];
LL ans;
int q[N];
我找了很久的原因,终于找到了。是因为在主函数中,这个单调队列的大小可以通过构造数据会超过100万,所以会越界。至于AC的代码为什么能过,我想大概是越界之后还是在我们定义的数组里面,C++定义的数组好像是连续存放的,你这个数组越界之后的下标可能访问到下一个数组里面去了。而第一种定义的方式,越界访问的别的数组又恰好对答案没影响。但是第二种直接越界了就会报错。。。。。
下面是我实验的结果,第38个数据,N=100万,但是tt的最大值是1178283

就离谱
q数组开到120万就能过了,确实离谱