代码一直输出0

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

xiuzhiyuan @ 2022-09-25 13:50:21

求助:这段代码一直输出0

哪位大神能帮忙看看?

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
const int N=300005,M=600005,T=20;
int n,m;
int to[M],ne[M],h[N],idx=1;
int w[N],ans[N];
queue<int> que;
bool vis[N];
int depth[N],f[N][T];
vector<PII> op1[N<<1],op2[N<<1];
int d1[N<<1],d2[N<<1];
inline void add(int a,int b){
    to[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
inline void setst(){
    vis[1]=1;
    depth[1]=1;
    que.push(1);
    while(que.size()){
        int x=que.front();
        que.pop();
        for(int i=h[x];i;i=ne[i])
            if(!vis[to[i]]){
                vis[to[i]]=1;
                depth[to[i]]=depth[x]+1;
                f[to[i]][0]=x;
                for(int i=1;i<T;i++)
                    f[to[i]][i]=f[f[to[i]][i-1]][i-1];
                que.push(to[i]);
            }
    }
}
inline int lca(int a,int b){
    if(depth[a]<depth[b])
        swap(a,b);
    for(int i=T-1;~i;i--)
        if(depth[f[a][i]]>=depth[b])
            a=f[a][i];
    if(a==b)
        return a;
    for(int i=T-1;~i;i--)
        if(f[a][i]!=f[b][i]){
            a=f[a][i];
            b=f[b][i];
        }
    return f[a][0];
}
inline void update(int s,int t){    //在差分里加操作
    int p=lca(s,t);
    op1[s].push_back({depth[s],1});
    op1[f[p][0]].push_back({depth[s],-1});
    op2[t].push_back({depth[s]-(depth[p]<<1)+n,1});
    op2[p].push_back({depth[s]-(depth[p]<<1)+n,-1});
}
void dfs(int x,int from){
    int v1=w[x]+depth[x],v2=w[x]-depth[x]+n;
    int res1=d1[v1],res2=d2[v2];
    for(int i=h[x];i;i=ne[i])
        if(to[i]!=from)
            dfs(to[i],x);
    for(int i=0;i<op1[x].size();i++)
        d1[op1[x][i].first]+=op1[x][i].second;
    for(int i=0;i<op2[x].size();i++)
        d2[op2[x][i].first]+=op2[x][i].second;
    ans[x]=d1[v1]-res1+d2[v2]-res2;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    for(int i=1;i<=n;i++)
        scanf("%d",&w[i]);
    setst();
    for(int i=0;i<m;i++){
        int s,t;
        scanf("%d%d",&s,&t);
    }
    dfs(1,0);
    for(int i=1;i<=n;i++)
        printf("%d ",ans[i]);
    return 0;
}

by Donner @ 2022-11-26 13:56:31

@ACWING_xiuzhiyuan 是用DEV-C++吗?

看一下Complier

是个好东西

据我看Complier里面显示有13个错误

分别在 25,30,32,53 2个,54 2个,55 2个,56 2个。

剩下两个的Message:

1.In function 'void setst()'

2.In function 'void update(int,int)'

本人是个小6蒟蒻,所以判断的不是特别清楚。

最好找其他dalao们求助


by xiuzhiyuan @ 2022-11-28 12:23:29

@LUSIYUAN_GASTER 感谢


|