【Luogu】P3806点分治模板(点分治)
wc听不懂lca讲的高等数学专场(一个字都听不懂),然后就自学了点分治。
点分治就是我先处理完跟根有关的东西,然后把根标记掉,把原树拆成若干个联通块,然后分别对每个联通块(每个小树)搞一模一样的操作。
然后要每次求重心,因为点分治复杂度跟递归深度有关。
本题判断的时候偷懒用map,其实自己写的splay也快不到哪里去的样子。qwq。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<map>
#define maxn 200020
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Edge{
int next,to,val;
}edge[maxn*];
int head[maxn],num;
inline void add(int from,int to,int val){
edge[++num]=(Edge){head[from],to,val};
head[from]=num;
} map<int,bool>ext; bool tag[maxn];
int size[maxn];
int mxn[maxn];
int stack[maxn],top;
int d[maxn];
int w[maxn];
int root=; void getroot(int x,int fa,int lim){
int ret=;size[x]=;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa||tag[to]) continue;
getroot(to,x,lim);
size[x]+=size[to];
if(ret<size[to]) ret=size[to];
}
if(ret<lim-size[x]) ret=lim-size[x];
mxn[x]=ret;
if(ret<mxn[root]||root==) root=x;
} void depfind(int x,int fa,int dst){
stack[++top]=dst;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa||tag[to]) continue;
depfind(to,x,dst+edge[i].val);
}
return;
} int getsize(int x,int fa){
int ans=;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa||tag[to]) continue;
ans+=getsize(to,x);
}
return ans;
} void dfs(int x,int lim,int m){
root=;
getroot(x,x,lim);
tag[root]=;
ext.clear();ext[]=;
for(int i=head[root];i;i=edge[i].next){
int to=edge[i].to;
if(tag[to]) continue;
top=;
depfind(to,to,edge[i].val);
sort(stack+,stack+top+);
for(int j=;j<=m;++j){
if(w[j]) continue;
for(int k=;k<=top;++k){
int now=d[j]-stack[k];
if(ext[now]==) w[j]=;
}
}
for(int j=;j<=top;++j) ext[stack[j]]=;
}
int now=root;
for(int i=head[now];i;i=edge[i].next){
int to=edge[i].to;
if(tag[to]) continue;
int ret=getsize(to,to);
dfs(to,ret,m);
}
} int main(){
int n=read(),m=read();
for(int i=;i<n;++i){
int x=read(),y=read(),z=read();
add(x,y,z);
add(y,x,z);
}
for(int i=;i<=m;++i) d[i]=read();
dfs(,n,m);
for(int i=;i<=m;++i)
if(w[i]==) printf("AYE\n");
else printf("NAY\n");
return ;
}
/*
13 10
1 2 1
1 4 2
4 3 5
4 5 11
5 6 4
5 7 2
4 8 7
1 10 2
9 10 9
1 11 4
11 13 5
11 12 6
12
11
10
9
8
22
13
14
15
18
*/
【Luogu】P3806点分治模板(点分治)的更多相关文章
- [luogu P3806] 【模板】点分治1
[luogu P3806] [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条 ...
- 模板·点分治(luogu P3806)
[模板]洛谷·点分治 1.求树的重心 树的重心:若A点的子树中最大的子树的size[] 最小时,A为该树的中心 步骤: 所需变量:siz[x] 表示 x 的子树大小(含自己),msz[x] 表示 其子 ...
- (模板)luoguP3806(树上点分治模板题)
点分治的写法1: 题目链接:https://www.luogu.org/problem/P3806 题意:给出一颗带边权的树,结点数n<=1e4,每条边有权值<=1e4,有m组询问(m&l ...
- luoguP4721 【模板】分治 FFT
P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...
- 洛谷 P4721 【模板】分治 FFT 解题报告
P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...
- LG4721 【模板】分治 FFT
P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 $n-1$ 的数组 $g[1],g[2],..,g[n-1]$,求 $f[0],f[1],..,f[n-1]$ ...
- 洛谷P2634 [国家集训队]聪聪可可 点分治模板
题意 在一棵树上任意选两个点,求它们距离模3为0的概率. 分析 树分治模板 Code #include<bits/stdc++.h> #define fi first #define se ...
- POJ1741 tree (点分治模板)
题目大意: 给一棵有 n 个顶点的树,每条边都有一个长度(小于 1001 的正整数).定义 dist(u,v)=节点 u 和 v 之间的最小距离.给定一个整数 k,对于每一对 (u,v) 顶点当且仅当 ...
- 【Luogu3806】点分治(点分治)
[Luogu3806]点分治(点分治) 题面 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行 ...
- COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]
传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...
随机推荐
- UVA 110020 Efficient Solutions (STL)
把一个人看出一个二维的点,优势的点就是就原点为左下角,这个点为右上角的矩形,包含除了右上角以外边界,其他任意地方不存在点. 那么所有有优势的点将会形成一条下凹的曲线. 因为可能有重点,用multise ...
- Processing分形之一——Wallpaper
之前用C语言实现过一些分形,但是代码比较复杂.而对于天生对绘图友好的Processing,及其方便. 在大自然中分形普遍存在,我们用图形模拟,主要是找到一个贴近的函数. 代码 /** * Wallpa ...
- ArcGis server发布地图服务
ArcGIS server发布服务: 首先修改地图文档属性中的关联默认数据库 最后使用分享将地图服务发布到server上,是地图服务可以使用: 注意一定要勾选 Feature Access选项 fea ...
- BCB:UTF8Encode、AnsiToUtf8
UTF8Encode: Call Utf8Encode to convert a Unicode string to UTF-8. WS is the Unicode string to conver ...
- ajax的序列化表单提交
通过传统的 form 表单提交的方式上传文件 ? 1 2 3 4 <form id="uploadForm" action="" method=" ...
- Python——函数基础
函数是什么 它相当于一个独立的代码块,可以被重复使用,如果需要增加一个功能或者修改一个功能,只需要,增加或者修改函数即可. 函数分类 内置函数 python解释器已经为我们定义好的参数,比如:len( ...
- Js笔记-第11课
// 第11课 作用域精解 运行期上下文,当函数执行时,会创建一个成为执行期上下文的内部对象.一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行期上下文都是独 ...
- MFC里 显示设备上下文CClient dc(this) 和 CPaintDC dc(this)
1 CPaintDC类(1)CPaintDC类是CDC类的一个派生类,该类一般用在响应WM_PAINT消息的函数OnPaint()中.(2)WM_PAINT消息是当窗口的某个区域需要重画时激发的窗口消 ...
- 当c++遇上音乐
运用到的函数 #include <windows.h> Beep( f, t ); Sleep( t ); eep() 函数可以让蜂鸣器发出频率为f赫兹,音长大约为 2t 毫秒的音.(注意 ...
- Voyager的路由
修改默认的后台登录路由 打开web.php,把prefix值改为你想设置的值,如back: Route::group(['prefix' => 'back'], function () { Vo ...