社区讨论

树剖全RE求调

P4315月下“毛景树”参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo3i3fg1
此快照首次捕获于
2023/10/24 07:00
2 年前
此快照最后确认于
2023/10/24 07:00
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const double pi=3.14;
const int inf=0x3f3f3f3f;
const int NIL=-1;
const int MOD=1e9+7;
const int MAXN=1e5+7;
int n,c[MAXN];
struct Edge{
	int lst,v,w;
	Edge(){}
	Edge(int llst,int vv,int ww){
		lst=llst,v=vv,w=ww;
	}
}E[MAXN*2];
int head[MAXN*2],tot;
void add(int u,int v,int w){
	E[++tot]=Edge(head[u],v,w);
	head[u]=tot;
}
int siz[MAXN],hson[MAXN],fa[MAXN],dep[MAXN];
int remx[MAXN],remy[MAXN];
bool ifh[MAXN];
void DFS1(int s,int faa){
	fa[s]=faa;
	siz[s]=1;
	dep[s]=dep[faa]+1;
	int maxx=0,heav=-1;
	for (int i=head[s];~i;i=E[i].lst){
		int v=E[i].v,w=E[i].w;
		if (v==faa) continue;
		DFS1(v,s);
		siz[s]+=siz[v];
		if (siz[v]>maxx){
			maxx=siz[v];
			heav=v;
		}
	}
	hson[s]=heav;
	ifh[heav]=1;
}
int endd[MAXN],dfn[MAXN],times=0,root=1,top[MAXN];
void DFS2(int s,int faa){
	//cout<<s<<endl;
	dfn[s]=++times;
	if (s==root){
		top[s]=s;
	}else if (!ifh[s]){
		top[s]=s;
	}else if (ifh[s]){
		if (ifh[faa]){
			top[s]=top[faa];
		}else{
			top[s]=s;
		}
	}
	if (hson[s]!=-1) DFS2(hson[s],s);
	for (int i=head[s];~i;i=E[i].lst){
		int v=E[i].v,w=E[i].w;
		if (v==hson[s]) c[dfn[s]+1]=w;
		if (v==faa||v==hson[s]) continue;
		c[times+1]=w;
		DFS2(v,s); 
	}
	endd[s]=times;
}
int lazyadd[MAXN*4],T[MAXN*4],len[MAXN*4],lazycov[MAXN*4];
void pushdown(int x){
	if (~lazycov[x]){
		lazycov[x*2]=lazycov[x*2+1]=lazycov[x];
		T[x*2]=T[x*2+1]=lazycov[x]; 
		lazycov[x]=lazyadd[x]=0;
		return;
	}
	if (lazyadd[x]){
		lazyadd[x*2]+=lazyadd[x];
		lazyadd[x*2+1]+=lazyadd[x];
		T[x*2]+=lazyadd[x];
		T[x*2+1]+=lazyadd[x];
		lazyadd[x]=0;
	}
}
void pushup(int x){
	T[x]=max(T[x*2],T[x*2+1]);
}
void build(int l,int r,int x){
	len[x]=r-l+1; 
	lazycov[x]=-1;
	if (l==r){
		lazyadd[x]=0;
		T[x]=c[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,x*2);
	build(mid+1,r,x*2+1);
	pushup(x);
}
int query(int l,int r,int ll,int rr,int x){
	if (l>=ll&&r<=rr){
		return T[x];
	}
	int mid=(l+r)>>1;
	pushdown(x);
	if (mid<ll) return query(mid+1,r,ll,rr,x*2+1);
	else if (mid>=rr) return query(l,mid,ll,rr,x*2);
	else{
		return max(query(l,mid,ll,rr,x*2),query(mid+1,r,ll,rr,x*2+1));
	}
}
void update(int l,int r,int ll,int rr,int v,int x){
	if (l>=ll&&r<=rr){
		lazycov[x]=v;
		lazyadd[x]=0;
		T[x]=v;
		return;
	}
	pushdown(x);
	int mid=(l+r)>>1;
	if (mid>=rr) update(l,mid,ll,rr,v,x*2);
	else if (mid<ll) update(mid+1,r,ll,rr,v,x*2+1);
	else{
		update(l,mid,ll,rr,v,x*2);
		update(mid+1,r,ll,rr,v,x*2+1);
	}
	pushup(x);
}
void ADD(int l,int r,int ll,int rr,int v,int x){
	if (l>=ll&&r<=rr){
		lazyadd[x]+=v;
		T[x]+=v;
		return;
	}
	pushdown(x);
	int mid=(l+r)>>1;
	if (mid>=rr) ADD(l,mid,ll,rr,v,x*2);
	else if (mid<ll) ADD(mid+1,r,ll,rr,v,x*2+1);
	else{
		ADD(l,mid,ll,rr,v,x*2);
		ADD(mid+1,r,ll,rr,v,x*2+1);
	}
	pushup(x);
}
int QTree(int x,int y){
	int ans=0;
	int fx=top[x],fy=top[y];
	while(fx!=fy){
		if (dep[fx]<dep[fy]){
			swap(fx,fy);
			swap(x,y);
		}
		ans=max(ans,query(1,n,dfn[fx],dfn[x],1));
		x=fa[fx];fx=top[x];
	}
	if (dfn[x]<dfn[y]+1){
		swap(fx,fy);
		swap(x,y);
	}
	ans=max(ans,query(1,n,dfn[y]+1,dfn[x],1));
	return ans;
}
void UTree(int x,int y,int z,bool opt){
	int fx=top[x],fy=top[y];
	while(fx!=fy){
		if (dep[fx]<dep[fy]){
			swap(fx,fy);
			swap(x,y); 
		}
		if (opt) update(1,n,dfn[fx],dfn[x],z,1);
		else ADD(1,n,dfn[fx],dfn[x],z,1);
		x=fa[fx];fx=top[x];
	}
	if (dfn[x]<dfn[y]+1){
		swap(fx,fy);
		swap(x,y);
	}
	if (opt) update(1,n,dfn[y]+1,dfn[x],z,1);
	else ADD(1,n,dfn[y]+1,dfn[x],z,1);
}
int read()
{
    int ans=0,flag=1;
    char ch=getchar();
    while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
    if(ch=='-') flag=-1,ch=getchar();
    while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
    return ans*flag;
}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	n=read();
	memset(head,-1,sizeof(head));
	for (int i=1;i<n;i++){
		int u=read(),v=read(),w=read();
		add(u,v,w);add(v,u,w);
		remx[i]=u;remy[i]=v;
	}
	DFS1(1,0);
	ifh[1]=1;
	DFS2(1,0);
	build(1,n,1);
	string str;
	while(str!="Stop"){
		cin>>str;
		if (str=="Change"){
			int k=read(),v=read();
			if (dfn[remx[k]]+1>dfn[remy[k]]) swap(remx[k],remy[k]);
			update(1,n,dfn[remx[k]]+1,dfn[remy[k]],v,1);
		}else if (str=="Add"){
			int x=read(),y=read(),v=read();
			UTree(x,y,v,0);
		}else  if (str=="Cover"){
			int x=read(),y=read(),v=read();
			UTree(x,y,v,1);
		}else if (str=="Max"){
			int x=read(),y=read();
			cout<<QTree(x,y)<<endl;
		}
	}
}

我不知道为什么会RE,样例过了
RE说的是invalid memory reference,我没有越界访问吧?

回复

2 条回复,欢迎继续交流。

正在加载回复...