Link

\(\text{Solution:}\)

讲实话这题有点烦,不知道为啥改了下\(\text{dfs}\)就过了……原版本\(dfs\)好像没啥错啊……

其实对于子树问题,我们求出原来树的\(dfs\)序列,则可以将它转化为一个序列问题。注意题目中说的是有根树,以\(1\)为根。

那么,我们一遍\(dfs\)求出序列后,把它插到询问里面,即更新为原序列。

注意,我们对应\(dfs\)序并不是原来的点,所以还需要一个数组\(rk\)维护映射\(point\to dfn\).

那么,对于维护,一种最直接的树状数组维护前缀和,复杂度套一个\(Log\).

另一种,我们考虑一下如何\(O(1)\)来维护,维护一个计数数组和\(sum\)数组。

每次更新一个数,如果是加,那么它原来次数的\(sum\)数组不用修改,在加完的\(sum\)数组处修改即可。因为这样是一路加过去的,手动模拟一下小样例更好理解。

对于删掉一个数,显然次数\(-1\),那么对应地它当前给\(sum\)数组的贡献就不再奏效,于是先把它的贡献清除掉,再将次数\(-1\).

我们通过以上做到了\(O(1)\)维护前缀和。

那么我们就可以莫队了。将询问离线,并分块排序,复杂度\(O(n\sqrt{n}).\)

玄学\(dfs\)真不知道怎么搞的,调了半天……

#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+10;
int dfn[MAXN],n,m,tot,head[MAXN<<1];
int cnt[MAXN],ans[MAXN],dfstime,rk[MAXN];
int bl[MAXN],S,sum[MAXN],c[MAXN],siz[MAXN];
pair<int,int>Rem[MAXN];
struct edge{
int nxt,to;
}e[MAXN<<1];
inline void add(int x,int y){e[++tot].to=y;e[tot].nxt=head[x];head[x]=tot;}
void dfs(int x,int pre){
rk[dfn[x]=++dfstime]=x;
Rem[x].first=dfstime;siz[x]=1;
for(int i=head[x];i;i=e[i].nxt){
int j=e[i].to;
if(pre==j)continue;
dfs(j,x);siz[x]+=siz[j];
}
Rem[x].second=dfstime;
}
struct Q{
int l,r,k,id;
bool operator<(const Q&B)const{
if(bl[l]==bl[B.l])return r<B.r;
return bl[l]<bl[B.l];
}
}q[MAXN];
inline void inr(int x){++cnt[c[rk[x]]],++sum[cnt[c[rk[x]]]];}
inline void del(int x){--sum[cnt[c[rk[x]]]],--cnt[c[rk[x]]];} int main(){
scanf("%d%d",&n,&m);S=sqrt(n);
for(int i=1;i<=n;++i)scanf("%d",&c[i]),bl[i]=(i-1)/S+1;
for(int i=1;i<n;++i){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1,0);
for(int i=1,v;i<=m;++i){
scanf("%d%d",&v,&q[i].k);q[i].id=i;
q[i].l=dfn[v];q[i].r=dfn[v]+siz[v]-1;
}
sort(q+1,q+m+1);int l=1,r=0;
for(int i=1;i<=m;++i){
int ql=q[i].l,qr=q[i].r;
while(l<ql)del(l++);
while(l>ql)inr(--l);
while(r<qr)inr(++r);
while(r>qr)del(r--);
ans[q[i].id]=sum[q[i].k];
}
for(int i=1;i<=m;++i)printf("%d\n",ans[i]);
return 0;
}

