社区讨论
求助,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 条回复,欢迎继续交流。
正在加载回复...