点分治模板

[BZOJ1316]

由于之前板子写得太烂了,今天把它重新整理改进了一下

vis[] 表示每个点是否已经当过根,所以注意 dfs,findroot 函数的计算过程中是不会对 vis 进行修改的

修改时只需要考虑对 dfssolve 中的有关位置进行修改即可,其它部分基本不变

#include 
using namespace std;
#define int long long
#define foradj(p) for(pair pr:g[p])
#define unpii(q,w) int q=pr.first, w=pr.second;
const int N = 10005;

vector  > g[N];
int dis[N],siz[N],n,m,t1,t2,t3,k[N],ans[N],vis[N],sum,rt,rtval;
vector st,wl;
set s;

void findroot(int p,int ff)
{
    siz[p]=1;
    int mx=0;
    foradj(p)
    {
        unpii(q,w);
        if(!vis[q] && q!=ff)
        {
            findroot(q,p);
            siz[p]+=siz[q];
            mx=max(mx,siz[q]);
        }
    }
    mx=max(mx,sum-siz[p]);
    if(mx>n>>m;
    for(int i=1;i>t1>>t2>>t3;
        g[t1].push_back({t2,t3});
        g[t2].push_back({t1,t3});
    }
    for(int i=1;i<=m;i++)
    {
        cin>>k[i];
    }
    sum=n;
    rtval=1e18;
    findroot(1,0);
    solve(rt);
    for(int i=1;i<=m;i++)
    {
        if(ans[i] || !k[i]) cout<<"Yes"<

你可能感兴趣的:(点分治模板)