CF375D Tree and Queries
题意翻译
给出一棵 n 个结点的树,每个结点有一个颜色 c i 。 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种。树的根节点是1。
感谢@elijahqi 提供的翻译
题目描述
You have a rooted tree consisting of n n n vertices. Each vertex of the tree has some color. We will assume that the tree vertices are numbered by integers from 1 to n n n . Then we represent the color of vertex v v v as cv c_{v} cv . The tree root is a vertex with number 1.
In this problem you need to answer to m m m queries. Each query is described by two integers vj,kj v_{j},k_{j} vj,kj . The answer to query vj,kj v_{j},k_{j} vj,kj is the number of such colors of vertices x x x , that the subtree of vertex vj v_{j} vj contains at least kj k_{j} kj vertices of color x x x .
You can find the definition of a rooted tree by the following link: http://en.wikipedia.org/wiki/Tree\_(graph\_theory).
输入输出格式
输入格式:
The first line contains two integers n n n and m m m $ (2<=n<=10^{5}; 1<=m<=10^{5}) $ . The next line contains a sequence of integers c1,c2,...,cn c_{1},c_{2},...,c_{n} c1,c2,...,cn (1<=ci<=105) (1<=c_{i}<=10^{5}) (1<=ci<=105) . The next n−1 n-1 n−1 lines contain the edges of the tree. The i i i -th line contains the numbers ai,bi a_{i},b_{i} ai,bi $ (1<=a_{i},b_{i}<=n; a_{i}≠b_{i}) $ — the vertices connected by an edge of the tree.
Next m m m lines contain the queries. The j j j -th line contains two integers vj,kj v_{j},k_{j} vj,kj $ (1<=v_{j}<=n; 1<=k_{j}<=10^{5}) $ .
输出格式:
Print m m m integers — the answers to the queries in the order the queries appear in the input.
输入输出样例
8 5
1 2 2 3 3 2 3 3
1 2
1 5
2 3
2 4
5 6
5 7
5 8
1 2
1 3
1 4
2 3
5 3
2
2
1
0
1
4 1
1 2 3 4
1 2
2 3
3 4
1 1
4
说明
A subtree of vertex v v v in a rooted tree with root r r r is a set of vertices $ {u :dist(r,v)+dist(v,u)=dist(r,u)} $ . Where dist(x,y) dist(x,y) dist(x,y) is the length (in edges) of the shortest path between vertices x x x and y y y .
Solution:
本题树上莫队。
求子树颜色个数,可以直接弄出dfs序,统计每个子树的入栈时间$inc$和$ouc$,然后对于询问变为dfs序上的区间颜色数查询,直接莫队就好了。
代码:
/*Code by 520 -- 10.19*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,m,to[N],net[N],h[N],cnt,a[N],bl[N],c[N];
int rc,dfn[N],inc[N],ouc[N],sum[N],ans[N];
struct node{
int l,r,k,id;
bool operator < (const node &a) const {return bl[l]==bl[a.l]?r<a.r:l<a.l;}
}t[N]; int gi(){
int a=;char x=getchar();
while(x<''||x>'') x=getchar();
while(x>=''&&x<='') a=(a<<)+(a<<)+(x^),x=getchar();
return a;
} il void Add(int u,int v){to[++cnt]=v,net[cnt]=h[u],h[u]=cnt;} void dfs(int u,int lst){
dfn[++rc]=u,inc[u]=rc;
for(RE int i=h[u];i;i=net[i])
if(to[i]!=lst) dfs(to[i],u);
ouc[u]=rc;
} il void add(int x){sum[++c[a[x]]]++;} il void del(int x){sum[c[a[x]]--]--;} int main(){
n=gi(),m=gi(); int blo=sqrt(n),u,v;
For(i,,n) a[i]=gi(),bl[i]=(i-)/blo+;
For(i,,n) u=gi(),v=gi(),Add(u,v),Add(v,u);
dfs(,);
For(i,,m) u=gi(),v=gi(),t[i]=node{inc[u],ouc[u],v,i};
sort(t+,t+m+);
for(RE int i=,l=,r=;i<=m;i++){
while(l<t[i].l) del(dfn[l]),l++;
while(l>t[i].l) --l,add(dfn[l]);
while(r<t[i].r) ++r,add(dfn[r]);
while(r>t[i].r) del(dfn[r]),r--;
ans[t[i].id]=sum[t[i].k];
}
For(i,,m) printf("%d\n",ans[i]);
return ;
}
CF375D Tree and Queries的更多相关文章
- 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++) 调了两个小时 这题要求维护& ...
- 「CF375D Tree and Queries」
题目 \(dsu\ on\ tree\)的板子题了 \(dsu\ on\ tree\)本质上一种优秀通过轻重链剖分优化到\(O(nlogn)\)的暴力 一般用来解决没有修改的允许离线的子树查询问题 首 ...
- CF375D Tree and Queries 题解
感觉CF的题目名都好朴素的样子 你谷链接 首先这题显然是个dsu on tree 但是我不会. 其次这题显然是个莫队.这我会啊! 然后会发现好像不是很对劲.因为每次询问都有一个k,貌似和传统的莫队数颜 ...
- 【题解】 Luogu CF375D Tree and Queries
原题传送门 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 我博客中对莫队的详细介绍 莫队好题 我一上来想写线段树,随后觉得不好写并弃坑 我们可以看见没有修改操作,钦定莫队 但这是在树上,所以不能 ...
- cf375D. Tree and Queries(莫队)
题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...
- 【题解】CF375D Tree and Queries
Link \(\text{Solution:}\) 讲实话这题有点烦,不知道为啥改了下\(\text{dfs}\)就过了--原版本\(dfs\)好像没啥错啊-- 其实对于子树问题,我们求出原来树的\( ...
- [Codeforces Round #221 (Div. 1)][D. Tree and Queries]
题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...
- Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)
题目链接 Tree and Queries 题目大意 给出一棵树和每个节点的颜色.每次询问$vj, kj$ 你需要回答在以$vj$为根的子树中满足条件的的颜色数目, 条件:具有该颜色的节点数量至少 ...
- CodeForces 375D Tree and Queries 莫队||DFS序
Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...
随机推荐
- ansible 远程以普通用户执行命令
1. ansible 10.0.0.1 -m raw -a "date" -u www 2.在ansible的主机配置文件中指定ssh_uservi/etc/ansible/hos ...
- 20155202张旭《网络对抗技术》 week1 PC平台逆向破解及Bof基础实践
20155202张旭<网络对抗技术> week1 PC平台逆向破解及Bof基础实践 1.实践目标: 实践对象:一个名为pwn1的linux可执行文件. 该程序正常执行流程是: main调用 ...
- 《图说VR入门》——DeepoonVR的大鹏(陀螺仪)枪
<图说VR入门>--VR大朋的(陀螺仪)枪 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/ar ...
- Luogu P2483 【模板】k短路([SDOI2010]魔法猪学院)
说实话,看到这道题的洛谷评级我傻了(传说中的最高难度) 然后看完题目才确定这真的是一道k短路的裸题. 也就敲了个A*吧,15分钟竟然没有调试一遍过. 欧洲玄学. 看题目,主要是找几条从1走到n的路加起 ...
- [清华集训2015 Day1]主旋律-[状压dp+容斥]
Description Solution f[i]表示状态i所代表的点构成的强连通图方案数. g[i]表示状态i所代表的的点形成奇数个强连通图的方案数-偶数个强连通图的方案数. g是用来容斥的. 先用 ...
- CSS快速入门-组合选择器
<div class="gradefather"> hello1 <div class="father">hello2 <p cl ...
- centos7 部署mysql-5.7.20
一.系统环境 系统:CentOS Linux release 7.5 mysqlb进制包:mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 1)依赖包安装 yum ...
- linux下tomcat指定jdk和配置运行参数
一.指定运行jdk 1)set classpath.sh和catalina.sh中写入: export JAVA_HOME=/usr/local/java/jdk1.8.0_121 export JR ...
- Nginx浅析
Nginx浅析 Nginx是什么 总的来说,Nginx其实就是一个和apache类似的服务器软件. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like ...
- LeetCode 9. Palindrome Number(回文数)
Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same back ...