zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Div高度百分比
    字典树模板题 POJ 2503
    POJ 2828
    POJ 2186
    HDU 3397 双lazy标记的问题
    HDU 3911 区间合并求最大长度的问题
    CodeForces 444C 节点更新求变化值的和
    POJ 3667 线段树的区间合并简单问题
    HDU 4578 线段树复杂题
    UVAlive 3211 Now or Later
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11427322.html
Copyright © 2011-2022 走看看