【题解】CF375D Tree and Queries的更多相关文章

  1. CF375D Tree and Queries 题解

    感觉CF的题目名都好朴素的样子 你谷链接 首先这题显然是个dsu on tree 但是我不会. 其次这题显然是个莫队.这我会啊! 然后会发现好像不是很对劲.因为每次询问都有一个k,貌似和传统的莫队数颜 ...

  2. 【题解】 Luogu CF375D Tree and Queries

    原题传送门 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 我博客中对莫队的详细介绍 莫队好题 我一上来想写线段树,随后觉得不好写并弃坑 我们可以看见没有修改操作,钦定莫队 但这是在树上,所以不能 ...

  3. CF375D Tree and Queries

    题意翻译 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. 感谢@elijahqi 提供的翻译 ...

  4. CF375D Tree and Queries(dsu on tree)

    思路 dsu on tree的板子,可惜人傻把 for(int i=fir[u];i;i=nxt[i]) 打成 for(int i=fir[u];i<=n;i++) 调了两个小时 这题要求维护& ...

  5. 「CF375D Tree and Queries」

    题目 \(dsu\ on\ tree\)的板子题了 \(dsu\ on\ tree\)本质上一种优秀通过轻重链剖分优化到\(O(nlogn)\)的暴力 一般用来解决没有修改的允许离线的子树查询问题 首 ...

  6. cf375D. Tree and Queries(莫队)

    题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...

  7. [Codeforces Round #221 (Div. 1)][D. Tree and Queries]

    题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...

  8. CodeForces 375D Tree and Queries 莫队||DFS序

    Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...

  9. Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)

    题目链接  Tree and Queries 题目大意  给出一棵树和每个节点的颜色.每次询问$vj, kj$ 你需要回答在以$vj$为根的子树中满足条件的的颜色数目, 条件:具有该颜色的节点数量至少 ...

随机推荐

  1. 网络测速神器:SpeedTest深度指南

    最近在测试一个项目,里面涉及到一个测试case:在linux服务器上,当网络带宽较差时,观察服务的消息处理能力和表现.限制网卡带宽有许多方法,比如Wondershaper或者ethtool.那验证限速 ...

  2. Android开发之模拟器genymotion安装apk出现错误: Install_failed_invalid_URI

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. install failed invalid uri Android开发之模拟器ge ...

  3. Zabbix-4.0-设置钉钉报警脚本

    问题:当服务器发生报错时,有一个信息能实现自动发送到我的手机或者应用上,以达到对服务器的实时的监控与处理.邮件与短信不能满足实时性,于是想到了钉钉的通知. 思路:在钉钉里面建一个群,群里面拉个机器人. ...

  4. [BUUOJ记录] [BSidesCF 2020]Had a bad day

    主要考察文件包含以及php://filter伪协议的一个小trick.题目很简单,但是因为不知道这个trick卡了很久,记录一下 进入题目看到有两个按钮,没有其他信息: 点击按钮显示出来一张图片,然后 ...

  5. vue 多环境打包

    https://cli.vuejs.org/zh/guide/mode-and-env.html#%E6%A8%A1%E5%BC%8F 模式 模式是 Vue CLI 项目中一个重要的概念.默认情况下, ...

  6. 使用java8的方法引用替换硬编码

    背景 想必大家在项目中都有遇到把一个列表的多个字段累加求和的情况,也就是一个列表的总计.有的童鞋问,这个不是给前端做的吗?后端不是只需要把列表返回就行了嘛...没错,我也是这样想的,但是在一场和前端的 ...

  7. C#知识点:抽象类和接口浅谈

    首先介绍什么是抽象类? 抽象类用关键字abstract修饰的类就是叫抽象类,抽象类天生的作用就是被继承的,所以不能实例化,只能被继承.而且 abstract 关键字不能和sealed一起使用,因为se ...

  8. docker 停止、启动、删除镜像指令

    容器 docker ps // 查看所有正在运行容器 docker stop containerId // containerId 是容器的ID docker ps -a // 查看所有容器 dock ...

  9. 获取JSO字符串的key和value值

    import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.HashMap; import java. ...

  10. html基础:js

    js是一种脚本语言.在html中起到操控行为的作用.在html中,html代码如果是一个人的话,那么js就是这个人的行为 js在html的head中被引用,也可以在body中被引用.引用方式用< ...