求助
查看原帖
求助
1332453
__Florie_楼主2025/1/3 11:10

MLE原因未知,如何处理?

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ldb long double
template<typename T>
inline void read(T &x){
	bool f=1; x=0; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=!f; ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch-'0'); ch=getchar();}
	x=(f?x:-x); return ;
}
template<typename T>
inline void print(T x){
	if(x<0) {putchar('-'); x=-x;}
	if(x>9) print(x/10);
	putchar(x%10+'0'); return ;
}

//以 1 为根 
const int N=30010;
int n,l,r,op,head[N],val[N];
struct node {int nxt,to;} edge[N<<1];
void add(int l,int r){
	edge[++op].nxt=head[l]; edge[op].to=r;
	head[l]=op; return ;
}
int cnt;
int dep[N],par[N],son[N],siz[N];
int top[N],cid[N],ccid[N];
void dfs1(int id){
	siz[id]=1;
	for(int i=head[id];i;i=edge[i].nxt){
		if(edge[i].to==par[id]) continue;
		par[edge[i].to]=id;
		dep[edge[i].to]=dep[id]+1;
		dfs1(edge[i].to);
		if(siz[son[id]]<siz[edge[i].to]) son[id]=edge[i].to;
		siz[id]=siz[id]+siz[edge[i].to];
	}
	return ;
}
void dfs2(int id){
	if(son[id])
	{
		top[son[id]]=top[id];
		cnt++; cid[son[id]]=cnt; ccid[cnt]=son[id];
		dfs2(son[id]);
	}
	for(int i=head[id];i;i=edge[i].nxt){
		if(edge[i].to==par[id]||edge[i].to==son[id]) continue;
		top[edge[i].to]=edge[i].to;
		cnt++; cid[edge[i].to]=cnt; ccid[cnt]=edge[i].to;
		dfs2(edge[i].to);
	}
	return ;
}
int sum[N<<2],maxx[N<<2];
void build(int k,int l,int r){
	if(l==r) {sum[k]=maxx[k]=val[ccid[l]]; return ;}
	int mid=(l+r)>>1;
	build(k<<1,l,mid); build((k<<1)|1,mid+1,r);
	sum[k]=sum[k<<1]+sum[(k<<1)|1];
	maxx[k]=max(maxx[k<<1],maxx[(k<<1)|1]);
	return ;
}
int q,u,v;
string s;
void change(int k,int l,int r,int p,int val){
	if(l==r) {sum[k]=maxx[k]=val; return ;}
	int mid=(l+r)>>1;
	if(mid>=p) change(k<<1,l,mid,p,val);
	if(mid<p) change((k<<1)|1,mid+1,r,p,val);
	sum[k]=sum[k<<1]+sum[(k<<1)|1];
	maxx[k]=max(maxx[k<<1],maxx[(k<<1)|1]);
	return ;
}
int get_max(int k,int l,int r,int lhs,int rhs){
	if(l>=lhs&&r<=rhs) return maxx[k];
	int mid=(l+r)>>1,ans=-3e5;
	if(mid>=lhs) ans=max(ans,get_max(k<<1,l,mid,lhs,rhs));
	if(mid<rhs) ans=max(ans,get_max((k<<1)|1,mid+1,r,lhs,rhs));
	return ans;
}
int query_max(int x,int y){
	int fx=top[x],fy=top[y],ans=-3e5;
	if(dep[fx]<dep[fy]) {swap(x,y); swap(fx,fy);}
	while(fx!=fy){
		ans=max(ans,get_max(1,1,n,cid[fx],cid[x]));
		x=par[fx]; fx=top[x];
	}
	if(dep[x]<dep[y]) swap(x,y);
	ans=max(ans,get_max(1,1,n,cid[y],cid[x]));
	return ans;
}
int get_sum(int k,int l,int r,int lhs,int rhs){
	if(l>=lhs&&r<=rhs) return sum[k];
	int mid=(l+r)>>1,ans=0;
	if(mid>=lhs) ans=ans+get_sum(k<<1,l,mid,lhs,rhs);
	if(mid<rhs) ans=ans+get_sum((k<<1)|1,mid+1,r,lhs,rhs);
	return ans;
}
int query_sum(int x,int y){
	int fx=top[x],fy=top[y],ans=0;
	if(dep[fx]<dep[fy]) {swap(x,y); swap(fx,fy);}
	while(fx!=fy){
		ans=ans+get_sum(1,1,n,cid[fx],cid[x]);
		x=par[fx]; fx=top[x];
	}
	if(dep[x]<dep[y]) swap(x,y);
	ans=ans+get_sum(1,1,n,cid[y],cid[x]);
	return ans;
}

int main(){
	read(n);
	for(int i=1;i<n;i++) {read(l); read(r); add(l,r); add(r,l);}
	for(int i=1;i<=n;i++) read(val[i]);
	dep[1]=top[1]=cid[1]=ccid[1]=cnt=1;
	dfs1(1); dfs2(1); build(1,1,n);
	read(q);
	for(int qq=1;qq<=q;qq++){
		cin>>s; read(u); read(v);
		if(s[1]=='H') change(1,1,n,cid[u],v);//切记转变为 cid 
		else if(s[1]=='M') printf("%d\n",query_max(u,v));
		else printf("%d\n",query_sum(u,v));
	}
	return 0;
}
2025/1/3 11:10
加载中...