这题点分治好卡常啊,#7#9tle麻烦问一下原因

P3806 【模板】点分治 1

ignited @ 2021-09-07 15:27:31

#include<bits/stdc++.h>
#define MAXN 10010
#define MAXM 10000010
using namespace std;

struct edge
{
    int to,val;
};

int n,m,sum,root,tot,size[MAXN],dp[MAXN],vis[MAXN],dis[MAXN],rev[MAXN],query[MAXN],d[MAXN];
bool pd[MAXM],bin[MAXM];
vector<edge> g[MAXN];

inline void getroot(int u,int f)
{
    dp[u]=0,size[u]=1;
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i].to;
        if(v==f||vis[v]) continue;
        getroot(v,u);
        size[u]+=size[v];
        dp[u]=max(dp[u],size[v]);
    }
    dp[u]=max(dp[u],sum-size[u]);
    if(dp[u]<dp[root]) root=u;
}

inline void getdis(int u,int f)
{
    rev[++tot]=dis[u];
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i].to;
        if(vis[v]||v==f) continue;
        dis[v]=dis[u]+g[u][i].val;
        getdis(v,u);
    }
}

inline void solve(int u)
{

    int c=0;
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i].to;
        if(vis[v]) continue;
        dis[v]=g[u][i].val,tot=0;
        getdis(v,u);
        for(int j=1;j<=tot;j++) 
        for(int k=1;k<=m;k++) 
            if(query[k]>=rev[j]) bin[query[k]]|=pd[query[k]-rev[j]]; 
        for(int j=1;j<=tot;j++) if(rev[j]<=10000000) d[++c]=rev[j],pd[rev[j]]=1;
    }
    for(int i=1;i<=c;i++) pd[d[i]]=0;
}

inline void divid(int u)
{
    vis[u]=pd[0]=1;
    solve(u);
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i].to;
        if(vis[v]) continue;
        dp[0]=n,sum=size[v],root=0;
        getroot(v,u);
        divid(v);
    }
}

int main()
{
    cin>>n>>m;
    dp[0]=n;root=0;
    for(int i=1;i<n;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        g[u].push_back((edge){v,w});
        g[v].push_back((edge){u,w});
    }
    for(int i=1;i<=m;i++) scanf("%d",&query[i]);
    getroot(1,0);
    divid(root);
    for(int i=1;i<=m;i++)
    if(bin[query[i]]) puts("AYE");
    else puts("NAY");
    return 0;
} 

是STL太卡吗


by dottle @ 2021-09-07 15:32:40

@ignited 你淀粉质递归应该走 root 而不是 v。


by ignited @ 2021-09-07 15:37:01

@dottle 感谢,差错一直查不出来


by HugeWide @ 2021-09-07 20:02:32

这递归走错了自己根本测不出来(因为它答案不改变,但是复杂度爆炸


|