P3806 【模板】点分治1(CDQ分治)
题目链接:https://www.luogu.org/problemnew/show/P3806
题目大意:中文题目
具体思路:直接dfs好像会超时,然后我们就开始想优化的方法,然后就是一个CDQ入门题了,我们可以分解成许多子问题进行解决,然后对于一棵树的话,我们最好的切入点就是这棵树的重心了,这样就能使得复杂度尽可能的低了,然后就不停的往下递归找每一棵子树的重心进行求解就可以了,然后注意去重。
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 1e6+;
# define inf 0x3f3f3f3f
struct node
{
int to;
int nex;
int cost;
} edge[maxn<<];
int head[maxn<<],num=;
int dis[maxn],ans[maxn],mx[maxn];
int S,root;
int Size[maxn],vis[maxn];
int n,m,tot=;
void addedge(int fr,int to,int cost)
{
edge[num].to=to;
edge[num].cost=cost;
edge[num].nex=head[fr];
head[fr]=num++;
}
void Find(int x,int rt)
{
Size[x]=;
mx[x]=;
for(int i=head[x]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(to==rt||vis[to])
continue;
Find(to,x);
Size[x]+=Size[to];
mx[x]=max(mx[x],Size[to]);
}
mx[x]=max(mx[x],S-Size[x]);
if(mx[x]<mx[root])
root=x;
}
int a[maxn];
void get_dis(int x,int len,int rt)
{
dis[++tot]=a[x];
for(int i=head[x]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(to==rt||vis[to])
continue;
a[to]=len+edge[i].cost;
get_dis(to,len+edge[i].cost,x);
}
}
void solve(int x,int len,int w)
{
tot=;
a[x]=len;
get_dis(x,len,);
for(int i=; i<=tot; i++)
{
for(int j=; j<=tot; j++)
{
if(i==j)
continue;
ans[dis[i]+dis[j]]+=w;
}
}
}
void divide(int x)
{
solve(x,,);
vis[x]=;
for(int i=head[x]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(vis[to])
continue;
solve(to,edge[i].cost,-);//去重
S=Size[x],root=,mx[]=Size[x];
Find(to,x);
divide(root);
}
}
int main()
{
memset(head,-,sizeof(head));
scanf("%d %d",&n,&m);
int st,ed,cost;
for(int i=; i<n; i++)
{
scanf("%d %d %d",&st,&ed,&cost);
addedge(st,ed,cost);
addedge(ed,st,cost);
}
S=n,root=,mx[]=n;
Find(,);
divide(root);
int tmp;
for(int i=; i<=m; i++)
{
scanf("%d",&tmp);
printf("%s\n",ans[tmp]?"AYE":"NAY");
}
return ;
}
P3806 【模板】点分治1(CDQ分治)的更多相关文章
- COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]
传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...
- 「分治」-cdq分治
cdq分治是一种分治算法: 一种分治思想,必须离线,可以用来处理序列上的问题(比如偏序问题),还可以优化1D/1D类型的DP.• 算法的大体思路我们可以用点对来描述.假定我们有一个长度为n的序列,要处 ...
- hdu 5126 stars cdq分治套cdq分治+树状数组
题目链接 给n个操作, 第一种是在x, y, z这个点+1. 第二种询问(x1, y1, z1). (x2, y2, z2)之间的总值. 用一次cdq分治可以将三维变两维, 两次的话就变成一维了, 然 ...
- BZOJ3745 / SP22343 NORMA2 - Norma 分治,CDQ分治
要命的题目. 写法:分类讨论进行计算. 枚举过每一个\(mid\)的所有区间.对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值. 然后右端 ...
- bzoj 3672 利用点分治将CDQ分治推广到树型结构上
最大的收获就是题目所说. deal(s) : 处理节点s所在块的问题,并保证: 1.s是该块中最靠近根节点的点,没有之一. 2.s所在块到根节点的路径上的点全都用来更新过了s所在块的所有节点. 然后步 ...
- 点分治&cdq分治 总结
游荡的孤高灵魂不需要羁绊之处. 洛谷题单 点分治 前置芝士 树的重心 树分治 例题略解 P3806 [模板]点分治1 板子题,先暴力找到整棵树的重心,然后先求出重心到各点的距离,进而算出他所在树的各个 ...
- [学习笔记]CDQ分治和整体二分
序言 \(CDQ\) 分治和整体二分都是基于分治的思想,把复杂的问题拆分成许多可以简单求的解子问题.但是这两种算法必须离线处理,不能解决一些强制在线的题目.不过如果题目允许离线的话,这两种算法能把在线 ...
- cdq分治的小结
cdq分治 是一种特殊的分治 他的思想: 1.分治l,mid 2.分治mid+1,r 3.计算l,mid对mid+1,r的影响 3就是最关键的地方 这也是cdq的关键点 想到了这一步基本就可以做了 接 ...
- CDQ分治笔记
以前一直不会CDQ……然后经常听到dalao们说“这题直接CDQ啊”“CDQ不就秒了吗”的时候我只能瑟瑟发抖QAQ CDQ分治 其实CDQ分治就是二分分治,每次将$[l,r]$的问题划分为$[l,mi ...
- NEUOJ 1702:撩妹全靠魅力值(CDQ分治三维偏序)
http://acm.neu.edu.cn/hustoj/problem.php?id=1702 思路:三维偏序模板题,用CDQ分治+树状数组或者树套树.对于三元组(x,y,z),先对x进行排序,然后 ...
随机推荐
- HDU-1686-KMP-水题
纯KMP #include <cstdio> #include <algorithm> #include <cstring> #include <ctype. ...
- Linux 上传下载文件 [转]
从服务器下载文件scp username@servername:/path/filename /tmp/local_destination例如:scp codinglog@192.168.0.101: ...
- enumerate()用法
语法: enumerate(sequence,[start=0]) test = [i for i in range(9)] for i in test: print(i) for i,j in en ...
- Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)
Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...
- HDU 3605 Escape (网络流,最大流,位运算压缩)
HDU 3605 Escape (网络流,最大流,位运算压缩) Description 2012 If this is the end of the world how to do? I do not ...
- CF1080
emmmm......ouuan大佬上紫了,我却没打...... 首先吐槽一波家长会和机房锁门,害我只能来打虚拟赛. 写了abcd四题,还是被ouuan大佬吊打....... 264名,应该能上分吧. ...
- ??? cliquers
解:先推一个式子,然后就是CRT了... 那个阶乘怎么求呢?主要是分母可能有0,这时我们把分母的因子p全部提出来,上下次数相减判断即可. 细节颇多......注意在快速幂开始的时候a %= MO是个好 ...
- 洛谷P3230 比赛
emmmmmm,这个之前讲课的原题居然出到比赛里了. 我怒肝2h+然后A了此题,结果还是被某高一巨佬吊打...... 题意:n个球队两两比赛,胜得3分,败得0分,平得1分. 现有一个总分表,求问可能的 ...
- 洛谷P3295 萌萌哒 并查集 + ST表
又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...
- [bzoj4709][柠檬]
bzoj4709 思路 首先,最优秀的分法一定是每段两端都是这一段中最多的那个,否则可以把不是的那个踢出去单独成段肯定会更优秀.然后就成了将这个序列分段,保证每段两端元素相同的最大收益和. 用a[i] ...