询问树上是否存在距离为k[i]的点对

直接点分治把所有距离预处理出来,然后O(1)回答即可

Code

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define N 10010
  4. using namespace std;
  5.  
  6. const int mx=N*1000;
  7. struct info{int to,nex,w;}e[N<<1];
  8. int n,m,tot,head[N],Ans[mx],sz[N],rt,d[N],sum,f[N];
  9. bool vis[N];
  10.  
  11. void Link(int u,int v,int w){
  12. e[++tot].to=v,e[tot].w=w,e[tot].nex=head[u];head[u]=tot;
  13. }
  14.  
  15. inline int read(){
  16. int x=0,f=1;char ch=getchar();
  17. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  18. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  19. return x*f;
  20. }
  21.  
  22. void getrt(int u,int fa){
  23. sz[u]=1,f[u]=0;
  24. for(int i=head[u];i;i=e[i].nex){
  25. int v=e[i].to;
  26. if(v==fa||vis[v]) continue;
  27. getrt(v,u);
  28. sz[u]+=sz[v];
  29. f[u]=max(f[u],sz[v]);
  30. }
  31. f[u]=max(f[u],sum-sz[u]);
  32. if(f[rt]>f[u]) rt=u;
  33. }
  34.  
  35. void getdep(int u,int fa,int dep){
  36. d[++d[0]]=dep;
  37. for(int i=head[u];i;i=e[i].nex){
  38. int v=e[i].to;
  39. if(v==fa||vis[v]) continue;
  40. getdep(v,u,dep+e[i].w);
  41. }
  42. }
  43.  
  44. void calc(int u,int f,int pre){
  45. d[0]=0;
  46. getdep(u,0,0);
  47. for(int i=1;i<=d[0];++i)
  48. for(int j=i+1;j<=d[0];++j)
  49. if(f&&d[i]+d[j]<=mx) ++Ans[d[i]+d[j]];
  50. else if(d[i]+d[j]+pre<=mx) --Ans[d[i]+d[j]+pre];
  51. }
  52.  
  53. void solve(int u){
  54. calc(u,1,0);
  55. vis[u]=1;
  56. for(int i=head[u];i;i=e[i].nex){
  57. int v=e[i].to;
  58. if(vis[v]) continue;
  59. calc(v,0,e[i].w*2);
  60. sum=sz[v];
  61. getrt(v,rt=0);
  62. solve(rt);
  63. }
  64. }
  65.  
  66. int main(){
  67. n=read(),m=read();
  68. for(int i=1;i<n;++i){
  69. int u=read(),v=read(),w=read();
  70. Link(u,v,w),Link(v,u,w);
  71. }
  72. sum=n,f[0]=1e9;
  73. getrt(1,0);
  74. solve(rt);
  75. while(m--){
  76. int x=read();
  77. puts(Ans[x]?"AYE":"NAY");
  78. }
  79. return 0;
  80. }

[Luogu3806]点分治的更多相关文章

  1. 【Luogu3806】点分治(点分治)

    [Luogu3806]点分治(点分治) 题面 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行 ...

  2. [luogu3806]【模板】点分治1

    description 求树上长度为\(k\)的路径是否存在. data range \[n\le 10000,k\le 10000000\] solution 点分治复习... 使用普通的点分治枚举 ...

  3. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  4. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  5. [poj1741][tree] (树/点分治)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  6. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  7. BZOJ 3262 陌上花开 ——CDQ分治

    [题目分析] 多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间. 然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可. 挺有套路的一种算法. 时间的抽象很巧妙. 同种 ...

  8. BZOJ 1176 [Balkan2007]Mokia ——CDQ分治

    [题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...

  9. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

随机推荐

  1. Python列表类型及常用操作

    Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...

  2. 微信小程序电商实战-入门篇

    小程序开发工具有新版本更新啦!开发体验更好了,详情可以查看微信公众平台-小程序https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.h ...

  3. 零基础逆向工程35_Win32_09_临界区_CRITICAL_SECTION结构

    1 引入 为什么会存在临界区这中机制呢?是为多线程同时访问全局变量而引入的.也就是上一篇帖子的末尾流出的问题程序的解决办法. 看懂了上面的,那么我们再罗嗦总结一下: 1.多线程访问全局变量时,存在线程 ...

  4. Design Pattern ->Bridge

    Layering & Contract Philosophy With additional indirection. class CWindowImp { public: virtual v ...

  5. win10 安装mysql zip 压缩包版

    从官网下载zip https://www.mysql.com/downloads/ 解压 D:\devtool\mysql-5.7.17-winx64\ 将  D:\devtool\mysql--wi ...

  6. tnagios - query handler

    启动日志 [root@bjyh-48-86 nagios]# cat nagios.log [1433471109] Nagios 4.1.0rc1 starting... (PID=5136) [1 ...

  7. Linux命令之查看日志等实时文件命令(less 、tail)使用

    一.less的使用 1)less  文件名,即可快速打开文件 2)相关查看搜索 3)利用键盘向上向下箭头键盘上的向上和向下箭头,点击一次向下简单,文件内容往下读取一行:点击一次向上箭头,文件内容,往上 ...

  8. attachEvent方法的作用

    用于HTML内代码层和UI层分离.比如,你要给一个按钮增加一个单击事件,你会怎么做?<input type="button" id="theBtn" va ...

  9. 04、Spark Standalone集群搭建

    04.Spark Standalone集群搭建 4.1 集群概述 独立模式是Spark集群模式之一,需要在多台节点上安装spark软件包,并分别启动master节点和worker节点.master节点 ...

  10. vos对接时业务确认及信息安全责任承诺书

           业务确认及信息安全责任承诺书 双方达成一致,******网络科技有限公司向            有限公司提供中国移动网内语音线路接入服务,保证资源长期使用,保证线路资源接通率标 准,合 ...