[BZOJ1316]树上的询问 点分治
1316: 树上的询问
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1017 Solved: 287
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 5
1 3 7
1 4 1
3 5 2
3 6 3
1
8
13
14
Sample Output
Yes
No
Yes
HINT
30%的数据,n≤100.
100%的数据,n≤10000,p≤100,长度≤1000000.
做完此题可看下POJ 3237 Tree
Source
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 100000
using namespace std;
int n,q;
int ask[maxn];
int ans[maxn];
struct edge {
int to,next,c;
}e[maxn*];
int head[maxn],cnt;
void add(int u,int v,int c){e[cnt].to=v;e[cnt].next=head[u];e[cnt].c=c;head[u]=cnt++;}
int root;
int vis[maxn],size[maxn],sum,f[maxn];
void findrt(int x,int fa) {
size[x]=;f[x]=;
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;if(to==fa||vis[to]) continue;
findrt(to,x);
size[x]+=size[to];
f[x]=max(f[x],size[to]);
}
f[x]=max(f[x],sum-size[x]);
if(f[x]<f[root]) root=x;
}
int dis[maxn],t[maxn],tt,tmp,num[maxn];
int dfs(int x,int fa,int d) {
dis[++tt]=d;
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;if(to==fa||vis[to]) continue;
dfs(to,x,d+e[i].c);
}
}
void cal(int x,int fl,int d) {
tt=;tmp=;
dfs(x,,d);
sort(dis+,dis+tt+);
for(int i=;i<=tt;i++) {
if(dis[i]!=dis[i-]||i==) dis[++tmp]=dis[i],num[tmp]=;
else num[tmp]++;
}
for(int i=;i<=q;i++) {
for(int j=;j<=tmp;j++)
if(num[j]>=&&dis[j]*==ask[i]) ans[i]+=fl*num[j]*(num[j]-);
int l=,r=tmp;
while(l<r) {
if(dis[l]+dis[r]>ask[i]&&l<r) r--;
else {
if(dis[l]+dis[r]==ask[i]) ans[i]+=fl*num[l]*num[r];
l++;
}
}
} }
void work(int x) {
vis[x]=;cal(x,,);
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;if(vis[to]) continue;
cal(to,-,e[i].c);
root=;sum=size[to];findrt(to,x);
work(root);
}
}
int main() {
memset(head,-,sizeof(head));
scanf("%d%d",&n,&q);
for(int i=;i<n;i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);add(b,a,c);
}
for(int i=;i<=q;i++) scanf("%d",&ask[i]);
f[]=;sum=n;
findrt(,);
work(root);
for(int i=;i<=q;i++)
if(ans[i]>||!ask[i]) printf("Yes\n");
else printf("No\n");
}
[BZOJ1316]树上的询问 点分治的更多相关文章
- 【BZOJ1316】树上的询问 点分治+set
[BZOJ1316]树上的询问 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整数n, ...
- [bzoj1316]树上的询问_点分治
树上的询问 bzoj-1316 题目大意:一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 注释:$1\le n\le 10^4$,$1\ ...
- BZOJ 1316: 树上的询问( 点分治 + 平衡树 )
直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...
- 【点分治】bzoj1316 树上的询问
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; #defin ...
- [bzoj1316] 树上的询问
裸的点分治.. 及时把已经确定的询问清掉就能快不少.时间复杂度O(nlogn*p) #include<cstdio> #include<iostream> #include&l ...
- BZOJ_1316_树上的询问_点分治
BZOJ_1316_树上的询问_点分治 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整 ...
- 【BZOJ-3784】树上的路径 点分治 + ST + 堆
3784: 树上的路径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 462 Solved: 153[Submit][Status][Discuss ...
- 【Luogu2664】树上游戏(点分治)
[Luogu2664]树上游戏(点分治) 题面 洛谷 题解 很好的一道点分治题. 首先直接点分治,考虑过每个分治重心的链的贡献. 我们从分治重心开始找每种颜色,强制令一种颜色只在其到分治重心的链上第一 ...
- 【bzoj1316】树上的询问 树的点分治+STL-set
题目描述 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 输入 第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行 ...
随机推荐
- C# 利用WMI对象获取物理内存和可用内存大小
下面的代码演示的是使用WMI对象可获取取物理内存和可用内存大小,在使用WMI对象前,先要添加对System.Management的引用,然后就可以调用WMI对象,代码如下: //获取总物理内存大小 M ...
- Bootstrap中轮播图
Bootstrap中轮播图插件叫作Carousel,为了清晰的表明每个标签在这里是什么意思,我把解释写在了下面的代码中. <!-- 以下容器就是整个轮播图组件的整体, 注意该盒子必须加上 cla ...
- SRM710 div1 ReverseMancala(trick)
题目大意, 给定一个有n个点的环,n不超过10,每个点上有一个权重 起始时权重将会给出,然后有2种操作 第一种操作是,选择一个位置i,获得权重w = a[i],把a[i]变成0,然后接下来在环上顺着走 ...
- 如何在自家厨房里制作LSD
如何在自家厨房里制作LSD -------------------------------------------------------------------------------- D-麦角酸 ...
- 种树 by yoyoball [树分块+bitset]
题面 给定一棵树,有点权 每次询问给出一些点对,求这些点对之间的路径的并集上不同权值的个数,以及这些权值的$mex$ 思路 先考虑只有一对点对,只询问不同权值个数的问题:树上莫队模板题 然后加个$me ...
- BZOJ2460 [BeiJing2011]元素 【线性基】
2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1675 Solved: 869 [Submit][St ...
- Codeforces 937.C Save Energy!
C. Save Energy! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- [NOI2002] 银河英雄传说 (带权并查集)
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- centos安装net-speeder
以前介绍过VPS上安装锐速对VPS的加速效果,但是这货对 Linux 内核有要求,一般就只能在XEN或者KVM的机子上安装.不过还好锐速有一个免费的代替品:net-speeder,所以这里介绍一下 D ...
- Spring Boot(一)
1.注解 @EnableAutoConfiguration 官方文档:The @EnableAutoConfiguration annotation is often placed on your ...