#include <bits/stdc++.h>
//#pragma GCC optimize(3)
using namespace std;
typedef long long ll;
int n,m;
int val[200010];
vector <int > edge[200010];
int ct=0;
int id[200010],siz[200010];
int cnt[200010];
struct node{
int l,r,k,id;
}q[200010];
int c[200010];
void dfs(int u,int f){
id[u]=++ct;
siz[u]=1;
c[ct]=val[u];
for(auto e:edge[u]){
if(e==f) continue;
dfs(e,u);
siz[u]+=siz[e];
}
}
int bl;
int l=1,r=0;
bool mycmp(node a,node b){
if(a.l/bl==b.l/bl){
if(a.l/bl%2==1){
return a.r<b.r;
}else{
return a.r>b.r;
}
}else{
return a.l/bl<b.l/bl;
}
}
int ans[200010];
int res=0;
int num[200010];
void update(int x,int p)
{
x=c[x];
cnt[x]+=p;
if(~p) num[cnt[x]]++;
else num[cnt[x]+1]--;
}
int main(){
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>val[i];
for(int i=1,u,v;i<n;i++){
cin>>u>>v;
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs(1,0);
bl=sqrt(n);
// cin>>m;
for(int i=1,u,k;i<=m;i++){
cin>>u>>k;
q[i].l=id[u];
q[i].r=id[u]+siz[u]-1;
q[i].k=k;
q[i].id=i;
}
sort(q+1,q+m+1,mycmp);
for(int i=1;i<=m;i++){
int ql=q[i].l,qr=q[i].r;
while(l<ql) update(l++,-1);
while(r>qr) update(r--,-1);
while(l>ql) update(--l,1);
while(r<qr) update(++r,1);
ans[q[i].id]=num[q[i].k];
}
for(int i=1;i<=m;i++) cout<<ans[i]<<'\n';
return 0;
}
#include<bits/stdc++.h>
#define maxn 200010
using namespace std;
int n,m,bl,l,r,tot;
int a[maxn],c[maxn],cnt[maxn],ans[maxn],num[maxn];
struct query
{
int l,r,id,pos,ask;
}q[maxn];
bool mycmp(query a,query b){
if(a.l/bl==b.l/bl){
if(a.l/bl%2==1){
return a.r<b.r;
}else{
return a.r>b.r;
}
}else{
return a.l/bl<b.l/bl;
}
}
vector <int> edge[210001];
int dfn_cnt;
int siz[maxn],dfn[maxn];
void dfs(int u,int f){
dfn[u]=++dfn_cnt;
siz[u]=1;
c[dfn_cnt]=a[u];
for(auto e:edge[u]){
if(e==f) continue;
dfs(e,u);
siz[u]+=siz[e];
}
}
void update(int x,int p)
{
x=c[x];
cnt[x]+=p;
if(~p) num[cnt[x]]++;
else num[cnt[x]+1]--;
}
int main()
{
ios::sync_with_stdio(0);
// read(n),read(m);
cin>>n>>m;
bl=sqrt(n);
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1,u,v;i<n;++i)
{
cin>>u>>v;
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs(1,0);
for(int i=1,u,k;i<=m;++i)
{
cin>>u>>k;
q[i].l=dfn[u];
q[i].r=dfn[u]+siz[u]-1;
q[i].ask=k;
q[i].id=i;
// q[i].pos=q[i].l/block;
}
sort(q+1,q+m+1,mycmp);
l=1,r=0;
for(int i=1;i<=m;i++){
int ql=q[i].l,qr=q[i].r;
while(l<ql) update(l++,-1);
while(r>qr) update(r--,-1);
while(l>ql) update(--l,1);
while(r<qr) update(++r,1);
ans[q[i].id]=num[q[i].ask];
}
for(int i=1;i<=m;++i) cout<<ans[i]<<'\n';
return 0;
}
这两份代码上面的 re 下面的 ac
到底有什么区别???????