95分,只有最后一个点WA,找不出原因,求助

P1600 [NOIP2016 提高组] 天天爱跑步

hhdddkk @ 2019-10-29 20:56:11

#include<bits/stdc++.h>
using namespace std;
int n,m,d[300005],fa[300005][25],lca[300005];
int cnt,ver[300005],nt[300005],hd[300005];
int w[300005],s[300005],t[300005];
int c[600010],ans[300005];
vector<int> a[300005];
int Read(){
    int num=0;
    char cc=getchar();
    while(cc<'0'||cc>'9') cc=getchar();
    while(cc>='0'&&cc<='9'){
        num=(num<<1)+(num<<3);
        num+=cc-'0';
        cc=getchar();
    }
    return num;
}
void Add(int u,int v){
    ver[++cnt]=v;
    nt[cnt]=hd[u];
    hd[u]=cnt;
}
void dfs1(int p,int f){
    d[p]=d[f]+1;
    fa[p][0]=f;
    for(int i=1;i<20;i++) fa[p][i]=fa[fa[p][i-1]][i-1];
    for(int i=hd[p];i;i=nt[i]){
        if(ver[i]==f) continue;
        dfs1(ver[i],p);
    }
}
int Find(int x,int y){
    if(d[x]<d[y]) swap(x,y);
    for(int i=19;i>=0;i--)
        if(d[fa[x][i]]>=d[y]) x=fa[x][i];
    if(x==y) return x;
    for(int i=19;i>=0;i--)
        if(fa[x][i]!=fa[y][i]){
            x=fa[x][i];
            y=fa[y][i];
        }
    return fa[x][0];
}
void dfs2(int p){
    int num=c[w[p]+d[p]];
    for(int i=0;i<a[p].size();i++){
        int x=a[p][i];
        if(x>0) c[x]++;
        if(x<0) c[-x]--;
    }
    for(int i=hd[p];i;i=nt[i]){
        if(ver[i]==fa[p][0]) continue;
        dfs2(ver[i]);
    }
    ans[p]=c[w[p]+d[p]]-num;
}
void dfs3(int p){
    int num=c[(n+1)+w[p]-d[p]];
    for(int i=0;i<a[p].size();i++){
        int x=a[p][i];
        if(x>0) c[x]++;
        if(x<0) c[-x]--;
    }
    for(int i=hd[p];i;i=nt[i]){
        if(ver[i]==fa[p][0]) continue;
        dfs3(ver[i]);
    }
    ans[p]=c[(n+1)+w[p]-d[p]]-num+ans[p];
}
int main(){
    n=Read();m=Read();
    for(int i=1;i<n;i++){
        int u,v;
        u=Read();v=Read();
        Add(u,v);Add(v,u);
    }
    for(int i=1;i<=n;i++) w[i]=Read();
    for(int i=1;i<=m;i++){
        s[i]=Read();t[i]=Read();
    }
    dfs1(1,0);
    for(int i=1;i<=m;i++) lca[i]=Find(s[i],t[i]);
    for(int i=1;i<=m;i++){
        a[s[i]].push_back(d[s[i]]);
        a[fa[lca[i]][0]].push_back(-d[s[i]]);
    }
    dfs2(1);
    memset(c,0,sizeof(c));
    for(int i=0;i<=n;i++) a[i].clear();
    for(int i=1;i<=m;i++){
        int len=d[s[i]]-2*d[lca[i]]+(n+1);
        a[t[i]].push_back(len);
        a[lca[i]].push_back(-len);
    }
    dfs3(1);
    for(int i=1;i<=n;i++) printf("%d ",ans[i]);
    return 0;
}

by hhdddkk @ 2019-10-29 20:59:16

是指出题人给的最后一个点(299998)的数据,测试里是第13个点


by TLE自动机 @ 2019-11-07 13:48:45

@hhdddkk wdm数组真就卡着开啊


by hhdddkk @ 2019-11-08 20:39:03

@TLE自动机 啊,确实,是存边的数组开小了,居然犯了这种低级错误,不过这为什么是WA而不是RE呢


by TLE自动机 @ 2019-11-09 08:37:48

@hhdddkk 越界越一点好像会导致访问到其他申请过的内存吧


|