社区讨论

求助,MLE,可以不调,想知道原因

P4427[BJOI2018] 求和参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@ltfpeaed
此快照首次捕获于
2024/03/06 19:16
2 年前
此快照最后确认于
2024/03/06 21:18
2 年前
查看原帖
做法是树链剖分+线段树,感觉大体上没问题,空间算的貌似也没有超 (也有可能是我算错了),想知道为什么会MLE,是数组开多了还是死递归,感谢各位大佬
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define N 300001
#define P 998244353
int n,m;
int head[N],to[N],nxt[N],idx;
int id[N],cnt;
int iid[N];
int deep[N],top[N],sz[N],fa[N],son[N];
struct node{
	int sum[51];
}date[N*4];
int mi(int x,int y)//快速幂
{
	long long ans=1;
	long long t=x;
	while(y)
	{
		if(y&1)
		ans=(ans*t)%P;
		t=(t*t)%P;
		y>>=1;
	}
	return ans;
}
void add(int u,int v)//存图
{
	to[++idx]=v;
	nxt[idx]=head[u];
	head[u]=idx;
}
void dfs1(int u,int p,int dep)//求重儿子的DFS
{
	deep[u]=dep;
	fa[u]=p;
	sz[u]=1;
	for(int i=head[u];i;i=nxt[i])
	{
		int j=to[i];
		if(j==p)
			continue;
		dfs1(j,u,dep+1);
		sz[u]+=sz[j];
		if(sz[son[u]]<sz[j])
			son[u]=j;
	}
}
void dfs2(int u,int t) //求DFS序的DFS
{
	id[u]=++cnt;
	iid[id[u]]=u;
	top[u]=t;
	if(!son[u])
		return;
	dfs2(son[u],t);
	for(int i=head[u];i;i=nxt[i])
	{
		int j=to[i];
		if(j==fa[u]||j==son[u])
			continue;
		dfs2(j,j);
	}
}
void pushup(node& u,node& l,node& r)//标记上传
{
	for(int i=1;i<=50;i++)
		u.sum[i]=(l.sum[i]+r.sum[i])%P; 
}
void pushup(int x)
{
	pushup(date[x],date[x*2],date[x*2+1]);
}
void build(int x,int l,int r)//建树
{
	if(l==r)
	{
		for(int i=1;i<=50;i++)
			date[x].sum[i]=mi(deep[iid[l]],i);
		return ;
	}
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	pushup(x);
}
node find(int x,int l,int r,int L,int R)//查找
{
	if(l==L&&R==r)
		return date[x];
	int mid=(L+R)/2;
	if(r<=mid)
		return find(x*2,l,r,L,mid);
	if(l>=mid+1)
		return find(x*2+1,l,r,mid+1,R);
	node ans,lt=find(x*2,l,mid,L,mid),rt=find(x*2+1,mid+1,r,mid+1,R);
	pushup(ans,lt,rt);
	return ans;
}
node find_path(int u,int v)//查找一条路径
{
	node ans={0};
	memset(ans.sum ,0,sizeof(ans.sum ));
	while(top[u]!=top[v])
	{
		if(deep[top[u]]<deep[top[v]])
			swap(u,v);
		node hh=find(1,id[top[u]],id[u],1,n);
		pushup(ans,hh,ans);
		u=fa[top[u]];
	}
	if(deep[u]<deep[v])
		swap(u,v);
	node hh=find(1,id[v],id[u],1,n);
	pushup(ans,hh,ans);
	return ans;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs1(1,-1,0);
	dfs2(1,1);
	build(1,1,n);
	cin>>m;
	while(m--)
	{
		int u,v,k;
		cin>>u>>v>>k;
		cout<<find_path(u,v).sum[k]<<"\n";
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...