boatherds 2s 64M by czy

求一颗树上距离为K的点对是否存在

输入数据

n,m

接下来n-1条边a,b,c描述a到b有一条长度为c的路径

接下来m行每行询问一个K

输出数据

对于每个K每行输出一个答案,存在输出“AYE”,否则输出”NYE”(不包含引号)

数据范围

对于30%的数据n<=100

对于60%的数据n<=1000,m<=50

对于100%的数据n<=10000,m<=100,c<=1000,K<=10000000


点分治。

但是每次询问会超时,所以需要离线。

就把K都存起来,每次询问的时候都for一遍K。

代码:

  1 // #pragma comment(linker,"/STACK:102400000,102400000")
  2 #include<cstdio>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<iostream>
  6 #include<algorithm>
  7 using namespace std;
  8
  9 const int N=10010;
 10 int n,m,sl,kl,tl,vl,len,first[N],mark[N],s[N],t[N],d[N],size[N],K[N],ans[N];//,v[N];
 11 bool v[10000010];
 12 struct node{
 13     int x,y,d,next;
 14 }a[2*N];
 15
 16 bool cmp(int x,int y){return x<y;}
 17
 18 void ins(int x,int y,int d)
 19 {
 20     a[++len].x=x;a[len].y=y;a[len].d=d;
 21     a[len].next=first[x];first[x]=len;
 22 }
 23
 24 void find_root(int x,int fa,int tot,int &root)
 25 {
 26     size[x]=1;
 27     bool bk=1;
 28     for(int i=first[x];i;i=a[i].next)
 29     {
 30         int y=a[i].y;
 31         if(y==fa || mark[y]) continue;
 32         find_root(y,x,tot,root);
 33         size[x]+=size[y];
 34         if(2*size[y]>tot) bk=0;
 35     }
 36     if(bk && 2*(tot-size[x])<=tot) root=x;
 37 }
 38
 39 void DFS(int x,int fa)
 40 {
 41     for(int i=1;i<=kl;i++)
 42     {
 43         if(K[i]>=d[x] && v[K[i]-d[x]]) ans[i]=1;
 44     }
 45     // if(ans==1) return ;
 46     t[++tl]=d[x];
 47     size[x]=1;
 48     for(int i=first[x];i;i=a[i].next)
 49     {
 50         int y=a[i].y;
 51         if(y==fa || mark[y]) continue;
 52         d[y]=d[x]+a[i].d;
 53         DFS(y,x);
 54         size[x]+=size[y];
 55     }
 56 }
 57
 58 void dfs(int x,int tot)
 59 {
 60     find_root(x,0,tot,x);
 61     v[0]=1;sl=0;//ssl=0;
 62     // s[++sl]=x;
 63     mark[x]=1;
 64     for(int i=first[x];i;i=a[i].next)
 65     {
 66         int y=a[i].y;
 67         if(mark[y]) continue;
 68         tl=0;d[y]=a[i].d;
 69         DFS(y,x);
 70         // if(ans==1) break;
 71         for(int j=1;j<=tl;j++) v[t[j]]=1,s[++sl]=t[j];
 72     }
 73     for(int i=1;i<=sl;i++) v[s[i]]=0;
 74     // if(ans==1) return ;
 75     for(int i=first[x];i;i=a[i].next)
 76     {
 77         int y=a[i].y;
 78         if(mark[y]) continue;
 79         dfs(y,size[y]);
 80     }
 81 }
 82
 83 int main()
 84 {
 85     // freopen("a.in","r",stdin);
 86     freopen("boatherds.in","r",stdin);
 87     freopen("boatherds.out","w",stdout);
 88     scanf("%d%d",&n,&kl);
 89     len=0;
 90     memset(v,0,sizeof(v));
 91     memset(first,0,sizeof(first));
 92     for(int i=1;i<n;i++)
 93     {
 94         int x,y,c;
 95         scanf("%d%d%d",&x,&y,&c);
 96         ins(x,y,c);
 97         ins(y,x,c);
 98     }
 99     for(int i=1;i<=kl;i++) scanf("%d",&K[i]);
100     memset(ans,0,sizeof(ans));
101     dfs(1,n);
102     for(int i=1;i<=kl;i++)
103     {
104         if(ans[i]) printf("AYE\n");
105         else printf("NAY\n");
106     }
107     return 0;
108 }

转载于:https://www.cnblogs.com/KonjakJuruo/p/6051259.html

【poj2114】点分治(离线)相关推荐

  1. codeforces gym-101741 Subsequence Sum Queries 分治+离线

    题目 这里写链接内容 题意 给出一个最长为200000200000200000数列 给出一堆最多为200000200000200000个询问区间,问从这些区间中取出一些数使得数字之和是m的倍数,有多少 ...

  2. CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)

    题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...

  3. 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)

    传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...

  4. Educational Codeforces Round 56 Editorial

    A.Dice Rolling 题意:Mishka 有一个六面的骰子,每面分别为 2 ~ 7,而且 Mishka 是欧皇,可以控制自己每次掷到的数字.Mishka 现在想掷若干次骰子,使得掷到的点数总和 ...

  5. ACM信息学竞赛算法总结

    基础知识 位运算 递推与递归 前缀与差分 二分 排序 倍增 贪心 尺取法 数据结构 栈与队列 : 单调栈 单调队列 双端队列 Hash: 字符串Hash 与Hash表 字符串处理: KMP算法,-- ...

  6. 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解

    题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...

  7. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  8. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  9. CDQ 分治算法模板

    CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #defin ...

最新文章

  1. poj 1815 Friendship 最小割 拆点 输出字典序
  2. 人工智能开发语言排行榜:不死Java,不朽C/C++,新贵Python
  3. 接口持续集成环境搭建
  4. [Python] sys.argv[] 用法
  5. Mybatis Plugin(拦截器)的开发
  6. go语言离线查看说明文档
  7. Angular 服务器端渲染的学习笔记(一)
  8. MYSQL 定时任务
  9. php 支付宝小程序授权登陆验签_星巴克“啡快”登陆支付宝小程序,让你“飞快”取到咖啡...
  10. tensorflow学习笔记一:安装调试
  11. smb文件共享_使用SMB文件共享作为存储替代方案
  12. 论文中的一些数学符号表示
  13. 解决vim中鼠标右键无法复制的问题
  14. mysql留存率除了存储过程_基于MySQL分析线上充值留存率
  15. html5 动态图表FineReport优化报表取数
  16. JPBC Element传输
  17. 彭聃龄普通心理学第5版笔记和课后习题答案
  18. android textview 字体边框,为TextView添加一个边框的几种办法
  19. mysql mpm_Zabbix和MPM监控MySQL
  20. 竞业限制是什么意思?

热门文章

  1. 青光眼-复内路粘小管成形术(ABiC)-转载
  2. cannot resolve symbol ‘springframework‘
  3. 无法定位程序输入点SetDefaultDllDirectories
  4. TCP/UDP 套接字总结
  5. Eclipse Validating减少不必要的验证
  6. android+4.2+mtp+在此设备上不支持+文件类型,Nexus 4无法通过MTP显示文件
  7. 报表怎样实现滚动的公告效果?
  8. vue tabs 动态组件
  9. 51NOD 1594:Gcd and Phi——题解
  10. ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机