[洛谷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即可 注意处理进位 ...
随机推荐
- win10设置开机以及开机无密码验证
1.开机自启动 将程序的exe的快捷方式放入下列文件夹中 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 2.开机无登录验证 ...
- java相关书籍及网站
原文链接:http://developer.51cto.com/art/201408/448609.htm 对于 Java™ 语言开发人员来说,信息过量是一个真正的问题.每个新入行的程序员都要面临一个 ...
- ubuntu14.10安装gitlab
1 换源: # curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/ ...
- 单机版solr的搭建
1.1. Solr的环境 Solr是java开发. 需要安装jdk. 安装环境Linux. 需要安装Tomcat. 1.2. 搭建步骤 第一步:把solr 的压缩包上传到Linux系统 第二步:解压s ...
- 谈谈 Act 的依赖注入 和 模板输出 - 回答 drinkjava 同学提问
1. 背景 依赖注入工具 jBeanBox 的作者 drinkjava 同学最近在 Actframework gitee 项目 的提出了如下评论: 你这个DI工具的出发点可能有问题,一个MVC工具为什 ...
- PAT甲级——1061 Dating (20分)
Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh4hhGE 2984akDfkkkkg ...
- drf偏移分页组件-游标分页-自定义过滤器-过滤器插件django-filter
drf偏移分页组件 LimitOffsetPagination 源码分析:获取参数 pahenations.py from rest_framework.pagination import Limit ...
- ZJNU 1269 - 灯塔——高级
根据题目输入可以得到一个有向图 信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可 但又要考虑可能会出现环这类情况 所以跑一遍强连通分量模板,再根据分块后的图找到入度为0的块,把 ...
- Tomcat8 启动报错
Tomcat8启动报错: java.lang.NoSuchMethodError:javax.servlet.ServletContext.getClassLoader 在网上搜索后,发现此类问题大都 ...
- JavaScript学习笔记 - 进阶篇(3)- 流程控制语句
if语句 if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF)会出错! 假设你应聘web前端技术开发岗位,如果你会HTM ...