传送门

虽然这题是一道二合一,也不算难,但还是学到了很多东西啊,\(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] 雪松果树的更多相关文章

  1. P5384[Cnoi2019]雪松果树 (长链剖分)

    题面 一棵以 1 1 1 为根的 N N N 个节点的有根树, Q Q Q 次询问,每次问一个点 u u u 的 k k k 级兄弟有多少个(第 k k k 代祖先的第 k k k 代孩子),如果没有 ...

  2. linux 常用命令--------雪松整理

    linux 常用命令--------雪松整理 博客: http://hi.baidu.com/quanzhou722/blog错误在所难免,还望指正!========================= ...

  3. LOJ6276:果树——题解

    https://loj.ac/problem/6276#submit_code NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求.这颗果树有N 个节点 ...

  4. Jmeter查看结果树Unicode编码转中文方法

    本文为转载微信公众号文章,如作者发现后不愿意,请联系我进行删除 在jmeter工具的使用中,不管是测试接口还是调试性能时,查看结果树必不可少,然而在查看响应数据时,其中的中文经常以Unicode的编码 ...

  5. 【线段树 扫描线 二维数点】loj#6276. 果树

    路径计数转成二维数点很妙啊 题目描述 NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求. 这颗果树有 $N$ 个节点,标号 $1 \ldots N$ ...

  6. Jmeter学习笔记(七)——监听器元件之察看结果树

    在jmeter中,如果我们需要查看请求结果就需要添加查看结果树,这个监听器元件有那些功能呢? 一.察看结果树界面如下 二.察看结果树界面功能说明 1.所有数据写入文件 (1)文件名:可以通过浏览,选择 ...

  7. P5385 [Cnoi2019]须臾幻境(LCT+主席树,思维题)

    题目 P5385 [Cnoi2019]须臾幻境 做法 考虑一条边\((u,v)\)是否\([L,R]\)中的贡献:\([L,R]\)中第一条位于\(u,v\)链的边,则减少了一个联通块 实现:\(LC ...

  8. P5390 [Cnoi2019]数学作业

    P5390 [Cnoi2019]数学作业求子集异或和的和拆成2进制,假设有x个数这一位为1,剩下n-x个数对答案没有贡献,对于这一位而言,对答案的贡献就是,x个数选奇数个数的方案数*2^(n-x).由 ...

  9. 【jmeter】将“察看结果树”中的数据保存到本地

    操作说明: 1. "察看结果树"页面,[配置]导出项: 2. "察看结果树"页面,[文件名]选框输入导出文件及路径:  3. 点击jmeter[启动]按钮,响应 ...

随机推荐

  1. FFmpeg(六) 播放视频之GLSurfaceView显示RGB数据

    一.播放视频说明 1.两种方式播放视频 ①shader播放YUV,后面再介绍. ②RGB直接显示数据,简单.性能差,用到FFmpeg的格式转换,没有shader效率高.本文介绍这个方式. 2.GLSu ...

  2. 超链接target属性的取值和作用?

    <a>标签的target属性规定在何处打开连接文档 属性值 _black:点击一次打开一个新窗口 _new:始终在同一个新窗口中打开 _self:默认,在当前窗口打开 _parent:在父 ...

  3. python爬虫之基本类库

    简单梳理一下爬虫原理: 1.发送请求 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应. 2.获取响应内容 如果服务器能正常响应(正常 ...

  4. Pandas处理日常EXCEL表格的便捷操作

    第一次写博客,写的可能有点乱,有问题可以一起探讨.格式可能控制也不是太好. 1.日常的数据集大多带有中文格式,例如“公务员招聘岗位汇总.xls”.我们使用pandas的read_csv()函数读取可能 ...

  5. PTA 7-3 编辑距离问题 (30 分)

    一.实践题目 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: ()删除一个字符: ()插入一个字符: ()将一个字符改为另一个字符. 将字符串A变换为字符串 ...

  6. drf框架序列化和返序列化

    0903自我总结 drf框架序列化和反序列化 from rest_framework import serializers 一.自己对于序列化和反序列化使用的分类 前后端交互主要有get,post,p ...

  7. POJ 3295 Tautology(构造法)

    题目网址:http://poj.org/problem?id=3295 题目: Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Su ...

  8. spring cloud alibaba 简介

    ### Spring Cloud Alibaba [官方github地址](https://github.com/alibaba/spring-cloud-alibaba) Spring Cloud ...

  9. 13.Linux文件查找-find命令

    find 命令的基本语法如下: 命令 路径 选项 表达式 动作 find [path...] [options] [expression] [action] 查找 地区 妹纸 18-25岁 约? (1 ...

  10. Leetcode(7)整数反转

    Leetcode(6)Z字形变换 [题目表述]: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 第一次:转字符串处理 执行用时:40 ms: 内存消耗:11.6MB 效果: ...