求助:为啥写挂了啊QAQ

思路是按照给的题解写的

#include
#define ll long long
using namespace std;
struct Node{
    int Dep,Id;
}St[100010][20];
bool operator <(Node a,Node b){
    return a.Dep<b.Dep;
} 
int L,Lca,Now,p,q,Ans,x,Cnt,n,m,y,z,Num,Tot,Reduce;
int Sum[10010],Head[10010],Next[10010],To[10010],Point[10010],Edge[10010],Fa[10010],Dep[10010],First[10010],From[10010];
template
inline int Read(T &x) {
    x=0;
    ll f=1;
    char c=getchar();
    while(!isdigit(c)) {
        if(c=='-') {
            f=-f;
        }
        c=getchar();
    }
    while(isdigit(c)) {
        x=x*10+c-'0';
        c=getchar();
    }
    x*=f;
    if(c=='\n') {
        return 1;
    } else {
        return 0;
    }
}
void Write(int x) {
    if(x<0) {
        x=-x;
        putchar('-');
    }
    if(x>9) {
        Write(x/10);
    }
    putchar(x%10+'0');
}
inline void Add(int x,int y){
    To[++Cnt]=y;
    Next[Cnt]=Head[x];
    Head[x]=Cnt;
    To[++Cnt]=x;
    Next[Cnt]=Head[y];
    Head[y]=Cnt;
}
inline void Dfs1(int x,int f){
    int y;
    Fa[x]=f;
    Dep[x]=Dep[f]+1;
    St[++Num][0].Dep=Dep[x];
    St[Num][0].Id=x;
    First[x]=Num;
    for(int i=Head[x];i;i=Next[i]){
        y=To[i];
        if(y==f){
            continue;
        }
        From[y]=i;
        Dfs1(y,x);
        St[++Num][0].Dep=Dep[x];
        St[Num][0].Id=x;
    }
}
inline int Query(int x,int y){
    Node Res;
    if(First[x]>First[y]){
        swap(x,y);
    }
    int k=log2(First[y]-First[x]+1);
    Res=min(St[First[x]][k],St[First[y]-(1<<k)][k]);
    return Res.Id;
}
inline int Dfs2(int x,int f,int Dep){
    int y,z,Sum;
    if(Dep==p){
        Point[Query(x,Now)]++;
        return 1;
    }
    for(int i=Head[x];i;i=Next[i]){
        y=To[i];
        if(To[i]==f){
            continue;
        }
        z=Dfs2(y,x,Dep+1);
        if(z){
            Edge[y]+=z;
            Edge[y^1]+=z;
            Sum+=z;
        }
    }
    return Sum;
}
inline void Dfs3(int x,int f){
    int y;
    Sum[x]=Point[x]+Sum[f];
    for(int i=Head[x];i;i=Next[i]){
        y=To[i];
        if(y==f){
            continue;
        }
        Dfs3(y,x);
    }
}
int main(){
    Cnt=1;
    Read(n);
    Read(p);
    Read(q);
    for(int i=1;i<n;i++){
        Read(x);
        Read(y);
        Add(x,y);
    }
    Dep[0]=0;
    Dfs1(1,0);
    for(int i=1;i<=19;i++){
        for(int j=1;j+(1<<i)-1<=n;j++){
            St[j][i]=min(St[j][i-1],St[j+(1<<(i-1))][i-1]);
        }
    }
    for(int i=1;i<=n;i++){
        Now=i;
        Dfs2(i,0,0);
    }
    for(int i=1;i<=n;i++){
        Point[i]/=2;
        Tot+=Point[i];
    }
    for(int i=1;i<=Cnt;i++){
        Edge[i]/=2;
    }
    Dfs3(1,0);
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
            Lca=Query(i,j);
            L=Dep[i]+Dep[j]-Dep[Lca]*2;
            if(L!=q){
                continue;
            }
            Reduce=Sum[i]+Sum[j]-Sum[Lca]*2+Point[Lca]+Edge[From[Lca]];
            Ans+=(Tot-Reduce);
        }
    }
    Write(Ans);
    return 0;
}
全部评论
#include<bits/stdc++.h> using namespace std; int main(){     int rp;     while(rp>-1111111111111){         rp--;     }     cout<<"我并不知道你错哪了"<<endl;     return 0; }
点赞 回复
分享
发布于 2019-11-07 14:11
之前代码好像粘贴的时候挂了,现在重发一下 #include<bits/stdc++.h> #define ll long long using namespace std; struct Node{ int Dep,Id; }St[100010][20]; bool operator <(Node a,Node b){ return a.Dep<b.Dep; } int L,Lca,Now,p,q,Ans,x,Cnt,n,m,y,z,Num,Tot,Reduce; int Sum[10010],Head[10010],Next[10010],To[10010],Point[10010],Edge[10010],Fa[10010],Dep[10010],First[10010],From[10010]; template<typename T> inline int Read(T &x) { x=0; ll f=1; char c=getchar(); while(!isdigit(c)) { if(c=='-') { f=-f; } c=getchar(); } while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } x*=f; if(c=='\n') { return 1; } else { return 0; } } void Write(int x) { if(x<0) { x=-x; putchar('-'); } if(x>9) { Write(x/10); } putchar(x%10+'0'); } inline void Add(int x,int y){ To[++Cnt]=y; Next[Cnt]=Head[x]; Head[x]=Cnt; To[++Cnt]=x; Next[Cnt]=Head[y]; Head[y]=Cnt; } inline void Dfs1(int x,int f){ int y; Fa[x]=f; Dep[x]=Dep[f]+1; St[++Num][0].Dep=Dep[x]; St[Num][0].Id=x; First[x]=Num; for(int i=Head[x];i;i=Next[i]){ y=To[i]; if(y==f){ continue; } From[y]=i; Dfs1(y,x); St[++Num][0].Dep=Dep[x]; St[Num][0].Id=x; } } inline int Query(int x,int y){ Node Res; if(First[x]>First[y]){ swap(x,y); } int k=log2(First[y]-First[x]+1); Res=min(St[First[x]][k],St[First[y]-(1<<k)][k]); return Res.Id; } inline int Dfs2(int x,int f,int Dep){ int y,z,Sum; if(Dep==p){ Point[Query(x,Now)]++; return 1; } for(int i=Head[x];i;i=Next[i]){ y=To[i]; if(To[i]==f){ continue; } z=Dfs2(y,x,Dep+1); if(z){ Edge[y]+=z; Edge[y^1]+=z; Sum+=z; } } return Sum; } inline void Dfs3(int x,int f){ int y; Sum[x]=Point[x]+Sum[f]; for(int i=Head[x];i;i=Next[i]){ y=To[i]; if(y==f){ continue; } Dfs3(y,x); } } int main(){ Cnt=1; Read(n); Read(p); Read(q); for(int i=1;i<n;i++){ Read(x); Read(y); Add(x,y); } Dep[0]=0; Dfs1(1,0); for(int i=1;i<=19;i++){ for(int j=1;j+(1<<i)-1<=n;j++){ St[j][i]=min(St[j][i-1],St[j+(1<<(i-1))][i-1]); } } for(int i=1;i<=n;i++){ Now=i; Dfs2(i,0,0); } for(int i=1;i<=n;i++){ Point[i]/=2; Tot+=Point[i]; } for(int i=1;i<=Cnt;i++){ Edge[i]/=2; } Dfs3(1,0); for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ Lca=Query(i,j); L=Dep[i]+Dep[j]-Dep[Lca]*2; if(L!=q){ continue; } Reduce=Sum[i]+Sum[j]-Sum[Lca]*2+Point[Lca]+Edge[From[Lca]]; Ans+=(Tot-Reduce); } } Write(Ans); return 0; }
点赞 回复
分享
发布于 2019-11-07 17:11
滴滴
校招火热招聘中
官网直投

相关推荐

头像
04-26 15:00
已编辑
算法工程师
点赞 评论 收藏
转发
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务