全部RE怎么办???
查看原帖
全部RE怎么办???
100325
peterwuyihong楼主2020/8/8 09:01

RTRTmaxnmaxn开成30000-120000$$RE,开成300000$$MLE,我有些怀疑人生

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
template<class T>
void read(T &x)
{
	T ans=0;short f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}while(ch>='0'&&ch<='9')
	{
		ans=(ans<<1)+(ans<<3)+(ch^48);
		ch=getchar();
	}x=ans*f;
}

#define maxn 30010
const int inf=3000000;
int n,Q;
int x,y;
int a[maxn<<2];
int head[maxn],Next[maxn<<1],ver[maxn<<1],tot;
void add(int x,int y){
	ver[++tot]=y;
	Next[tot]=head[x];
	head[x]=tot;
}
int son[maxn],siz[maxn],fa[maxn],dep[maxn];
void dfs1(int x){
	son[x]=-1;siz[x]=1;
	for(int i=head[x];i;i=Next[i]){
		int y=ver[i];
		if(dep[y])continue;
		fa[y]=x;
		dep[y]=dep[x]+1;
		dfs1(y);
		siz[x]+=siz[y];
		if(son[x]==-1||siz[son[x]]<siz[y])son[x]=y;
	}
}
int top[maxn],dfn[maxn],cnt,rk[maxn];
void dfs2(int x,int t){
	dfn[x]=++cnt;
	top[x]=t;
	rk[cnt]=x;
	if(son[x]==-1)return;//叶子返回
	dfs2(son[x],t);
	for(int i=head[x];i;i=Next[i])
	if(ver[i]!=son[x]&&ver[i]!=fa[i])dfs2(ver[i],ver[i]);
}
struct Seg{
	struct{
		int l,r;
		long long sum,ret;
	}tree[maxn<<2];
	inline void pushup(int x){
		tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
		tree[x].ret=max(tree[x<<1].ret,tree[x<<1|1].ret);
	}
	void build(int x,int l,int r){
		tree[x].l=l,tree[x].r=r;
		int mid=(l+r)>>1;
		if(l==r){
			tree[x].sum=tree[x].ret=a[rk[mid]];
			return;
		}
		build(x<<1,l,mid),build(x<<1|1,mid+1,r);
		pushup(x);
	}
	int askmax(int x,int l,int r){
		if(tree[x].l>=l&&tree[x].r<=r)return tree[x].ret;
		int mid=(tree[x].l+tree[x].r)>>1;
		int val=-inf;
		if(l<=mid)val=max(val,askmax(x<<1,l,r));
		if(r>mid)val=max(val,askmax(x<<1|1,l,r));
		return val;
	}
	int asksum(int x,int l,int r){
		if(tree[x].l>=l&&tree[x].r<=r)return tree[x].sum;
		int mid=(tree[x].l+tree[x].r)>>1;
		int val=0;
		if(l<=mid)val=(val+asksum(x<<1,l,r));
		if(r>mid)val=(val+asksum(x<<1|1,l,r));
		return val;
	}
	void change(int x,int pos,int d){
		if(tree[x].l==tree[x].r){
			tree[x].sum=tree[x].ret=d;
			return;
		}
		int mid=(tree[x].l+tree[x].r)>>1;
		if(pos<=mid)change(x<<1,pos,d);
		if(pos>mid)change(x<<1|1,pos,d);
		pushup(x);
	}
}s;
int querymax(int x,int y){
	int ans=-inf,fx=top[x],fy=top[y];
	while(fx!=fy){
		if(dep[fx]>=dep[fy])
		ans=max(ans,s.askmax(1,dfn[fx],dfn[x])),x=fa[fx];
		else
		ans=max(ans,s.askmax(1,dfn[fy],dfn[y])),y=fa[fy];
		fx=top[x],fy=top[y];
	}
	if(dfn[x]<dfn[y])
	ans=max(ans,s.askmax(1,dfn[x],dfn[y]));
	else 
	ans=max(ans,s.askmax(1,dfn[y],dfn[x]));
	return ans;
}
int querysum(int x,int y){
	int ans=0,fx=top[x],fy=top[y];
	while(fx!=fy){
		if(dep[fx]>=dep[fy])
		ans=(ans+s.asksum(1,dfn[fx],dfn[x])),x=fa[fx];
		else 
		ans=(ans+s.asksum(1,dfn[fy],dfn[y])),y=fa[fy];
		fx=top[x],fy=top[y];
	}
	if(dfn[x]<dfn[y])
	ans=(ans+s.asksum(1,dfn[x],dfn[y]));
	else 
	ans=(ans+s.asksum(1,dfn[y],dfn[x]));
	return ans;
}
char op[maxn];
signed main(){
#ifndef ONLINE_JUDGE
	freopen("testdata.in","r",stdin);
#endif
	read(n);
	for(int i=1;i<n;i++){
		read(x),read(y);
		add(x,y),add(y,x);
	}
	for(int i=1;i<=n;i++)read(a[i]);
	read(Q);
	dep[1]=1;
	dfs1(1);
	dfs2(1,1);
	s.build(1,1,n);
	while(Q--){
		cin>>op>>x>>y;
		if(op[1]=='H')s.change(1,dfn[x],y);
		if(op[1]=='M')printf("%d\n",querymax(x,y));
		if(op[1]=='S')printf("%d\n",querysum(x,y));
	}
}
2020/8/8 09:01
加载中...