[洛谷P3806] [模板] 点分治1
这个点分治都不用减掉子树里的了,直接搞就行了。
注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>。
因为这个WA了半天......
如果memset清空ex数组显然是会T的,所以开一个bef用来记录需要清空哪个地方。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int n,m;
int hd[],to[],nx[],len[],ec;
int qu[],ans[]; void edge(int af,int at,int el)
{
to[++ec]=at;
len[ec]=el;
nx[ec]=hd[af];
hd[af]=ec;
} int rt,tot;
int sz[],mx[];
int del[]; void weigh(int p,int fa)
{
sz[p]=;mx[p]=;
for(int i=hd[p];i;i=nx[i])
{
int t=to[i];
if(t==fa||del[t])continue;
weigh(t,p);
sz[p]+=sz[t];
mx[p]=max(mx[p],sz[t]);
}
mx[p]=max(mx[p],tot-sz[p]);
if(mx[p]<mx[rt])rt=p;
} int dis[];
int buf[],tp,ex[],bef[],btp; void dfs(int p,int fa)
{
buf[++tp]=dis[p];
for(int i=hd[p];i;i=nx[i])
{
int t=to[i];
if(fa==t||del[t])continue;
dis[t]=dis[p]+len[i];
dfs(t,p);
}
} void count(int p)
{
btp=;
for(int i=hd[p];i;i=nx[i])
{
int t=to[i];
if(del[t])continue;
tp=;dis[t]=len[i];
dfs(t,p);
for(int j=;j<=tp;j++)
for(int k=;k<=m;k++)
if(qu[k]>=buf[j])
ans[k]|=ex[qu[k]-buf[j]];
for(int j=;j<=tp;j++)
bef[++btp]=buf[j],ex[buf[j]]=;
}
for(int i=;i<=btp;i++)ex[bef[i]]=;
} void conquer(int p)
{
del[p]=ex[]=;
count(p);
for(int i=hd[p];i;i=nx[i])
{
int t=to[i];
if(del[t])continue;
rt=;tot=sz[t];
weigh(t,);
conquer(rt);
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
int ff,tt,vv;
scanf("%d%d%d",&ff,&tt,&vv);
edge(ff,tt,vv);
edge(tt,ff,vv);
}
for(int i=;i<=m;i++)scanf("%d",&qu[i]);
mx[]=tot=n;
weigh(,);
conquer(rt);
for(int i=;i<=m;printf("\n"),i++)
printf(ans[i]?"AYE":"NAY");
return ;
}
[洛谷P3806] [模板] 点分治1的更多相关文章
- 洛谷 P3806 (点分治)
题目:https://www.luogu.org/problem/P3806 题意:一棵树,下面有q个询问,问是否有距离为k的点对 思路:牵扯到树上路径的题都是一般都是点分治,我们可以算出所有的路径长 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷 P3806 点分治模板
题目:https://www.luogu.org/problemnew/show/P3806 就是点分治~ 每次暴力枚举询问即可,复杂度是 nmlogn: 注意 tmp[0]=1 ! 代码如下: #i ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
随机推荐
- libcurl在windows下的使用
curl在linux下很好用,但到了windows下写程序却没办法使用了,这时候可以使用libcurl库 libcurl库的编译网上很多,我就不一一赘述了,curl的官方网站:https://curl ...
- 永久使用mybase
(1)关闭程序 (2)找到程序的安装路径:D:\mybase\mybase\nyfedit7pro (3)打开mybase.ini 文件,7以下版本文件名称为nyfedit.ini
- win10 python 3.7 pip install tensorflow
环境: ide:pyCharm 2018.3.2 pyhton3.7 os:win10 64bit 步骤: 1.确认你的python有没有装pip,有则直接跳2.无则cmd到python安装目录下ea ...
- Popular generalized linear models|GLMM| Zero-truncated Models|Zero-Inflated Models|matched case–control studies|多重logistics回归|ordered logistics regression
============================================================== Popular generalized linear models 将不同 ...
- Python opencv计算批量图片的BGR各自的均值
#coding:utf-8 #第一种方式 很慢很慢 自己写的如何计算均值 ''' import cv2 import os def access_pixels(frame): print(frame. ...
- 并发与高并发(四)-java并发的优势和风险
- java 里没有友元函数怎么办
我希望一个service可以访问某个对象中的私有对象,但是不希望这个私有对象暴露给其它的service. public xxxServiceImpl{ public void do(){ xxxent ...
- 自动按键的Sendkeys工具的下载和使用
大家好! 下面介绍一款自动按键的小工具:Sendkeys 下载地址 Sendkeys.rar 按键脚本的书写规则如下: 启动本工具后,在工具中打开一个脚本文件,然后在工具中按下Ctrl+A全选所有脚本 ...
- Angular(三)
Angular开发者指南(三)数据绑定 数据绑定AngularJS应用程序中的数据绑定是模型和视图组件之间的数据的自动同步. AngularJS实现数据绑定的方式可以将模型视为应用程序中的单一来源 ...
- Linux实验总结(第二周)
测试一--vi 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号 用Vi输入图中代码,并用gcc编译通过 在Vi中使用K查找printf的帮助文档 提交vi编辑过程截图,要全屏,包含自己的 ...