桶做法,#7 不是 TLE 就是 RE 帮忙卡一下

P3806 【模板】点分治 1

_saltFish_ @ 2022-09-03 13:59:27

卡了好久了,就是没法过,qwq。

求大佬帮忙卡一下。

#include<iostream>
using namespace std;
const int N(1e5+5);
int n,m;
int h[N],to[N<<1],nxt[N<<1],tot,val[N<<1];
inline void add(int x,int y,int w){
    nxt[++tot]=h[x],to[h[x]=tot]=y,val[tot]=w;
    nxt[++tot]=h[y],to[h[y]=tot]=x,val[tot]=w;
}
int root,siz[N],dp[N]={0x7fffffff};
int sum,stk[N],top,ans[200000005];
bool vis[N];
void getroot(int u,int f){
    siz[u]=1;dp[u]=0;
    for(int i=h[u];i;i=nxt[i]){
        int v=to[i];
        if(vis[v]||v==f) continue;
        getroot(v,u);
        siz[u]+=siz[v];
        dp[u]=max(dp[u],siz[v]);
    }
    dp[u]=max(dp[u],sum-siz[u]);
    if(dp[u]<dp[root]) root=u;
}
void getdis(int u,int f,int dis){
    stk[++top]=dis;
    for(int i=h[u];i;i=nxt[i]){
        int v=to[i];
        if(vis[v]||v==f) continue;
        getdis(v,u,dis+val[i]);
    }
}
void solve(int rt,int dis,int op){
    top=0;
    getdis(rt,0,dis);
    for(int i=1;i<=top;i++)
        for(int j=i+1;j<=top;j++)
            ans[stk[i]+stk[j]]+=op;
}
void divide(int u){
    vis[u]=1;
    solve(u,0,1);
    for(int i=h[u];i;i=nxt[i]){
        int v=to[i];
        if(vis[v]) continue;
        solve(v,val[i],-1);
        root=0;sum=siz[u];
        getroot(v,u);
        divide(root);
    }
}
int main(){
    #ifdef ytxy
    freopen("in.txt","r",stdin);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<n;i++){
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
    }
    root=0;sum=n;
    getroot(1,0);divide(root);
    while(m--){
        int k;
        cin>>k;
        cout<<((ans[k]>0)?"AYE":"NAY")<<'\n';
    }
}

by gyfydkf @ 2022-10-21 14:40:23

好像这个数据出了就是卡桶的....


|