WA 10pts 线段树球调
查看原帖
WA 10pts 线段树球调
234074
樱雪喵>w<楼主2022/12/21 16:44

RT,只有 #11#12 能过,实在不知道挂哪里了/kk

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int xr=0,F=1;char cr=getchar();
	while(cr<'0'||cr>'9') {if(cr=='-') F=-1;cr=getchar();}
	while(cr>='0'&&cr<='9')
	    xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
	return xr*F;
}
#define pii pair<int,int>
#define fi first
#define se second
#define ls (now<<1)
#define rs (now<<1|1)
#define mid ((l+r)>>1)
const int N=5e4+5;
const int mod=998244353;
int n,Q,k;
int head[N],cnt;
struct node{
	int nxt,to;
}e[N];
void add(int u,int v){
	e[++cnt]={head[u],v};head[u]=cnt;
}
int siz[N],dep[N],son[N],fa[N];
void dfs1(int now,int ff)   //树剖 
{
	fa[now]=ff,dep[now]=dep[ff]+1,siz[now]=1;
	int mx=0;
	for(int i=head[now];i;i=e[i].nxt)
	{
		int v=e[i].to;
		dfs1(v,now);
		if(siz[v]>mx) mx=siz[v],son[now]=v;
		siz[now]+=siz[v];
	}
}
int dfn[N],tot,top[N];
void dfs2(int now,int tp)
{
	dfn[now]=++tot,top[now]=tp;
	if(son[now]) dfs2(son[now],tp);
	for(int i=head[now];i;i=e[i].nxt)
	{
		int v=e[i].to;if(v==son[now]) continue;
		dfs2(v,v);
	}
}

int qpow(int n,int k)
{
	int res=1;
	for(;k;n=n*n%mod,k>>=1)
		if(k&1) res=res*n%mod;
	return res;
}
int a[N],sum[N]; 
int tr[N<<2],lz[N<<2];
int S(int l,int r){return (sum[r]-sum[l-1]+mod)%mod;}//线段树 
void push_down(int now,int l,int r)
{
	tr[ls]=(tr[ls]+S(l,mid)*lz[now]%mod)%mod,
	tr[rs]=(tr[rs]+S(mid+1,r)*lz[now]%mod)%mod;
	lz[ls]=(lz[ls]+lz[now])%mod,lz[rs]=(lz[rs]+lz[now])%mod;
	lz[now]=0;
}
void modify(int now,int l,int r,int ml,int mr)
{
	if(l==ml&&r==mr) 
	{
		tr[now]=(tr[now]+S(l,r))%mod,lz[now]++;
		return;
	}
	push_down(now,l,r);
	if(mr<=mid) modify(ls,l,mid,ml,mr);
	else if(ml>mid) modify(rs,mid+1,r,ml,mr);
	else modify(ls,l,mid,ml,mid),modify(rs,mid+1,r,mid+1,mr);
	tr[now]=(tr[ls]+tr[rs])%mod;
}
int query(int now,int l,int r,int ml,int mr)
{
	if(l==ml&&r==mr) return tr[now];
	push_down(now,l,r);
	if(mr<=mid) return query(ls,l,mid,ml,mr);
	else if(ml>mid) return query(rs,mid+1,r,ml,mr);
	else return (query(ls,l,mid,ml,mid)+query(rs,mid+1,r,mid+1,mr))%mod;
}

void add(int x)
{
	while(x)
	{
		modify(1,1,n,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
}
int ask(int x)
{
	int res=0;
	while(x)
	{
		res=(res+query(1,1,n,dfn[top[x]],dfn[x]))%mod;
		x=fa[top[x]];
	}
	return res;
}
void init()
{
	for(int i=1;i<=n;i++) a[i]=(qpow(dep[i],k)-qpow(dep[i]-1,k)+mod)%mod;
	for(int i=1;i<=n;i++) sum[i]=(sum[i-1]+a[i])%mod;
}
int ans[N];
vector<pii> q[N];
signed main()
{
	n=read(),Q=read(),k=read();
	for(int i=2;i<=n;i++)
	{
		int x=read();
		add(x,i);
	}
	dfs1(1,0),dfs2(1,1);
	for(int i=1;i<=Q;i++)
	{
		pii x;int st;
		st=read(),x.fi=read();x.se=i;
		q[st].push_back(x);
	}
	init(); 
	for(int i=1;i<=n;i++)
	{
		add(i);
		for(auto j:q[i])
			ans[j.se]=ask(j.fi);
	}
	for(int i=1;i<=Q;i++) printf("%lld\n",ans[i]);
	return 0;
}
2022/12/21 16:44
加载中...