门芯袜子刚学01 Ims,求助淀粉质TLE on #17
查看原帖
门芯袜子刚学01 Ims,求助淀粉质TLE on #17
891956
TempestMiku楼主2023/9/2 20:58
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Testify{
    inline int read(){
        int f(1),x(0);
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
        return f*x;
    }
    inline void Write(int x){
        if(x>9) Write(x/10);
        putchar(x%10+48);
    }
    inline void write(int x){
        if(x<0) putchar('-'),x=-x;
        Write(x);
        putchar('\n');
    }
}
using namespace Testify;
int n,k;
const int N=50005;
int head[N],nxt[N<<1],to[N<<1],val[N<<1],tot(0);
inline void add(int x,int y){
    to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
int SATELLITE(0);
int root,sum;
bool vis[N];
int siz[N],maxn[N];
inline void getroot(int now,int fa){
    siz[now]=1;
    for(register int i=head[now];i;i=nxt[i]){
        int y=to[i];
        if(y==fa||vis[y]) continue;
        getroot(y,now);
        siz[now]+=siz[y];
        maxn[now]=max(maxn[now],siz[y]);
    }
    maxn[now]=max(maxn[now],sum-siz[now]);
    if(maxn[now]<maxn[root]){
        root=now;
    }
}
int beyond[N],past[N];
inline void getdis(int now,int fa,int dis){
    if(dis>k) return;
        beyond[dis]++;
    for(register int i=head[now];i;i=nxt[i]){
        int y=to[i];
        if(y==fa||vis[y]) continue;
        getdis(y,now,dis+1);
    }
}
inline void calc(int now){
    for(register int i=head[now];i;i=nxt[i]){
        int y=to[i];
        if(vis[y]) continue;
        getdis(y,now,1);
        SATELLITE+=beyond[k];
        for(register int i=1;i<k;i++){
            SATELLITE+=(beyond[i]*past[k-i]);
        }
        for(register int i=1;i<=k;i++){
            past[i]+=beyond[i];
            beyond[i]=0;
        }
    }
    for(register int i=1;i<=k;i++){
        past[i]=0;
    }
}
inline void solve(int now){
    vis[now]=true;
    calc(now);
    for(register int i=head[now];i;i=nxt[i]){
        int y=to[i];
        if(vis[y]) continue;
        maxn[root=0]=LONG_LONG_MAX;
        sum=siz[y];
        getroot(y,0);
        solve(root);
    }
}
signed main(void){
    n=read(),k=read();
    for(register int i=1;i<n;i++){
        register int asd=read(),jkl=read();
        add(asd,jkl),add(jkl,asd);
    }
    maxn[root=0]=LONG_LONG_MAX;
    sum=n;
    getroot(1,0);
    solve(root);
    write(SATELLITE);
    return 0;
}

感觉是calc的问题,但是不知道怎么改,求助呜呜呜呜呜

2023/9/2 20:58
加载中...