BZOJ_1316_树上的询问_点分治
BZOJ_1316_树上的询问_点分治
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
和Race那道题差不多,由于p很小可以暴力统计。
时间复杂度O(p*n*logn)
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 10050
#define maxl 1000000
int head[N],to[N<<1],nxt[N<<1],val[N<<1],cnt,n,m;
int fag[N],siz[N],ask[150],tot,solved[150],a[N],b[N],dis[N],root;
bool used[N],buc[1000010][2];
inline void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
}
void getroot(int x,int y) {
fag[x]=0; siz[x]=1;
int i;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=y&&!used[to[i]]) {
getroot(to[i],x);
siz[x]+=siz[to[i]];
fag[x]=max(fag[x],siz[to[i]]);
}
}
fag[x]=max(fag[x],tot-siz[x]);
if(fag[root]>fag[x]) {root=x;}
}
void getdep(int x,int y) {
int i;
if(dis[x]<=maxl){
a[++a[0]]=dis[x];
b[++b[0]]=dis[x];
}
siz[x]=1;
for(i=head[x];i;i=nxt[i]) {
if(to[i]!=y&&!used[to[i]]) {
dis[to[i]]=dis[x]+val[i];
getdep(to[i],x);
siz[x]+=siz[to[i]];
}
}
}
void getsiz(int x,int y) {
int i;
siz[x]=1;
for(i=head[x];i;i=nxt[i]) if(to[i]!=y&&!used[to[i]]) {
getsiz(to[i],x);
siz[x]+=siz[to[i]];
}
}
void work(int x) {
used[x]=1;
int i,j,k;
dis[x]=0;
b[0]=0;
b[++b[0]]=0;
for(i=head[x];i;i=nxt[i]) if(!used[to[i]]) {
a[0]=0;
a[++a[0]]=0;
dis[to[i]]=val[i];
getdep(to[i],0);
for(k=1;k<=m;k++) if(!solved[k]) {
for(j=1;j<=a[0];j++) {
if(a[j]<=ask[k]&&buc[ask[k]-a[j]][0])
solved[k]=1;
}
}
for(j=1;j<=a[0];j++) buc[a[j]][0]=1,buc[a[j]][1]=0;
}
for(i=1;i<=b[0];i++) {
buc[b[i]][0]=buc[b[i]][1]=0;
}
getsiz(x,0);
for(i=head[x];i;i=nxt[i]) if(!used[to[i]]) {
tot=siz[to[i]];
root=0;
getroot(to[i],0);
work(root);
}
}
int main() {
scanf("%d%d",&n,&m);
int i,x,y,z;
for(i=1;i<n;i++) {
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
for(i=1;i<=m;i++) {
scanf("%d",&ask[i]);
if(!ask[i]) solved[i]=1;
}
fag[0]=100000000;
tot=n;
getroot(1,0);
work(root);
for(i=1;i<=m;i++) {
if(solved[i]) puts("Yes");
else puts("No");
}
}
BZOJ_1316_树上的询问_点分治的更多相关文章
- [bzoj1316]树上的询问_点分治
树上的询问 bzoj-1316 题目大意:一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 注释:$1\le n\le 10^4$,$1\ ...
- BZOJ 1316: 树上的询问 (点分治+set)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1316 因为只要求存在某条路径长度为K,所以点分,然后用set判断差值是否在set中就可以了. ...
- BZOJ 1316: 树上的询问( 点分治 + 平衡树 )
直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...
- 【BZOJ1316】树上的询问 点分治+set
[BZOJ1316]树上的询问 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整数n, ...
- [BZOJ1316]树上的询问 点分治
1316: 树上的询问 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1017 Solved: 287[Submit][Status][Discus ...
- BZOJ_3697_采药人的路径_点分治
BZOJ_3697_采药人的路径_点分治 Description 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性 ...
- BZOJ_2152_聪聪可可_点分治
BZOJ_2152_聪聪可可_点分治 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)…… ...
- BZOJ_3781_小B的询问_莫队
BZOJ_3781_小B的询问_莫队 Description 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值 ...
- 【bzoj1316】树上的询问 树的点分治+STL-set
题目描述 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 输入 第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行 ...
随机推荐
- android + php 后台开发
android+php 安卓与服务器的数据交互 在我们进行android开发的时候,避免不了的要进行登录注册,个人信息获取,数据交互等等这一系列的操作.这样就需要进行android端与服务器端进行数据 ...
- PM2 Quick Start
PM2教程 @(Node)[负载均衡|进程管理器] [TOC] PM2简介 PM2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永 ...
- 【React入门实例(运行于浏览器duan)】
一.HTML模板 二.ReactDOM.render() ReactDOM.render是React的最基本方法,用于将模板转换为HTML语言,并插入指定的DOM节点. ReactReactDOM.r ...
- Jquery测试题
一.Jquery测试题 下面哪种不是jquery的选择器?(单选) A.基本选择器 B.后代选择器 C.类选择器 D.进一步选择器 考点:jquery的选择器 (C) 当DOM加载完成后要执行的函数, ...
- JAVA堆栈的区别
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度 ...
- Access Treeview树节点代码一
Private Sub TreeView0_Updated(Code As Integer)Dim ndeindex As NodeSet ndeindex = TreeView0.Nodes.Add ...
- go Mutex (互斥锁)和RWMutex(读写锁)
转载自: https://blog.csdn.net/skh2015java/article/details/60334437 golang中sync包实现了两种锁Mutex (互斥锁)和RWMute ...
- “Location of the Android SDK has not been set up in the preferences”问题的解决
方法来源:http://stackoverflow.com/questions/5894929/location-of-the-Android-sdk-has-not-been-setup-in-th ...
- Python撸支付宝红包教程,行走在灰色产业边缘的程序员!
2018年刚到就作死撸羊毛(支付宝).2017年用分享给支付宝好友链接的官方通道"撸"了400大洋. 如许天天早上7:30便起床开愉快心的分享红包链接.200多个老友分享完一次 ...
- cocos2d-x_ Windows下Android环境搭建
在Windows环境下编译cocos2d-x-3.0 Android-NDK编译:cocos2d-x(二) Mac 下搭建:http://www.cocoachina.com/bbs/read.php ...