【模板】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的更多相关文章

  1. [luogu P3806] 【模板】点分治1

    [luogu P3806] [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条 ...

  2. 洛谷 P3806 【模板】点分治1

    P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述 ...

  3. 洛谷 P3806 【模板】点分治1-树分治(点分治,容斥版) 模板题-树上距离为k的点对是否存在

    P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式 n,m 接下来n-1条边a,b,c描述a到b有一条长度 ...

  4. P3806 【模板】点分治1(题解)(点分治)

    P3806 [模板]点分治1(题解)(点分治) 洛谷题目传送门 #include<iostream> #include<cstdlib> #include<cstdio& ...

  5. AC日记——【模板】点分治(聪聪可可) 洛谷 P2634

    [模板]点分治(聪聪可可) 思路: 点分治: (感谢灯神) 代码: #include <bits/stdc++.h> using namespace std; #define maxn 2 ...

  6. luogu 3806 【模板】点分治

    luogu 3806 [模板]点分治 给定一棵有n个点的树,有m个询问,每个询问树上距离为k的点对是否存在.树的权值最多不超过c.n<=10000,m<=100,c<=1000,K& ...

  7. 【刷题】洛谷 P3806【模板】点分治1

    题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接 ...

  8. Luogu P3806 点分治模板1

    题意: 给定一棵有n个点的树询问树上距离为k的点对是否存在. 分析: 这个题的询问和点数都不多(但是显然暴力是不太好过的,即使有人暴力过了) 这题应该怎么用点分治呢.显然,一个模板题,我们直接用套路, ...

  9. 洛谷 P3806 点分治模板

    题目:https://www.luogu.org/problemnew/show/P3806 就是点分治~ 每次暴力枚举询问即可,复杂度是 nmlogn: 注意 tmp[0]=1 ! 代码如下: #i ...

随机推荐

  1. kafka消费者客户端

    Kafka消费者 1.1 消费者与消费者组 消费者与消费者组之间的关系 ​ 每一个消费者都隶属于某一个消费者组,一个消费者组可以包含一个或多个消费者,每一条消息只会被消费者组中的某一个消费者所消费.不 ...

  2. 如何让自己的程序支持iPhone5–RetinaImages

    我们知道如果想让程序的启动图像能够适应iPhone5(640X1136),那么我们需要把启动的图像命名以“-568h@2x”结尾的图片,那 么是不是程序中用到的所有图片都可以用这样的方式来命名,以适合 ...

  3. Sort Detail Data Block Example - Oracle Forms

    Example is given below to sort detail data block data (toggle asc or desc) with push buttons used as ...

  4. Weblogic多数据源(Multi Data Sources)应用实践

    原创 2012年03月29日 10:55:28 标签: weblogic / 数据库 / 负载均衡 / 数据中心 / jdbc / 应用服务器   大型系统在进行数据库部署时,常常会分为主数据应用中心 ...

  5. java中的占位符\t\n\r\f

    \t 相当于tab,缩进\n NewLine 换行 System.out.println("aaa\tbbb"); //aaa bbbSystem.out.println(&quo ...

  6. Linux Unix shell 编程指南学习笔记(第四部分)

    第十六章  shell脚本介绍 此章节内容较为简单,跳过. 第十七章   条件測试 test命令 expr命令 test  格式  test  condition     或者  [ conditio ...

  7. UVA - 10895 Matrix Transpose

    UVA - 10895 Matrix Transpose Time Limit:3000MS   Memory Limit:Unknown   64bit IO Format:%lld & % ...

  8. C 递归 递归指的是在函数的定义中

    C 递归 递归指的是在函数的定义中使用函数自身的方法. 举个例子:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给 ...

  9. java thin方式连接oracle数据库

    本文主要描述通过thin方式连接oracle数据库 1.创建web project ,将D:\oracle\product\10.2.0\db_1\jdbc\lib(oracle安装目录)下的ojdb ...

  10. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第15章节--开发SP2013工作流应用程序         本章节你将学到: SP中工作流的新功能: 理解工作流管理服务 ...