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. SpringBoot中JPA,返回List排序

    这里简单示例,利用query,根据“createtime”字段,进行 desc 排序,最近日期的数据在最前面. public List<StatusEvent> findAll(Speci ...

  2. Sequence (矩阵快速幂+快速幂+费马小定理)

            Holion August will eat every thing he has found. Now there are many foods,but he does not wa ...

  3. 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型

    一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...

  4. 【原创】经验分享:一个Content-Length引发的血案(almost....)

    前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...

  5. Mysql业务设计(逻辑设计)

    逻辑设计 数据库设计三大范式 数据库设计第一大范式 数据库表中所有的字段都只具有单一属性 单一属性的列是由基本数据类型所构成 设计出来的表都是简单的二维表 数据库设计的第二大范式 要求表中只有一个业务 ...

  6. jzoj 3431. 【GDOI2014模拟】网格

    Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m.现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过 ...

  7. oracle之三rman 备份

    rman 备份 7.1 归档方式下rman备份常用语法: 7.1.1 backup 备份 1)备份全库:1.1 RMAN> backup database format='/u01/myrman ...

  8. 吴恩达《深度学习》-第五门课 序列模型(Sequence Models)-第三周 序列模型和注意力机制(Sequence models & Attention mechanism)-课程笔记

    第三周 序列模型和注意力机制(Sequence models & Attention mechanism) 3.1 序列结构的各种序列(Various sequence to sequence ...

  9. pytest文档1-pytest+Allure+jenkins+邮箱发送

    前言: 1.pytest+allure是目前很多公司使用较多的一种报告样式,因为它更详细,各种指标更直观(简单的说就是看着更高大上,更能装X). 环境准备: 1.Windows10 2.Allure ...

  10. [LeetCode]322. 零钱兑换(DP)

    题目 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coin ...