CF375D题解
昨天教练布置的莫队作业,然后一看我老早就用 DSU on tree 切了,来补题解(
题意
静态树询问子树中,同一种元素的数量不小于 \(k\) 的元素有多少种。
莫队做法
容易观察到子树在 \(\rm DFS\) 序上是一段连续的区间,于是问题就转化成了区间。
维护一个桶来记录有多少种元素在区间中有 \(x\) 个,在更新的时候注意是否等于 \(k\) 即可。
DSU on tree做法
同样维护一个桶,记录同样的东西,判定也是同样的。
所以 DSU on tree 就是复杂度为 Polylog 的莫队?(大雾)
code:(只写了 DSU on tree)
#include<cstdio>
const int M=1e5+5;
int n,m,Son,f[M],siz[M],son[M],col[M],num[M],cnt[M];
struct Edge{
int to;Edge*nx;
}e[M<<1],*h[M],*qwq=e;
struct Q{
int k,ans;Q*nx;
}q[M],*t[M],*tot=q+1;
inline void Add(const int&u,const int&v){
*qwq=(Edge){v,h[u]};h[u]=qwq++;
*qwq=(Edge){u,h[v]};h[v]=qwq++;
}
void DFS(int u){
siz[u]=1;
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u])continue;
f[v]=u;DFS(v);siz[u]+=siz[v];
if(siz[v]>siz[son[u]])son[u]=v;
}
}
void change(int u,bool keep){
if(keep)++cnt[++num[col[u]]];
else --cnt[num[col[u]]--];
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u]||v==Son)continue;
change(v,keep);
}
}
void Query(int u,bool keep){
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u]||v==son[u])continue;
Query(v,false);
}
if(son[u])Query(son[u],true),Son=son[u];
change(u,true);Son=0;
for(Q*E=t[u];E;E=E->nx)E->ans=cnt[E->k];
if(!keep)change(u,false);
}
signed main(){
register int i,u,v;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)scanf("%d",col+i);
for(i=1;i<n;++i)scanf("%d%d",&u,&v),Add(u,v);
for(i=1;i<=m;++i)scanf("%d%d",&u,&tot->k),tot->nx=t[u],t[u]=tot++;
DFS(1);Query(1,true);
for(i=1;i<=m;++i)printf("%d\n",q[i].ans);
}
CF375D题解的更多相关文章
- CF375D Tree and Queries 题解
感觉CF的题目名都好朴素的样子 你谷链接 首先这题显然是个dsu on tree 但是我不会. 其次这题显然是个莫队.这我会啊! 然后会发现好像不是很对劲.因为每次询问都有一个k,貌似和传统的莫队数颜 ...
- 【题解】 Luogu CF375D Tree and Queries
原题传送门 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 我博客中对莫队的详细介绍 莫队好题 我一上来想写线段树,随后觉得不好写并弃坑 我们可以看见没有修改操作,钦定莫队 但这是在树上,所以不能 ...
- 题解 CF375D 【Tree and Queries】
首先,子树上的查询问题可以通过$DFS$序转为序列问题 再一看,没有修改,可以离线,这不就是莫队吗? 我们用$sum_i$表示出现次数$\geq i$的个数 用$val_i$表示第$i$种颜色的出现次 ...
- 【题解】CF375D Tree and Queries
Link \(\text{Solution:}\) 讲实话这题有点烦,不知道为啥改了下\(\text{dfs}\)就过了--原版本\(dfs\)好像没啥错啊-- 其实对于子树问题,我们求出原来树的\( ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
随机推荐
- JSP、Servlet和Spring MVC
感谢原博主!!!https://blog.csdn.net/whut2010hj/article/details/80874008 版权声明:本文为博主原创文章,遵循CC 4.0 BY版权协议,转载请 ...
- 自动循环滚动ScrollView
// // SBCycleScrollView.h // SBCycleScrollView // // Created by luo.h on 15/7/12. // Copyright (c) 2 ...
- shell脚本三剑客之awk
shell脚本之awk命令 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具 适合小型文本数据 1.工作原理 2.AWK格式 3.按行输入文本 4.按字段输入文本 5.通过管道符号,双引号调 ...
- shell基础——数组
定义数组 #小括号,空格 arr=(v1 v2 v3) arr=(`ls`) 打印数组 echo ${arr[0]} #下标从0开始 echo ${arr[*]} #整个数组 echo ${arr[@ ...
- Scala函数高级篇
一.匿名函数 没有名字的函数就是匿名函数,格式:(x:Int)=>{函数体} x:表示输入参数类型:Int:表示输入参数类型:函数体:表示具体代码逻辑 传递匿名函数至简原则: 参数的类型可以省略 ...
- webfunny前端系统:如何解决警报设置触发常见问题
大家好,经常会有小伙伴在使用webfunny监控系统中,遇到无法触发警报的问题,其实都是一些配置上的疏漏,在这里给大家总结一下: PS:只要消息中心里有警报,则说明触发机制没有问题.其他方式没有触发, ...
- Maven获取resources的文件路径、读取resources的文件
路径问题一切要看编译后的文件路径 比如,源文件路径是: 而编译后的文件路径为: 也就是说,resources文件夹下的文件在编译后,都是为根目录,这种情况下,比如我要读取resources 文件夹下的 ...
- Solution -「CF 848D」Shake It!
\(\mathcal{Description}\) Link. 初始有一个有向图 \(G=(V,E)\),\(V=\{s,t\}\),\(E=\langle s,t\rangle\),一次操作 ...
- Solution -「POI 2014」「洛谷 P5904」HOT-Hotels 加强版
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的树,求无序三元组 \((u,v,w)\) 的个数,满足其中任意两点树上距离相等. \(n\le1 ...
- VS2019如何设置程序以管理员权限启动
最重要的一点.本文解释的是C#项目如何以管理员权限启动. 一个很大的误导项 该图片是C++程序的项目配置属性.C#项目中并找不到.然而网上的很多教程没有说清楚.导致我找了这个菜单找了很久. C#项目的 ...