看到现有的一篇 DSU on tree 的题解复杂度假了,于是我来再写一篇。

首先重新梳理思路,维护每棵子树内深度为某个值的节点是否存在。

维护这个东西可以直接 DSU on tree 也就是把小的子树内的信息加入大的子树。

然后加入点是判断是否能和已经存在的点构成长度为 \(K\) 的路径。

举个例子,对于经过点 \(rt\) 的从 \(x\) 到 \(y\) 的路径,长度是 \(dep_x - dep_{rt} + dep_y - dep_{rt}\)。

令上式值为 \(K\) 再移项就可以知道新加入的点需要满足如何的限制才可以做贡献。

最后注意一个点,我们不能暴力清空数组,正确做法是把这个桶用哈希维护,然后直接 \(O(1)\) 清空哈希表。

另外说一个特殊的地方:这份代码为了省事将加点和贡献放在了一起,如果计算方案数就会计重,如果想避免就需要对于每个子树中的所有节点先计算贡献再加入桶

最后上代码:

#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
const int maxn = 1e4+114;
int depth[maxn],n,sz[maxn],big[maxn],L[maxn],R[maxn],Node[maxn],tot;
__gnu_pbds::gp_hash_table<int,int> cnt;
vector< pair<int,int> > edge[maxn];
int K;
bool flag;
inline void add(int u,int rt){
cnt[depth[u]]=1;
int v=K+depth[rt]*2-depth[u];
if(cnt[v]==1) flag=true;
}
inline void dfs1(int u,int fa,int w){
L[u]=++tot;
Node[tot]=u;
R[u]=L[u];
sz[u]=1;
depth[u]=depth[fa]+w;
for(pair<int,int> v:edge[u]){
if(v.first==fa) continue;
dfs1(v.first,u,v.second);
sz[u]+=sz[v.first];
if(sz[v.first]>sz[big[u]]){
big[u]=v.first;
}
R[u]=max(R[u],R[v.first]);
}
}
inline void dfs2(int u,int fa,bool keep){
for(pair<int,int> v:edge[u]){
if(v.first!=fa&&v.first!=big[u]) dfs2(v.first,u,false);
if(flag==true){
return ;
}
}
if(big[u]){
dfs2(big[u],u,true);
if(flag==true){
return ;
}
}
add(u,u);
for(pair<int,int> v:edge[u]){
if(v.first!=fa&&v.first!=big[u]){
for(int i=L[v.first];i<=R[v.first];i++){
add(Node[i],u);
if(flag==true){
return ;
}
}
}
}
if(keep==false){
cnt.clear();
}
}
int m;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
edge[u].push_back(make_pair(v,w));
edge[v].push_back(make_pair(u,w));
}
dfs1(1,0,1);
while(m--){
cin>>K;
flag=false;
dfs2(1,0,true);
cnt.clear();
cout<<(flag==true?"AYE\n":"NAY\n");
}
}

P3806 题解的更多相关文章

  1. P3806 【模板】点分治1(题解)(点分治)

    P3806 [模板]点分治1(题解)(点分治) 洛谷题目传送门 #include<iostream> #include<cstdlib> #include<cstdio& ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  10. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. go-zero modd开发配置

    目录 go-zero modd开发配置 modd配置 项目打包编排文件 nginx配置文件 各服务中的配置里要写上如下配置 go-zero modd开发配置 modd配置 modd.conf #use ...

  2. VForm

    VForm是一款基于Vue 2/Vue 3的低代码表单,支持Element UI.iView两种UI库,定位为前端开发人员提供快速搭建表单.实现表单交互和数据收集的功能. VForm全称为Varian ...

  3. AeroAdmin、TeamViewer和Splashtop Business Access的区别

    ​Hi everyone! 今天又是喜闻乐见的吃瓜时间,王婆卖瓜,不得不夸. 炎炎夏日,就给大家送个大西瓜吧.望梅止渴也是极好的. ------官宣分割线------ Splashtop是针对个人和企 ...

  4. Springboot+Mybatis+Clickhouse+jsp 搭建单体应用项目(二)(添加日志打印和源码地址)

    一.添加yaml设置 1 logging: 2 level: 3 com.mrliu.undertow.mapper : debug 二.添加pom的Hutool工具,完善日志打印处理 1 <d ...

  5. JSON返回结果修改null为"";json字段为null时输出空字符串

    简介 (Introduction): 背景 json字符串返回的需要"",但是却是null,怎么处理呢,如下 结构图 1 [ 2 { 3 "1":{ 4 &qu ...

  6. gpu机器没有开启ipv6

    参考: https://blog.csdn.net/asdfaa/article/details/137884414 检查系统是否支持 IPv6,查看被禁用了 在启用 IPv6 之前,首先要确保您的系 ...

  7. C# java 的 equals 与 == 的区别

    C# String a = "宜春"; String b = new String(new char[] { '宜', '春' }); String c = b; //注意这里是引 ...

  8. Flask-Limit详细说明:接口限流

    速率限制通常作为服务的防御措施予以实施.服务需要保护自身以免过度使用(无论是有意还是无意),从而保持服务可用性.在Flask项目开发过程中,遇到了需要对接口进行限制的需求,又不想去造轮子,这时候就需要 ...

  9. (JAVA)设计模式-适配器模式

    模式的定义和特点: 适配器模式(Adapter)是一种将一个类的接口转换成客户希望的另外一个接口的设计模式,可以提高代码的复用性和灵活性. 结构与实现: 定义一个适配器类来实现业务接口,再继承现有组件 ...

  10. vue 的directives一个坑

    大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...