【poj2114】点分治(离线)
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】点分治(离线)相关推荐
- codeforces gym-101741 Subsequence Sum Queries 分治+离线
题目 这里写链接内容 题意 给出一个最长为200000200000200000数列 给出一堆最多为200000200000200000个询问区间,问从这些区间中取出一些数使得数字之和是m的倍数,有多少 ...
- CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)
题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...
- 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)
传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...
- Educational Codeforces Round 56 Editorial
A.Dice Rolling 题意:Mishka 有一个六面的骰子,每面分别为 2 ~ 7,而且 Mishka 是欧皇,可以控制自己每次掷到的数字.Mishka 现在想掷若干次骰子,使得掷到的点数总和 ...
- ACM信息学竞赛算法总结
基础知识 位运算 递推与递归 前缀与差分 二分 排序 倍增 贪心 尺取法 数据结构 栈与队列 : 单调栈 单调队列 双端队列 Hash: 字符串Hash 与Hash表 字符串处理: KMP算法,-- ...
- 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解
题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
- 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...
- CDQ 分治算法模板
CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #defin ...
最新文章
- poj 1815 Friendship 最小割 拆点 输出字典序
- 人工智能开发语言排行榜:不死Java,不朽C/C++,新贵Python
- 接口持续集成环境搭建
- [Python] sys.argv[] 用法
- Mybatis Plugin(拦截器)的开发
- go语言离线查看说明文档
- Angular 服务器端渲染的学习笔记(一)
- MYSQL 定时任务
- php 支付宝小程序授权登陆验签_星巴克“啡快”登陆支付宝小程序,让你“飞快”取到咖啡...
- tensorflow学习笔记一:安装调试
- smb文件共享_使用SMB文件共享作为存储替代方案
- 论文中的一些数学符号表示
- 解决vim中鼠标右键无法复制的问题
- mysql留存率除了存储过程_基于MySQL分析线上充值留存率
- html5 动态图表FineReport优化报表取数
- JPBC Element传输
- 彭聃龄普通心理学第5版笔记和课后习题答案
- android textview 字体边框,为TextView添加一个边框的几种办法
- mysql mpm_Zabbix和MPM监控MySQL
- 竞业限制是什么意思?
热门文章
- 青光眼-复内路粘小管成形术(ABiC)-转载
- cannot resolve symbol ‘springframework‘
- 无法定位程序输入点SetDefaultDllDirectories
- TCP/UDP 套接字总结
- Eclipse Validating减少不必要的验证
- android+4.2+mtp+在此设备上不支持+文件类型,Nexus 4无法通过MTP显示文件
- 报表怎样实现滚动的公告效果?
- vue tabs 动态组件
- 51NOD 1594:Gcd and Phi——题解
- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机