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序区间 ...
随机推荐
- P2331 [SCOI2005]最大子矩阵
题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- 基于树莓派3的CAN总线编程
基于树莓派3的CAN总线编程 原创 2016年09月08日 10:16:13 标签: 树莓派3 / MCP2515 / CAN总线 / python / 命令行 5254 简介 树莓派3使用Pytho ...
- 2017-2018 Exp8 Web基础 20155214
目录 Exp8 Web基础 实验内容 建站过程 SQL注入 知识点 Exp8 Web基础 实验内容 实验环境 主机 Kali 靶机 Kali 实验工具 后台语言 'PHP' 服务器 'Apache' ...
- Linux下Maven+SVN自动打包脚本
公司的开发环境每次部署项目都很麻烦,需要手动打包并上传上去.这个太麻烦了,所以就准备搞个自动打包的脚本.脚本自动从svn代码库里面更新最新的代码下来,然后maven打包,最后把war包丢到to ...
- 配置yum,nc,telnet
一.学习中问题 最近学习在学习Hadoop的一个子项目Zookeeper,在测试其中的“四字命令”---”echo ruok|nc localhost 2181“时发现命令无法被识别,如下图所示: [ ...
- PHP调用WCF提供的方法
一.准备工作 1.安装wampserver:过程略 2.配置wampserver: 2.1打开php.ini文件,去掉 ;extension=php_soap.dll 这里那个分号. 也有说把这个 ; ...
- Flutter - ListView禁止用户上下滑动
ListView禁止用户上下滑动可以使用physics属性 physics: const NeverScrollableScrollPhysics()
- 在git与tortoisegit中使用openSSH与PuTTY
问题 在使用Git与tortoisegit的时候,指定远程版本库的地址有2种方式: 使用https方式的git地址非常直接(https://xxx.oschina.net/xxx.git),基本上什么 ...
- Java关键字 Finally执行与break, continue, return等关键字的关系
长文短总结: 在程序没有在执行到finally之前异常退出的情况下,finally是一定执行的,即在finally之前的return语句将在finally执行之后执行. finally总是在控制转移语 ...
- Python提示信息表示内容
=此页面列出了PyLint 1.1.0支持的所有消息,按消息文本排序.还有一个按消息代码排序的所有代码列表. E0001,F0001,W0511(消息不同) E0103:循环中%r不正确W1501 ...