为什么全MLE了?
查看原帖
为什么全MLE了?
141958
楠枫楼主2021/3/13 17:12

我的代码

#include<bits/stdc++.h>
#define p(i) ++i
#define ri register int
#define lt(x) (x<<1)
#define rt(x) (x<<1|1)
using namespace std;
const int N=3e4+7;
inline int read() {
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
} 
int first[N],t=1,hs[N],size[N],tot,top[N],back[N],w[N],dfn[N],fa[N],n,dep[N];
struct edge{
	int v,nxt;
}e[N<<1];
struct Segmenttree{
	int mx,s;
}tree[N<<2];
inline void add(int u,int v) {
	e[t].v=v;
	e[t].nxt=first[u];
	first[u]=t++;
}
void dfs1(int x,int f) {
	fa[x]=f;
	size[x]=1;
	for (ri i(first[x]);i;i=e[i].nxt) {
		int v=e[i].v;
		if (v==f) continue;
		dep[v]=dep[x]+1;
		dfs1(v,x);
		size[x]+=size[v];
		if (size[v]>size[hs[x]]) hs[x]=v;
	}
}
void dfs2(int x,int tp) {
	top[x]=tp;
	dfn[x]=p(tot);
	back[tot]=x;
	if (hs[x]) dfs2(hs[x],tp);
	for (ri i(first[x]);i;i=e[i].nxt) {
		int v=e[i].v;
		if (v==hs[x]||v==fa[x]) continue;
		dfs2(v,v); 
	} 
}
inline void up(int x){tree[x].s=tree[lt(x)].s+tree[rt(x)].s;tree[x].mx=max(tree[lt(x)].mx,tree[rt(x)].mx);}
void build(int l,int r,int id) {
	if (l==r) {tree[id].mx=tree[id].s=w[back[l]];return;}
	int mid=(l+r)>>1;
	build(l,mid,lt(id));
	build(mid+1,r,rt(id));
	up(id);
}
int querymx(int l,int r,int lt,int rt,int id) {
	if (l<=lt&&rt<=r) return tree[id].mx;
	int res=INT_MIN,mid=(lt+rt)>>1;
	if (l<=mid) res=max(res,querymx(l,r,lt,mid,lt(id)));
	if (r>mid) res=max(res,querymx(l,r,mid+1,rt,rt(id)));
	return res;
}
int querys(int l,int r,int lt,int rt,int id) {
	if (l<=lt&&rt<=r) return tree[id].s;
	int res=0,mid=(lt+rt)>>1;
	if (l<=mid) res+=querys(l,r,lt,mid,lt(id));
	if (r>mid) res+=querys(l,r,mid+1,rt,rt(id));
	return res;
}
void update(int x,int lt,int rt,int id,int k) {
	if (lt==rt&&lt==x) {tree[id].mx=tree[id].s=k;return;}
	int mid=(lt+rt)>>1;
	if (x<=mid) update(x,lt,mid,lt(id),k);
	else update(x,mid+1,rt,rt(id),k);
	up(id);
}
int qmax(int x,int y) {
	int res=INT_MIN;
	while(top[x]!=top[y]) {
		if (dep[top[x]]<dep[top[y]]) swap(x,y);
		res=max(res,querymx(dfn[top[x]],dfn[x],1,n,1));
		x=fa[top[x]];
	}
	if (dep[x]<dep[y]) swap(x,y);
	res=max(res,querymx(dfn[y],dfn[x],1,n,1));
	return res;
}
int qsum(int x,int y) {
	int res=0;
	while(top[x]!=top[y]) {
		if (dep[top[x]]<dep[top[y]]) swap(x,y);
		res+=querys(dfn[top[x]],dfn[x],1,n,1);
		x=fa[top[x]];
	}
	if (dep[x]<dep[y]) swap(x,y);
	res+=querys(dfn[y],dfn[x],1,n,1);
	return res;
}
int main() {
	//freopen("1.in","r",stdin);
	n=read();
	for (ri i(1);i<n;p(i)) {
		int u=read(),v=read();
		add(u,v);add(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
	for (ri i(1);i<=n;p(i)) w[i]=read();
	build(1,n,1);
	int q=read();
	for (ri i(1);i<=q;p(i)) {
		char c=getchar(),h=getchar();
		int u=read(),v=read();
		if (c=='Q'&&h=='M') printf("%d\n",qmax(u,v));
		else if (c=='C') update(dfn[u],1,n,1,v);
		else printf("%d\n",qsum(u,v));
	}
	return 0;
}

本机和darkbzoj都没问题

2021/3/13 17:12
加载中...