求助TLE on #10

P3806 【模板】点分治 1

Isshiki·Iroha @ 2024-02-28 21:43:06

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lll __int128
#define ull unsigned ll
#define ld long double 
#define db double
template<typename T>inline void read(T& x) {
    x=0;int f=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=~f+1;ch=getchar();}
    while (isdigit (ch)) {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    x*=f;
}
template <typename T,typename... Args> inline void read(T& x, Args&... args) {
    read(x);
    read(args...);
}
template<typename T>inline void write(T x) {
    static int buf[40],top=0;
    if(x<0)putchar('-'),x=~x+1;
    while(x)buf[++top]=x%10,x/=10;
    if(top==0)buf[++top]=0;
    while (top) putchar(buf[top--]^48);
    putchar(' ');
}
template <typename T,typename... Args> inline void write(T x, Args... args) {
    write(x);
    write(args...);
}
const int maxn=1e4+10;
int n,m;
int head[maxn],tot;
struct node{
    int v,w,nxt;
}kano[maxn<<1];
inline void add_kano(int u,int v,int w){
    kano[++tot]={v,w,head[u]};
    head[u]=tot;
}
int fsze[maxn],vis[maxn],msz[maxn],sze[maxn];
bool edis[100000005],ans[100000005];
int all,rt,tdis[maxn];
void getrt(int u,int fa){
    msz[u]=n+1;
    sze[u]=1;
    for(int i(head[u]);i;i=kano[i].nxt){
        int v=kano[i].v;
        if(vis[v]||fa==v)continue;
        getrt(v,u);
        sze[u]+=sze[v];
    }
    msz[u]=max(all-sze[u],sze[u]);
    if(msz[u]<msz[rt])rt=u;
}
int cnt,Tdis[maxn];
void getdis(int u,int fa){
    Tdis[++cnt]=tdis[u];
    for(int i(head[u]);i;i=kano[i].nxt){
        int v=kano[i].v;
        if(vis[v]||v==fa)continue;
        tdis[v]=tdis[u]+kano[i].w;
        getdis(v,u);
    }
}
vector<int>query;
int Q[maxn];
void fgetsze(int u,int fa){
    fsze[u]=1;
    for(int i(head[u]);i;i=kano[i].nxt){
        int v=kano[i].v;
        if(fa==v)continue;
        fgetsze(v,u);
        fsze[u]+=fsze[v];
    }
}
void getans(int u){
    tdis[u]=0;int qq=0;
    for(int i(head[u]);i;i=kano[i].nxt){
        int v=kano[i].v;
        if(vis[v])continue;
        cnt=0;tdis[v]=kano[i].w;getdis(v,u);
        for(int j(1);j<=cnt;++j){
            Q[++qq]=Tdis[j];
            for(int d:query){
                if(d>=Tdis[j])ans[d]|=edis[d-Tdis[j]];
            }
        }
        for(int j(1);j<=cnt;++j){
            edis[Tdis[j]]=1;
        }
    }
    for(int i(1);i<=qq;++i)edis[Q[i]]=0;
}
void solve(int u){
    vis[u]=edis[0]=1;
    getans(u);
    for(int i(head[u]);i;i=kano[i].nxt){
        int v=kano[i].v;
        if(vis[v])continue;
        msz[0]=n;
        all=sze[v];rt=0;
        getrt(v,u);solve(rt);
    }
}
int main(){
    read(n,m);
    for(int i(1),u,v,w;i<n;++i){
        read(u,v,w);
        add_kano(u,v,w);
        add_kano(v,u,w);
    }
    for(int i(1),k;i<=m;++i){
        read(k);
        query.emplace_back(k);
    }
    // fgetsze(1,0);
    all=n;msz[0]=n+1;
    getrt(1,0);
    solve(rt);
    for(int d:query){
        puts(ans[d]?"AYE":"NAY");
    }
    return 0;
}

我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了我真的红温了


|