为什么MLE?怎么办?
查看原帖
为什么MLE?怎么办?
448185
EntrophyDecreaser楼主2023/7/22 10:55

都写的是动态开点线段树+树剖,我为什么5MLE2TLE?

啊↗?

#include<bits/stdc++.h>
using namespace std;
const int N=1e5,MX=2e7;
int n,q,a[N],c[N];
int sz[N],son[N],dfn[N],top[N],tim,fa[N],dep[N];
int root[N],sum[MX],mx[MX],ls[MX],rs[MX],tot;
vector<int>g[N];
void dfs(int x,int f){
	fa[x]=f;sz[x]=1;
	dep[x]=dep[f]+1;
	for(int v:g[x]){
		if(v==f)continue;
		dfs(v,x);
		sz[x]+=sz[v];
		if(sz[v]>sz[son[x]])son[x]=v;
	}
}
void dfs1(int x,int rt){
	top[x]=rt;
	dfn[x]=++tim;
	if(son[x])dfs1(son[x],rt);
	for(int v:g[x]){
		if(v==fa[x]||v==son[x])continue;
		dfs1(v,v);
	}
}
void pushup(int rt){
	sum[rt]=sum[ls[rt]]+sum[rs[rt]];
	mx[rt]=max(mx[ls[rt]],mx[rs[rt]]);
} 
void modify(int &rt,int l,int r,int p,int k){
	if(!rt)
		rt=++tot;
	if(l==r){
		sum[rt]=mx[rt]=k;return;
	}
	int mid=(l+r)>>1;
	if(p<=mid)modify(ls[rt],l,mid,p,k);
	else modify(rs[rt],mid+1,r,p,k);	
	pushup(rt);
}
int segsum(int rt,int l,int r,int L,int R){
	if(!rt)return 0;
	if(L<=l&&r<=R)
		return sum[rt];
	int mid=(l+r)>>1,res=0;
	res+=segsum(ls[rt],l,mid,L,R);
	res+=segsum(rs[rt],mid+1,r,L,R);
	return res;
}
int segmx(int rt,int l,int r,int L,int R){
	if(!rt)return 0;
	if(L<=l&&r<=R)return mx[rt];
	int mid=(l+r)>>1,res=0;
	res=max(res,segmx(ls[rt],l,mid,L,R));
	res=max(res,segmx(rs[rt],mid+1,r,L,R));
	return res;
}
int Tsum(int u,int v,int k){
	int res=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res+=segsum(root[k],1,n,dfn[top[u]],dfn[u]);
		u=fa[top[u]];
	}	
	if(dep[u]>dep[v])swap(u,v);
	res+=segsum(root[k],1,n,dfn[u],dfn[v]);
	return res;
}
int Tmx(int u,int v,int k){
	int res=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		res=max(res,segmx(root[k],1,n,dfn[top[u]],dfn[u]));
		u=fa[top[u]];
	}	
	if(dep[u]>dep[v])swap(u,v);
	res=max(res,segmx(root[k],1,n,dfn[u],dfn[v]));
	return res;
}
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;++i)
		scanf("%d%d",&a[i],&c[i]);
	for(int i=1;i<=n-1;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1,0);
	dfs1(1,1);
	for(int i=1;i<=n;++i)
		modify(root[c[i]],1,n,dfn[i],a[i]);
	for(int i=1;i<=q;++i){	
		string op;	
		int u,v;
		cin>>op;
		scanf("%d%d",&u,&v);
		if(op=="CC"){
			modify(root[c[u]],1,n,dfn[u],0);	
			modify(root[v],1,n,dfn[u],a[u]);
			c[u]=v;
		}
		if(op=="CW"){
			modify(root[c[u]],1,n,dfn[u],v);
			a[u]=v;
		}
		if(op=="QS"){
			printf("%d\n",Tsum(u,v,c[u]));
		}
		if(op=="QM"){
			printf("%d\n",Tmx(u,v,c[u]));
		}
	}
	return 0;
}
2023/7/22 10:55
加载中...