Codeforces 375 D Tree and Queries
Discription
You have a rooted tree consisting of 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. Then we represent the color of vertex v as cv. The tree root is a vertex with number 1.
In this problem you need to answer to m queries. Each query is described by two integers vj, kj. The answer to query vj, kj is the number of such colors of vertices x, that the subtree of vertex vj contains at least kj vertices of color x.
You can find the definition of a rooted tree by the following link: http://en.wikipedia.org/wiki/Tree_(graph_theory).
Input
The first line contains two integers n and m (2 ≤ n ≤ 105; 1 ≤ m ≤ 105). The next line contains a sequence of integers c1, c2, ..., cn (1 ≤ ci ≤ 105). The next n - 1 lines contain the edges of the tree. The i-th line contains the numbers ai, bi (1 ≤ ai, bi ≤ n; ai ≠ bi) — the vertices connected by an edge of the tree.
Next m lines contain the queries. The j-th line contains two integers vj, kj (1 ≤ vj ≤ n; 1 ≤ kj ≤ 105).
Output
Print m integers — the answers to the queries in the order the queries appear in the input.
Example
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
Note
A subtree of vertex v in a rooted tree with root r is a set of vertices {u : dist(r, v) + dist(v, u) = dist(r, u)}. Where dist(x, y) is the length (in edges) of the shortest path between vertices x and y.
dfs+莫队,本来挺傻的一个题,结果莫队写错了2333
以前都不是很在意莫队区间端点的移动,但是今天的事情证明了,莫队端点移动要先扩张区间,然后再缩减区间,不然有些题出现了左端点比右端点大的区间会挂掉2333
#include<bits/stdc++.h>
#define ll long long
const int maxn=100005;
using namespace std;
struct ask{
int l,r,k,bl,num;
bool operator <(const ask &u)const{
return bl==u.bl?((bl&1)?r<u.r:r>u.r):bl<u.bl;
}
}q[maxn];
int f[maxn],col[maxn];
int to[maxn*2],ne[maxn*2],hd[maxn];
int dfn[maxn],n,m,a[maxn],siz[maxn];
int cnt[maxn],dc=0,sz,ans[maxn],le,ri; void dfs(int x,int fa){
dfn[x]=++dc,a[dc]=col[x],siz[x]=1;
for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa){
dfs(to[i],x);
siz[x]+=siz[to[i]];
}
} inline void update(int x,int y){
for(;x<=100000;x+=x&-x) f[x]+=y;
} inline int query(int x){
int an=0;
for(;x;x-=x&-x) an+=f[x];
return an;
} inline void add(int x){
if(cnt[a[x]]) update(cnt[a[x]],-1);
cnt[a[x]]++;
update(cnt[a[x]],1);
} inline void del(int x){
update(cnt[a[x]],-1);
cnt[a[x]]--;
if(cnt[a[x]]) update(cnt[a[x]],1);
} inline void solve(){
sort(q+1,q+m+1),le=1,ri=0;
for(int i=1;i<=m;i++){
while(ri<q[i].r) ri++,add(ri);
while(le>q[i].l) le--,add(le);
while(ri>q[i].r) del(ri),ri--;
while(le<q[i].l) del(le),le++;
ans[q[i].num]=query(100000)-query(q[i].k-1);
}
} int main(){
scanf("%d%d",&n,&m),sz=sqrt(n);
for(int i=1;i<=n;i++) scanf("%d",col+i);
int uu,vv;
for(int i=1;i<n;i++){
scanf("%d%d",&uu,&vv);
to[i]=vv,ne[i]=hd[uu],hd[uu]=i;
to[i+n]=uu,ne[i+n]=hd[vv],hd[vv]=i+n;
}
dfs(1,1);
for(int i=1;i<=m;i++){
scanf("%d%d",&uu,&vv);
q[i].num=i,q[i].k=vv,q[i].l=dfn[uu],q[i].r=dfn[uu]+siz[uu]-1;
q[i].bl=(q[i].l-1)/sz+1;
} solve(); for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
Codeforces 375 D Tree and Queries的更多相关文章
- codeforces 375D:Tree and Queries
Description You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. ...
- Codeforces 375D D. Tree and Queries
传送门 题意: 给一棵树,每个节点有一个颜色,询问x为根的子树,出现次数大于等于k的颜色个数. 输入格式: 第一行 2 个数 n,m 表示节点数和询问数. 接下来一行 n 个数,第 i 个数 ci ...
- [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序区间 ...
- codeforces 570 D. Tree Requests 树状数组+dfs搜索序
链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...
- 【19.77%】【codeforces 570D】Tree Requests
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Problem - D - Codeforces Fix a Tree
Problem - D - Codeforces Fix a Tree 看完第一名的代码,顿然醒悟... 我可以把所有单独的点全部当成线,那么只有线和环. 如果全是线的话,直接线的条数-1,便是操作 ...
- codeforces 570 D Tree Requests
题意:给出一棵树.每一个结点都有一个字母,有非常多次询问,每次询问.以结点v为根的子树中高度为h的后代是否可以经过调整变成一个回文串. 做法: 推断能否够构成一个回文串的话,仅仅须要知道是否有大于一个 ...
随机推荐
- 661. Image Smoother@python
Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother t ...
- [LUOGU] P1551 亲戚
题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 题目描述 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如 ...
- Centos忘记密码解决方法
centos6.8忘记root密码解决方法 重启系统后出现GRUB界面在引导装载程序菜单上,用上下方向键选择你忘记密码的那个系统键入"e" 来进入编辑模式. 接下来你可以看到如下图 ...
- CM3中数据传输对齐/非对齐方式
在CM3中,非对齐的数据传输只发生在常规的数据传送指令中,如LDR.LDRH.LDRSH.其他指令则不支持,包括: 1.多个数据的加载.存储(LDM/STM). 2.堆栈操作PUSH.POP. 3.互 ...
- bash初识,特性,用法/网站
目录 一.Bash初识 Bash Shell介绍 Bash Shell的作用 Bash 两种方式 命令提示符 二.Shell的基本语法 三.Shell的基本特性 1.命令补全 tab 2. Linux ...
- (转)iOS开发之Pch预编译文件的创建
本文转自 http://www.cnblogs.com/496668219long/p/4568265.html 在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹 ...
- Verilog学习笔记基本语法篇(八)········ 结构说明语句
Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial; 2) always; 3) task; 4) function; 1) initial说明语句: 一个程序 ...
- Java-终止应用程序
参考了:http://www.cnblogs.com/xwdreamer/archive/2011/01/07/2297045.html 理论在上面链接中有详细的解释 package com.tj; ...
- IPy模块--IP地址处理
Python之实用的IP地址处理模块IPy 实用的IP地址处理模块IPy 在IP地址规划中,涉及到计算大量的IP地址,包括网段.网络掩码.广播地址.子网数.IP类型等 别担心,Ipy模块拯救你.Ipy ...
- 如何修改 WordPress 的默认 Gravatar 头像
如何修改 WordPress 的默认 Gravatar 头像? wordpress默认的头像是下面这种 在Settings的Discussion中,默认选择第一个Mystery Person, 意思是 ...