求助,WA#4,70分

P3806 【模板】点分治 1

Castiel_Cass @ 2020-02-08 09:04:43

描述如标题,谢谢您的帮助

#include<bits/stdc++.h>
#define A 10000000
#define N 10001
using namespace std;
bool ans[A|1],query[A|1],poin[N];
struct edge{int to,v,next;}e[N<<1];
int head[N],tot,siz[N],dis[N];
int ques[N],q[N],rem[N],fam[N];
void add(int fr,int to,int v)
{
    e[++tot].to=to;
    e[tot].v=v;
    e[tot].next=head[fr];
    head[fr]=tot;
}
void dfssize(int rt,int fa)
{
    siz[rt]=1;
    for(int i=head[rt];i;i=e[i].next)if(!poin[e[i].to]&&e[i].to!=fa)
        dfssize(e[i].to,rt),
        siz[rt]+=siz[e[i].to];
}
int getroot(int rt)
{
    dfssize(rt,0);
    int now=rt;
    while(1)
    {
        int i;
        for(i=head[now];i;i=e[i].next)
            if(!poin[e[i].to]&&siz[e[i].to]<siz[now]&&siz[e[i].to]>=siz[rt]>>1)
                //if(now==1)
                {
                    now=e[i].to;
                    break;
                }
        if(i==0)break;
    }
    return now;
}
void dfsdis(int rt,int fa,int s)
{
    rem[++rem[0]]=dis[rt];
    fam[rem[0]]=s;
    for(int i=head[rt];i;i=e[i].next)
        if(e[i].to!=fa&&!poin[e[i].to])
            dis[e[i].to]=dis[rt]+e[i].v,
            dfsdis(e[i].to,rt,s);
}
int clear[N];
void getans(int rt)
{
    ans[0]=1;
    dis[rt]=0;rem[0]=0;
    for(int i=head[rt];i;i=e[i].next)if(!poin[e[i].to])
        dis[e[i].to]=dis[rt]+e[i].v,
        dfsdis(e[i].to,rt,i);
    for(int i=rem[0];i;i--)
    {
        if(fam[i]!=fam[i-1])
        {
            for(;q[0];q[0]--)
                ans[q[q[0]]]=1;
        }
        for(int l=ques[0];l;l--)
            if(ques[l]-rem[i]>=0&&ans[ques[l]-rem[i]]==1)query[l]=1;
        q[++q[0]]=rem[i];
    }
    q[0]=0;
    for(int i=rem[0];i;i--)ans[rem[i]]=0;
}
void fz(int rt)
{
    rt=getroot(rt);
    getans(rt);
    poin[rt]=1;
    for(int i=head[rt];i;i=e[i].next)
        if(!poin[e[i].to])
            fz(e[i].to);
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++)
    {
        int a,b,v;
        scanf("%d%d%d",&a,&b,&v);
        add(a,b,v);
        add(b,a,v);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&ques[i]);
    }
    ques[0]=m;
    fz(1);
    for(int i=1;i<=m;i++)
    {
        if(query[i]==1)printf("AYE\n");
        else printf("NAY\n");
    }
    return 0;
}

|