竞赛讨论区 > 求助:为啥写挂了啊QAQ
头像
jshz2018_zhudafu
发布于 2019-11-06 21:47
+ 关注

求助:为啥写挂了啊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;
}

全部评论

(2) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