求助:跟我前途一样黑的代码(10MLE)
查看原帖
求助:跟我前途一样黑的代码(10MLE)
1163927
F1NE楼主2024/5/7 20:47
#include<bits/stdc++.h>
#define ll long long
#define mid(x,y) x+(y-x)<<1
using namespace std;
const int maximum=100009;
int N,M,R,P,cnt=0; 
vector<int> edg[maximum];
int val[maximum],dep[maximum],fa[maximum],son[maximum],
	siz[maximum],id[maximum],dov[maximum],top[maximum];
ll sgt[maximum<<2],laz[maximum<<2];
void dfs1(int x,int f,int d){
	dep[x]=d;
	siz[x]=1;
	int maxson=-1,num=edg[x].size();
	for(int i=0,now;i<num;i++){
		now=edg[x][i];
		if(now==f) continue;
		dfs1(now,x,d+1);
		siz[x]+=siz[now];
		if(siz[now]>maxson) son[x]=now,maxson=siz[now];
	}
	return;
}
void dfs2(int x,int topf){
	id[x]=++cnt;
	dov[cnt]=val[x];
	top[x]=topf;
	if(siz[x]==1)return;
	dfs2(son[x],topf);
	int num=edg[x].size();
	for(int i=0,now;i<num;i++){
		now=edg[x][i];
		if(now==fa[x]||now==son[x])continue;
		dfs2(now,now);
	}
	return;
}
void build(int l,int r,int p){
	if(l==r){
		sgt[p]=dov[l]%P;return;
	}
	int m=mid(l,r);
	build(l,m,p<<1),build(m+1,r,p<<1|1);
	sgt[p]=(sgt[p<<1]+sgt[p<<1|1])%P;
	return;
}
ll rd(int l,int r,int s,int t,int p){
	if(l<=s&&t<=r)return sgt[p];
	int m=mid(s,t);ll ans=0;
	if(laz[p]){
		(laz[p<<1]+=laz[p])%=P,
		(laz[p<<1|1]+=laz[p])%=P,
		laz[p]=0;
	}
	if(l<=m)(ans+=rd(l,r,s,m,p<<1))%=P;
	if(m<r)(ans+=rd(l,r,m+1,t,p<<1|1))%=P;
	sgt[p]=(sgt[p<<1]+sgt[p<<1|1])%P;
	return ans;
}
void wt(int l,int r,int k,int s,int t,int p){
	if(l<=s&&t<=r){
		(sgt[p]+=k*(t-s+1))%=P;
		(laz[p]+=k)%=P;
	}
	int m=mid(s,t);
	if(laz[p]){
		(laz[p<<1]+=laz[p])%=P,
		(laz[p<<1|1]+=laz[p])%=P,
		laz[p]=0;
	}
	if(l<=m)wt(l,r,k,s,m,p<<1);
	if(m<r)wt(l,r,k,m+1,t,p<<1|1);
	sgt[p]=(sgt[p<<1]+sgt[p<<1|1])%P;
	return;
}
int main(){
	cin>>N>>M>>R>>P;
	for(int i=1;i<=N;i++) scanf("%d",&val[i]);
	for(int i=1,x,y;i<N;i++){
		scanf("%d%d",&x,&y);
		edg[x].push_back(y),
		edg[y].push_back(x);
	}
	dfs1(R,0,1);
	dfs2(R,R);
	build(1,N,1);
	
	return 0;
}

问题出现在dfs2,在此之前都没MLE
代码没写完,刚到线段树

2024/5/7 20:47
加载中...