欢迎大家来玩找不同
查看原帖
欢迎大家来玩找不同
303531
ReverBer楼主2024/11/19 21:56
#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

到底有什么区别???????

2024/11/19 21:56
加载中...