在UOJ能AC的代码为什么会RE?

代码如下

#include<cstdio>
const int N=300005;
int n,m,s,t,ed,ED,w[N],c[N],g[N],G[2][2][N],v[N<<1],V[N<<2],NXT[N<<2],nxt[N<<1],sz[N],f[N],son[N],d[N],top[N],sum[2][N<<1];
void read(int &x){
    char c;
    while((c=getchar())<'0' || c>'9');
    x=c-'0';
    while((c=getchar())>='0' && c<='9') x=x*10+c-'0';
}
void add(int x,int y){
    v[++ed]=y;
    nxt[ed]=g[x];
    g[x]=ed;
}
void ADD(int &x,int y){
    V[++ED]=y;
    NXT[ED]=x;
    x=ED;
}
void dfs(int x){
    sz[x]=1;
    for(int i=g[x];i;i=nxt[i]) if(v[i]!=f[x]){
        f[v[i]]=x;d[v[i]]=d[x]+1;
        dfs(v[i]);
        sz[x]+=sz[v[i]];
        if(sz[v[i]]>sz[son[x]]) son[x]=v[i];
    }
}
void dfs2(int x,int y){
    top[x]=y;
    if(son[x]) dfs2(son[x],y);
    for(int i=g[x];i;i=nxt[i]) if(v[i]!=f[x] && v[i]!=son[x]) dfs2(v[i],v[i]);
}
void dfs3(int x){
    c[x]-=sum[0][w[x]+d[x]]+sum[1][w[x]-d[x]+N];
    for(int i=g[x];i;i=nxt[i]) if(v[i]!=f[x]) dfs3(v[i]);
    for(int i=G[0][0][x];i;i=NXT[i]) sum[0][V[i]]++;
    for(int i=G[0][1][x];i;i=NXT[i]) sum[0][V[i]]--;
    for(int i=G[1][0][x];i;i=NXT[i]) sum[1][V[i]+N]++;
    for(int i=G[1][1][x];i;i=NXT[i]) sum[1][V[i]+N]--;
    c[x]+=sum[0][w[x]+d[x]]+sum[1][w[x]-d[x]+N];
}
int lca(int x,int y){
    for(;top[x]!=top[y];x=f[top[x]]) if(d[top[x]]<d[top[y]]){int z=x;x=y;y=z;}
    return d[x]<d[y]?x:y;
}
int main(){
    read(n),read(m);
    for(int i=1;i<n;i++){
        read(s),read(t);
        add(s,t),add(t,s);
    }
    dfs(1),dfs2(1,1);
    for(int i=1;i<=n;i++) read(w[i]);
    while(m--){
        read(s),read(t);
        int fa=lca(s,t);
        ADD(G[0][0][s],d[s]),ADD(G[0][1][f[fa]],d[s]);
        ADD(G[1][0][t],d[s]-2*d[fa]),ADD(G[1][1][fa],d[s]-2*d[fa]);
    }
    dfs3(1);
    for(int i=1;i<n;i++) printf("%d ",c[i]);
    printf("%d",c[n]);
    return 0;
}

我真的努力加代码区块……但就是不行啊…………

1 条评论

  • @ 2017-03-05 20:47:40

    试试在"代码如下"后加一个空行?
    Vijos评测时的栈空间为1MB,不同于UOJ的8MB,可能导致RE。
    下面是一个扩大栈空间的黑科技:
    在程序的开头添加extern int main2(void) __asm__ ("_main2");
    在程序的结尾添加

    int main() {
        int size = 8 << 20;  // 8Mb
        char *p = (char *)malloc(size) + size;
        __asm__ __volatile__(
            "movl  %0, %%esp\n"
            "pushl $_exit\n"
            "jmp _main2\n"
            :: "r"(p));
    }
    

    并将原来的main函数更名为main2
    233

    • @ 2017-03-10 19:34:34

      按你说的做,果真通过了呢 :)

    • @ 2017-03-12 21:18:03

      似乎UOJ评测时的栈空间也不是8MB吧
      UOJ帮助里的第四点有说:

      没错就是这样!除非是特殊情况,UOJ测评程序时的栈大小与该题的空间限制是相等的!

      所以在UOJ上从来不需要担心爆栈的问题
      (什么时候vijos也这样就好了

    • @ 2017-03-12 21:26:35

      @LCF: (twd2的看法已经在截图里表明了

    • @ 2017-03-12 21:37:19

      @LCF: twd2的看法已经在截图里表明了

    • @ 2017-03-13 14:15:41

      @twd2: 好吧……

  • 1

信息

ID
2004
难度
8
分类
(无)
标签
递交数
1681
已通过
154
通过率
9%
被复制
16
上传者