首页 > 其他 > 详细

P3806 【模板】点分治1

时间:2019-08-29 01:32:06      阅读:113      评论:0      收藏:0      [点我收藏+]

题面

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;
}

 

P3806 【模板】点分治1

原文:https://www.cnblogs.com/shxnb666/p/11427322.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!