求助玄学卡常 92pts TLE on #13
查看原帖
求助玄学卡常 92pts TLE on #13
663638
Butterfly_qwq楼主2024/1/23 19:51

初始代码:

#include<bits/stdc++.h>
using namespace std;
#define blk(i) (((i)-1)/B+1)
#define lft(i) (((i)-1)*B+1)
#define rgt(i) min((i)*B,n)
const int N=114514;
int n,Q,l=1,B,r,s[N],a[N],rec[N],ans[N],dfn[N],sz[N],nfd[N],idx;
struct edge
{
	int to,next;
};
struct graph
{
	int cnt;
	int head[N];
	edge e[N];
	void clear()
	{
		cnt=0;
		memset(head,0,sizeof(head));
	}
	void add(int u,int v)
	{
		e[++cnt]=(edge){v,head[u]};
		head[u]=cnt;
	}
	#define wk(i,g,u) for(int i=g.head[u];i;i=g.e[i].next)
}g;
struct query
{
	int l,r,k,no;
	bool operator<(query a)
	{
		if(blk(l)^blk(a.l))return blk(l)<blk(a.l);
		return r<a.r;
	}
}q[N];
void dfs(int u,int fa)
{
	sz[u]=1;
	dfn[u]=++idx;
	nfd[idx]=u;
	wk(i,g,u)
	{
		int v=g.e[i].to;
		if(v==fa)continue;
		dfs(v,u);
		sz[u]+=sz[v];
	}
}
void add(int u)
{
	s[++rec[a[nfd[u]]]]++;
}
void del(int u)
{
	s[rec[a[nfd[u]]]--]--;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>Q;
	B=sqrt(n);
	for(int i=1;i<=n;i++)cin>>a[i];
	g.clear();
	for(int i=1,u,v;i<n;i++)
	{
		cin>>u>>v;
		g.add(u,v);
		g.add(v,u);
	}
	dfs(1,0);
	for(int i=1,u;i<=Q;i++)
	{
		cin>>u>>q[i].k;
		q[i].l=dfn[u];
		q[i].r=dfn[u]+sz[u]-1;
		q[i].no=i;
	}
	sort(q+1,q+Q+1);
	for(int i=1;i<=Q;i++)
	{
		while(q[i].l<l)add(--l);
		while(q[i].r>r)add(++r);
		while(q[i].l>l)del(l++);
		while(q[i].r<r)del(r--);
		ans[q[i].no]=s[q[i].k];
	}
	for(int i=1;i<=Q;i++)cout<<ans[i]<<'\n';
}

火车头,fread+fwrite超级快读,调整块长114514次,函数展开均无效

2024/1/23 19:51
加载中...