题目链接: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分治)的更多相关文章

  1. COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]

    传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...

  2. 「分治」-cdq分治

    cdq分治是一种分治算法: 一种分治思想,必须离线,可以用来处理序列上的问题(比如偏序问题),还可以优化1D/1D类型的DP.• 算法的大体思路我们可以用点对来描述.假定我们有一个长度为n的序列,要处 ...

  3. hdu 5126 stars cdq分治套cdq分治+树状数组

    题目链接 给n个操作, 第一种是在x, y, z这个点+1. 第二种询问(x1, y1, z1). (x2, y2, z2)之间的总值. 用一次cdq分治可以将三维变两维, 两次的话就变成一维了, 然 ...

  4. BZOJ3745 / SP22343 NORMA2 - Norma 分治,CDQ分治

    要命的题目. 写法:分类讨论进行计算. 枚举过每一个\(mid\)的所有区间.对于左端点\(i∈[l, mid - 1]\),向左推并计算\([l,mid]\)范围内的最大\(/\)最小值. 然后右端 ...

  5. bzoj 3672 利用点分治将CDQ分治推广到树型结构上

    最大的收获就是题目所说. deal(s) : 处理节点s所在块的问题,并保证: 1.s是该块中最靠近根节点的点,没有之一. 2.s所在块到根节点的路径上的点全都用来更新过了s所在块的所有节点. 然后步 ...

  6. 点分治&cdq分治 总结

    游荡的孤高灵魂不需要羁绊之处. 洛谷题单 点分治 前置芝士 树的重心 树分治 例题略解 P3806 [模板]点分治1 板子题,先暴力找到整棵树的重心,然后先求出重心到各点的距离,进而算出他所在树的各个 ...

  7. [学习笔记]CDQ分治和整体二分

    序言 \(CDQ\) 分治和整体二分都是基于分治的思想,把复杂的问题拆分成许多可以简单求的解子问题.但是这两种算法必须离线处理,不能解决一些强制在线的题目.不过如果题目允许离线的话,这两种算法能把在线 ...

  8. cdq分治的小结

    cdq分治 是一种特殊的分治 他的思想: 1.分治l,mid 2.分治mid+1,r 3.计算l,mid对mid+1,r的影响 3就是最关键的地方 这也是cdq的关键点 想到了这一步基本就可以做了 接 ...

  9. CDQ分治笔记

    以前一直不会CDQ……然后经常听到dalao们说“这题直接CDQ啊”“CDQ不就秒了吗”的时候我只能瑟瑟发抖QAQ CDQ分治 其实CDQ分治就是二分分治,每次将$[l,r]$的问题划分为$[l,mi ...

  10. NEUOJ 1702:撩妹全靠魅力值(CDQ分治三维偏序)

    http://acm.neu.edu.cn/hustoj/problem.php?id=1702 思路:三维偏序模板题,用CDQ分治+树状数组或者树套树.对于三元组(x,y,z),先对x进行排序,然后 ...

随机推荐

  1. codeforces515B

    Drazil and His Happy Friends CodeForces - 515B Drazil有很多朋友,他们中有些人是快乐的,有些人是不快乐的. Drazil想让他的朋友变得快乐.于是, ...

  2. Ubuntu 16.04配置JDK

    此篇为http://www.cnblogs.com/EasonJim/p/7139275.html的分支页. 一.JRE和JDK JRE(Java Runtime Environment)是运行一个基 ...

  3. BZOJ1906树上的蚂蚁&BZOJ3700发展城市——RMQ求LCA+树链的交

    题目描述 众所周知,Hzwer学长是一名高富帅,他打算投入巨资发展一些小城市. Hzwer打算在城市中开N个宾馆,由于Hzwer非常壕,所以宾馆必须建在空中,但是这样就必须建立宾馆之间的连接通道.机智 ...

  4. BZOJ1222[HNOI2001]产品加工——DP

    题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工 ...

  5. BZOJ2716 [Violet]天使玩偶(cdq分治+树状数组)

    非常裸的KD-tree.然而我没学啊. 考虑如何离线求一个点在平面中的曼哈顿最近点. 绝对值显得有点麻烦,于是把绝对值拆开分情况讨论一波.对于横坐标小于该点的,记录对于纵坐标的前缀x+y最大值和后缀x ...

  6. Luogu4238 【模板】多项式求逆(NTT)

    http://blog.miskcoo.com/2015/05/polynomial-inverse 好神啊! B(x)=B'(x)·(2-A(x)B'(x)) 注意ntt的时候防止项数溢出,即将多项 ...

  7. ubuntu 16.04 samba服务搭建

    一:安装 1. sudo apt-get install samba 有询问Yes的地方Yes就行. 无法安装samba 执行 sudo apt-get update 2.等待安装完成,进入配置文件目 ...

  8. 一个死循环导致的栈溢出实例:StackOverFlowError

    有一个功能,要用复选框组做成单选框效果,如果有三个复选框 CheckBox ,并且保证每次只能选中一个.刚开始添加了以下的值改变后的监听方法 addValueChangeListener ,却导致了栈 ...

  9. Java微信公众号安全模式消息解密

    这篇文章主要为大家详细介绍了Java微信公众号安全模式消息解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.微信公众平台下载解密工具,导入项目中,根据demo解密消息 public stat ...

  10. 自学Linux Shell6.2-用户自定义环境变量

    点击返回 自学Linux命令行与Shell脚本之路 6.2-用户自定义环境变量 1.设置局部用户定义变量 一旦启动bash shell(或者执行一个shell脚本),你就能创建这个shell进程可见的 ...