【模板】P3806点分治1
【模板】P3806 【模板】点分治1
很好的一道模板题,很无脑经典。
讲讲淀粉质吧,很营养,实际上,点分治是树上的分治算法。根据树的特性,树上两点的路径只有一下两种情况:
- 路径经过根\((*)\)
- 路径不经过根\((**)\)
显然对于\((**)\)我们可以通过指定一个新的根使得\((**)\)变成一个子问题。
那么我们在处理的时候,分两种情况:
- 处理自己各个子树之间的路径\((-)\)
- 各个子树之内的路径\((--)\)
显然\((--)\)的问题可以通过递归\((**)\)的子问题解决
那么有什么用呢?
考虑时间复杂度,我们指定新根时,若制定它的各自子树的重心,那么最多会递归\(logn\)次。这是淀粉质的营养时间基数。
那么,我们只需要设计在子树间进行统计答案的复杂度为\(O(x)\)的算法,那么我们就可以做到\(O(xlogn)\)的解决了。
这道模板题是问我们是否存在路径长度为\(k\)的路径,我们直接开桶把一个点到指定的\(rt\)的距离存下来,之后直接查询即可,这样的时间复杂度是\(O(n)\)。
总时间复杂度\(O(nlogn)\)
代码如下
#include<bits/stdc++.h>
using namespace std;
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
#define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >
TMP inline ccf qr(ccf b){
char c=getchar();
int q=1;
ccf x=0;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=x*10+c-48,c=getchar();
return q==-1?-x:x;
}
const int maxn=1e4+15;
int n,m;
struct E{
int to,w,nx;
}e[maxn<<1];
int head[maxn];
int cnt;
inline void add(int fr,int to,int w,bool f){
e[++cnt]=(E){to,w,head[fr]};
head[fr]=cnt;
if(f)
add(to,fr,w,0);
}
bool usd[maxn];
int siz[maxn];
int spa[maxn];
int sav[maxn];
int d[maxn];
int rt;
int k[105];
bool ans[10000005];
bool tell[105];
int q[maxn];
int sum;
void dfsroot(int now,int last){
siz[now]=1;
spa[now]=0;
ERP(t,now){
if(e[t].to!=last&&!usd[e[t].to]){
dfsroot(e[t].to,now);
siz[now]+=siz[e[t].to];
spa[now]=Max(spa[now],siz[e[t].to]);
}
}
spa[now]=Max(spa[now],sum-siz[now]);
if(spa[now]<spa[rt]||rt==0)
rt=now;
}
void dfsdis(int now,int last,int ew){
d[now]=d[last]+ew;
sav[++sav[0]]=d[now];
ERP(t,now){
if(e[t].to!=last&&!usd[e[t].to]){
dfsdis(e[t].to,now,e[t].w);
}
}
}
inline void calc(int now){
register int p=0;
ERP(t,now){
if(!usd[e[t].to]){
sav[0]=0;d[now]=0;
dfsdis(e[t].to,now,e[t].w);
RP(j,1,m){
if(!tell[j]){
RP(i,1,sav[0]){
if(k[j]>=sav[i]){
if(ans[k[j]-sav[i]])
tell[j]=1;
}
}
}
}
RP(i,1,sav[0])
ans[sav[i]]=1;
RP(i,1,sav[0])
q[++p]=sav[i];
}
}
RP(t,1,p)
ans[q[t]]=0;
}
void solve(int now){
usd[now]=ans[0]=1;
calc(now);
ERP(t,now){
if(!usd[e[t].to]){
sum=siz[e[t].to];
rt=0;
dfsroot(e[t].to,0);
solve(rt);
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=qr(1);
m=qr(1);
for(register int t=1,t1,t2,t3;t<n;++t){
t1=qr(1);
t2=qr(1);
t3=qr(1);
add(t1,t2,t3,1);
}
RP(t,1,m)
k[t]=qr(1),tell[t]=!k?1:0;
sum=n;
dfsroot(1,0);
solve(rt);
RP(t,1,m)
if(tell[t])
puts("AYE");
else
puts("NAY");
return 0;
}
【模板】P3806点分治1的更多相关文章
- [luogu P3806] 【模板】点分治1
[luogu P3806] [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条 ...
- 洛谷 P3806 【模板】点分治1
P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述 ...
- 洛谷 P3806 【模板】点分治1-树分治(点分治,容斥版) 模板题-树上距离为k的点对是否存在
P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式 n,m 接下来n-1条边a,b,c描述a到b有一条长度 ...
- P3806 【模板】点分治1(题解)(点分治)
P3806 [模板]点分治1(题解)(点分治) 洛谷题目传送门 #include<iostream> #include<cstdlib> #include<cstdio& ...
- AC日记——【模板】点分治(聪聪可可) 洛谷 P2634
[模板]点分治(聪聪可可) 思路: 点分治: (感谢灯神) 代码: #include <bits/stdc++.h> using namespace std; #define maxn 2 ...
- luogu 3806 【模板】点分治
luogu 3806 [模板]点分治 给定一棵有n个点的树,有m个询问,每个询问树上距离为k的点对是否存在.树的权值最多不超过c.n<=10000,m<=100,c<=1000,K& ...
- 【刷题】洛谷 P3806【模板】点分治1
题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接 ...
- Luogu P3806 点分治模板1
题意: 给定一棵有n个点的树询问树上距离为k的点对是否存在. 分析: 这个题的询问和点数都不多(但是显然暴力是不太好过的,即使有人暴力过了) 这题应该怎么用点分治呢.显然,一个模板题,我们直接用套路, ...
- 洛谷 P3806 点分治模板
题目:https://www.luogu.org/problemnew/show/P3806 就是点分治~ 每次暴力枚举询问即可,复杂度是 nmlogn: 注意 tmp[0]=1 ! 代码如下: #i ...
随机推荐
- CSS:水平居中与垂直居中
CSS居中算是一个比较基础的问题,在实际运用中,需要考虑到的一般是两种情况,一种是主要是表现为文字,图片等行内元素的居中,一种是指 div 等块级标签元素的居中. 水平居中 1.行内元素 行内元素(主 ...
- gtest 自动化测试 部署
1.部署 a)编译框架 1.1下载gtest库1.6.0 并解压到文件夹 "/user/{user}/gtest.1.6.0" 下载地址:https://code.google.c ...
- ios内存管理笔记(三)
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- doviceone- http组件进行webservice的POST请求
var http = mm("do_Http"); http.method = "POST"; // GET | POST http.timeout = 100 ...
- eos wasm虚拟机相关接口定义实现
wasm虚拟机相关接口定义实现 执行流程 controller::push_transaction() // 事务 -> transaction_context::exec() // 事务 ...
- ubuntu git 下添加 ssh
1 ssh-keygen 产生公钥和私钥 2 cat ~/.ssh/id_rsa.pub 复制出对应的公钥, 3 拷贝到git上的ssh-key里,注意拷贝时,换行处可能会引起错误,要把换行处的空格 ...
- JNI开发(2)——开发实战
JNI开发(1)--概述.环境搭建.必要知识点 JNI开发(2)--开发实战 本篇是重头戏:JNI实战开发.假设你对于 JNI.NDK 还没概念的话 那么观看本篇 也是没有太大难度的 ,哈哈哈哈! ! ...
- 一款很实用的Memcache监控工具
装了memcahce以后想对使用情况详细了解一下,如分配的内存够不够,都存了什么,经百度后发现这款工具灰常实用!此工具来自Memcache Pecl 中 http://pecl.php.net/pac ...
- Async Await 使用
1.简单例子 var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(func ...
- 在非主线程中更新UI
在非主线程中调用了showMessage方法,结果报错:Can't create handler inside thread that has not called Looper.prepare() ...