[Luogu5384][Cnoi2019] 雪松果树
虽然这题是一道二合一,也不算难,但还是学到了很多东西啊,\(k\) 级儿子个数的五种求法!!我还是觉得四种比较好(
\(k\) 级儿子个数有五种求法,你知道么? ——鲁迅
首先 \(k\) 级祖先很好求,离线的话dfs的时候开个栈就好了。长链剖分也可以但我不会,倍增什么的就不用说了。
树上启发式合并
就是求一个子树里为某一个深度的点的个数嘛,这个明显可以dsu on tree啊,开个桶记录下各种深度的有几个就好了。
复杂度:\(O(nlogn)\),应该不能过0_0
树状数组
转化为dfs序,就是一个区间里等于某一个数的个数,二维数点弱化版,离线+树状数组。
复杂度:\(O(nlogn)\)
二分
给每个深度开一个vector,按照dfs序把点塞进去,询问时只要在对应深度的vector里二分出区间左右端点就好了。
这个做法虽然也是 \(O(nlogn)\) ,但它是在线的,很妙啊!!
长链剖分
这个是模板了吧,用一个简单的DP统计一下就好了
复杂度 \(O(n)\)
因为我之前其实不会长链剖分所以就写了下代码……
#include<bits/stdc++.h>
#define ll long long
#define fr(i,x,y) for(int i=(x);i<=(y);i++)
#define rf(i,x,y) for(int i=(x);i>=(y);i--)
#define frl(i,x,y) for(int i=(x);i<(y);i++)
using namespace std;
const int N=1000003;
const int M=N<<1;
int n,q;
int cnt,head[N],Next[M],v[M];
vector<int> id[N];
int qk[N];
void read(int &x){
char ch=getchar();x=0;
for(;ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
}
void add(int x,int y){
Next[++cnt]=head[x];
head[x]=cnt;
v[cnt]=y;
}
int st[N],L;
int d[N],bc[N],ls[N],*f[N],*now=ls;
//vector<int> qry[N];
void predfs(int x,int fa,int dep){
st[dep]=x;
//int bc=0;
for(auto tmp:id[x])
if (dep>qk[tmp])
id[st[dep-qk[tmp]]].push_back(tmp);
id[x].resize(0);
for(int i=head[x];i;i=Next[i]){
predfs(v[i],x,dep+1);
if (d[v[i]]>d[bc[x]]) bc[x]=v[i];
}
d[x]=d[bc[x]]+1;
}
int ans[N];
void dfs(int x,int fa){
f[x][0]=1;
if (bc[x]) f[bc[x]]=f[x]+1,dfs(bc[x],x);
for(int i=head[x];i;i=Next[i]){
int tmp=v[i];
if (tmp==bc[x]) continue;
f[tmp]=now;now+=d[tmp];
dfs(tmp,x);
fr(j,1,d[tmp]) f[x][j]+=f[tmp][j-1];
}
for(auto tmp:id[x])
ans[tmp]=f[x][qk[tmp]]-1;
}
int main(){
read(n);read(q);
int x;
fr(i,2,n){
read(x);
add(x,i);
}
fr(i,1,q){
read(x);read(qk[i]);
id[x].push_back(i);
}
predfs(1,0,1);
f[1]=now;now+=d[1];
fr(i,1,n) for(auto j:id[i]) printf("%d ",j);puts("---");
dfs(1,0);
fr(i,1,q) printf("%d ",qk[i]==0?0:ans[i]);
return 0;
}
dfs+差分
这是标算,,想不到……
前面那个树状数组未免太大材小用了,因为我们只是求区间里等于一个数的个数,并不真的需要树状数组所维护的前缀和。
我们dfs的时候记录一个 \(cnt_i\) 表示dfs过的里面深度为 \(i\) 的有多少个,然后求一个子树里深度为 \(d\) 的个数只要把dfs这个子树前后的 \(cnt_d\) 减一减就好了。
[Luogu5384][Cnoi2019] 雪松果树的更多相关文章
- P5384[Cnoi2019]雪松果树 (长链剖分)
题面 一棵以 1 1 1 为根的 N N N 个节点的有根树, Q Q Q 次询问,每次问一个点 u u u 的 k k k 级兄弟有多少个(第 k k k 代祖先的第 k k k 代孩子),如果没有 ...
- linux 常用命令--------雪松整理
linux 常用命令--------雪松整理 博客: http://hi.baidu.com/quanzhou722/blog错误在所难免,还望指正!========================= ...
- LOJ6276:果树——题解
https://loj.ac/problem/6276#submit_code NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求.这颗果树有N 个节点 ...
- Jmeter查看结果树Unicode编码转中文方法
本文为转载微信公众号文章,如作者发现后不愿意,请联系我进行删除 在jmeter工具的使用中,不管是测试接口还是调试性能时,查看结果树必不可少,然而在查看响应数据时,其中的中文经常以Unicode的编码 ...
- 【线段树 扫描线 二维数点】loj#6276. 果树
路径计数转成二维数点很妙啊 题目描述 NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求. 这颗果树有 $N$ 个节点,标号 $1 \ldots N$ ...
- Jmeter学习笔记(七)——监听器元件之察看结果树
在jmeter中,如果我们需要查看请求结果就需要添加查看结果树,这个监听器元件有那些功能呢? 一.察看结果树界面如下 二.察看结果树界面功能说明 1.所有数据写入文件 (1)文件名:可以通过浏览,选择 ...
- P5385 [Cnoi2019]须臾幻境(LCT+主席树,思维题)
题目 P5385 [Cnoi2019]须臾幻境 做法 考虑一条边\((u,v)\)是否\([L,R]\)中的贡献:\([L,R]\)中第一条位于\(u,v\)链的边,则减少了一个联通块 实现:\(LC ...
- P5390 [Cnoi2019]数学作业
P5390 [Cnoi2019]数学作业求子集异或和的和拆成2进制,假设有x个数这一位为1,剩下n-x个数对答案没有贡献,对于这一位而言,对答案的贡献就是,x个数选奇数个数的方案数*2^(n-x).由 ...
- 【jmeter】将“察看结果树”中的数据保存到本地
操作说明: 1. "察看结果树"页面,[配置]导出项: 2. "察看结果树"页面,[文件名]选框输入导出文件及路径: 3. 点击jmeter[启动]按钮,响应 ...
随机推荐
- 报错com.neenbedankt.android-apt not found如何解决
apply plugin: 'com.neenbedankt.android-apt' 在moudle中build.gradle文件内有应用此插件,编译时报错 检查Project中build.grad ...
- 写mysql语句时tab键与空格键
某网页上复制的一份mysql语句,报错,重写一遍后,好了,对比后,发现, 可以看到在sublime text中,网上复制的缩进是空白的,tab键是横杠,空格键是一个点
- python编程基础之二十五
匿名函数:不用def 定义的函数,没有函数名 lambda只是一个表达式,函数体比def简单的多 lambda的函数体不再是代码块 lambda只有一行,增加运行效率 lambda [参数1][参数2 ...
- jsonp 跨域Uncaught SyntaxError: Unexpected token :解决方法
[jQuery]Ajax实现跨域访问JSON Ajax跨域访问JSON 环境:.net4.0+jQuery+JSON.net 因为在跨域实现,所以这里新建网站,这个网站只需要Ashx文件 public ...
- PowUp渗透脚本基本模块
PowUp脚本也位于PowerSploit下Privesc模块下 通常,在 Windows 下面我们可以通过内核漏洞来提升权限,但是,我们常常会碰到所处服务器通过内核漏洞提权是行不通的,这个时候,我们 ...
- Linux系统取证实践
目录 0x00 本课概述 0x01 用到命令 0x00 本课概述 本课时学习Linux系统下取证分析命令. 0x01 用到命令 1.top命令 2.ps命令 3.kill命令 4.linux系统日 ...
- 除法分块 luogu2261 (坑)
除法分块 除法分块 是指使用分块计算的方法求S=∑i=1n⌊ki⌋S=\sum^{n}_{i=1}{\lfloor{\frac{k}{i}}\rfloor}S=i=1∑n⌊ik⌋的值. 举个例子. ...
- PowerShell渗透--Empire
0x00 简介 Empire是一款针对Windows平台的,使用PowerShell脚本作为攻击载荷的渗透攻击框架代码具有从stager生成,提权到渗透维持的一系列功能,无需powershell.ex ...
- Zeebe服务学习5-多实例特性实践
一.背景 在0.21版本之前,Zeebe不支持多实例元素,在2019年10月9号发布的0.21版本中,加入这一特性, 主要是体现在Zeebe Modeler 0.7.0以及之后的版本中. 二.特性介绍 ...
- 利用Tampermonkey(油猴)+IDM实现百度云盘大文件下载;
1.浏览器的脚本选择: 说明:不同的浏览器安装的名称不一样,这里采用Firefox做测试,同样可按照以下列表对应下载: Chrome:Tampermonkey 或 Violent monkey Fir ...