【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%的 ...
随机推荐
- Cause: java.lang.UnsupportedOperationException
运行web项目的时候出现以下错误: ### Cause: java.lang.UnsupportedOperationException at org.mybatis.spring.MyBati ...
- UVALive 5031 Graph and Queries (Treap)
删除边的操作不容易实现,那么就先离线然后逆序来做. 逆序就变成了合并,用并存集判断连通,用Treap树来维护一个连通分量里的名次. Treap = Tree + Heap.用一个随机的优先级来平衡搜索 ...
- [大坑]Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
报错tensorflow/stream_executor/cuda/cuda_dnn.cc:338] Could not create cudnn handle: CUDNN_STATUS_INTER ...
- JDK安装及环境变量配置详解
一.下载(Jdk 1.8 ) 1.下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151 ...
- Dojo的dojoConfig函数
在我们引入 Dojo 的时候都会先做一些全局的配置,所使用的就是 Dojo 的 Config 接口. dojoConfig为以前的dgConfig函数. <script type="t ...
- APP上线碰到的问题:Non-public API usage
①.Non-public API usage:The app references non-public symbols in XXXX: _UICreateCGImageFromIOSurface ...
- json_decode()和json_encode()区别----2015-0929
json_decode对JSON格式的字符串进行编码而json_encode对变量进行 JSON 编码,需要的朋友可以参考下 1.json_decode() json_decode (PHP 5 ...
- cin 和 getline 混用中需要注意的问题
这段时间在刷题过程中遇到一个cin和getline混合使用中的问题,解决之后记录如下: 先来看一段代码 #include <iostream> #include <string> ...
- 【思维题】TCO14 Round 2C InverseRMQ
全网好像就只有劼和manchery写了博客的样子……:正解可能是最大流?但是仔细特判也能过 题目描述 RMQ问题即区间最值问题是一个有趣的问题. 在这个问题中,对于一个长度为 n 的排列,query( ...
- destoon 屏蔽会员组,让个人,游客不显示
include/post.fun.php 文件的group_select函数增加 排除参数 except function group_select($name = 'groupid', $titl ...