萌新求助长链剖分+差分统计76分TLE
查看原帖
萌新求助长链剖分+差分统计76分TLE
577796
prokali楼主2023/7/24 17:17

RT,代码如下:

#include<bits/stdc++.h>
#define ll long long
#define INF 214748364719260817ll
using namespace std;
ll n,q;
ll f[1000005][25],lg[1000005];
ll tp[1000005],son[1000005],dep[1000005],md[1000005],dfn[1000005],size[1000005],to[1000005],tot;
ll head[1000005],cntt;
ll box[1000005],ls[1000005],ans[1000005],cnt[1000005];
vector<ll>up[1000005],down[1000005];vector<ll>jl[1000005];
struct px
{
	ll dep,uid;
};
vector<px>query[1000005];
struct ed
{
	ll v,next;
}edge[2000005];
void add(ll u,ll v)
{
	edge[++cntt].v=v;edge[cntt].next=head[u];head[u]=cntt;
	edge[++cntt].v=u;edge[cntt].next=head[v];head[v]=cntt;
}
void dfs(ll id,ll fa)
{
	size[id]=1;
	for(ll i=head[id];i;i=edge[i].next)
	{
		ll v=edge[i].v;
		if(v==fa)continue;
		md[v]=dep[v]=dep[id]+1;
		f[v][0]=id;
		for(ll j=1;j<=lg[dep[v]];++j)f[v][j]=f[f[v][j-1]][j-1];
		dfs(v,id);
		size[id]+=size[v];
		if(md[id]<md[v])
			son[id]=v,md[id]=md[v];
	}
}
void dfs2(ll id,ll top)
{
	dfn[++tot]=id;to[id]=tot;
	tp[id]=top;down[top].push_back(id);
	if(son[id])dfs2(son[id],top);
	for(ll i=head[id];i;i=edge[i].next)
	{
		ll v=edge[i].v;
		if(v==f[id][0]||v==son[id])continue;
		dfs2(v,v);
	}
	if(id==top)
		for(ll i=0,u=id;i<=md[id]-dep[id];++i,u=f[u][0])
			up[id].push_back(u);
}
ll get_kth(ll id,ll k)
{
	ll y=tp[f[id][lg[k]]];
	if(!y)return 0;
	if(dep[id]-dep[y]>=k)return down[y][dep[id]-dep[y]-k];
	return up[y][k+dep[y]-dep[id]];
}
void get_ans(ll id,ll fa)
{
	ll summ=query[id].size();
	for(ll i=0;i<summ;++i)jl[id].push_back(cnt[query[id][i].dep]);
	for(ll i=head[id];i;i=edge[i].next)
	{
		ll v=edge[i].v;
		if(v==fa)continue;
		++cnt[dep[v]];
		get_ans(v,id);
	}
	for(ll i=0;i<summ;++i)ans[query[id][i].uid]=cnt[query[id][i].dep]-jl[id][i];
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>q;
	ll v;
	for(ll i=2;i<=n;++i)cin>>v,add(i,v),lg[i]=lg[i>>1]+1;
	dep[1]=1;
	dfs(1,0);
	dfs2(1,1);
	ll u,k;
	for(ll i=1;i<=q;++i)
	{
		cin>>u>>k;
		ll p=get_kth(u,k);
		if(p)
		query[p].push_back((px){k+dep[p],i});
		else
		ans[i]=1;
	}
	get_ans(1,0);
	for(ll i=1;i<=q;++i)
		cout<<ans[i]-1<<' ';
}
2023/7/24 17:17
加载中...