P3806 【模板】点分治1

题面

https://www.luogu.org/problem/P3806

题解

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#define p rem[0]
using namespace std;
const int maxn=10500;
const int inf=10000000;
int n,m;
vector<int> to[maxn],len[maxn];
int tot,head[maxn];
int maxp[maxn],siz[maxn],dis[maxn],rem[maxn];
int vis[maxn],test[inf],judge[inf],q[maxn];
int query[1010];
int sum,root,ans;

void dfs(int now,int ff) {
  siz[now]=1; maxp[now]=0;
  int i,l=to[now].size();
  for (i=0;i<l;i++) if (to[now][i]!=ff && !vis[to[now][i]]) {
    dfs(to[now][i],now);
    siz[now]+=siz[to[now][i]];
    maxp[now]=max(maxp[now],siz[to[now][i]]);
  }
  maxp[now]=max(maxp[now],sum-siz[now]);
  if (maxp[now]<maxp[root]) root=now;
}

void dfs2(int now,int ff) {
  rem[++p]=dis[now];
  int i,l=to[now].size();
  for (i=0;i<l;i++) if (to[now][i]!=ff && !vis[to[now][i]]) {
    dis[to[now][i]]=dis[now]+len[now][i];
    dfs2(to[now][i],now);
  }
}

void calc(int now) {
  int pp=0,i,j,k,l=to[now].size();
  for (i=0;i<l;i++) if (!vis[to[now][i]]) {
    p=0; 
    dis[to[now][i]]=len[now][i];
    dfs2(to[now][i],now);
    for (j=1;j<=p;j++) 
      for (k=1;k<=m;k++) if (query[k]>=rem[j]) test[k]|=judge[query[k]-rem[j]];
    for (j=1;j<=p;j++) q[++pp]=rem[j],judge[rem[j]]=1;
  }
  for (i=1;i<=pp;i++) judge[q[i]]=false;
}

void solve(int now) {
  int i,l=to[now].size();
  vis[now]=judge[0]=1; calc(now);
  for (i=0;i<l;i++) if (!vis[to[now][i]]) {
    sum=siz[to[now][i]];
    maxp[root=0]=inf;
    dfs(to[now][i],0); solve(root);
  }
}

int main() {
  int i,u,v,d;
  scanf("%d %d",&n,&m);
  for (i=1;i<n;i++) {
    scanf("%d %d %d",&u,&v,&d);
    to[u].push_back(v); len[u].push_back(d);
    to[v].push_back(u); len[v].push_back(d);
  }
  for (i=1;i<=m;i++) scanf("%d",&query[i]);
  maxp[root=0]=sum=n;
  dfs(1,0);
  solve(root);
  for (i=1;i<=m;i++) {
    if (test[i]) puts("AYE"); else puts("NAY");
  }
  return 0;
}

 

posted @ 2019-08-28 23:54  HellPix  阅读(136)  评论(0编辑  收藏  举报