求求大佬们康康孩子代码吧,萌新求助树剖简单题,样例已过,实在不知道哪里错了
查看原帖
求求大佬们康康孩子代码吧,萌新求助树剖简单题,样例已过,实在不知道哪里错了
739250
Smi1EMAsk楼主2023/2/26 20:23
//OOOOOOOOOOOOOOOOrz
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int rd(){
	int num=0,sign=1; char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
	while (ch>='0'&&ch<='9') num=(num<<3)+(num<<1)+(ch^48),ch=getchar();
	return num*sign;
}
const int N=1e5+7;
const int INF=1e9;
int siz[N],son[N],top[N],dep[N],fa[N],idx[N];
int n,m,cnt,a[N],b[N];
vector <int> g[N];
void dfs1(int x,int f){
	fa[x]=f;
	dep[x]=dep[f]+1;
	siz[x]=1;
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i];
		if(y==f) continue;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(siz[y]>siz[son[x]]) son[x]=y;
	}
}
void dfs2(int x,int topf){
	top[x]=topf;
	idx[x]=++cnt;a[cnt]=b[x];
	if(son[x]) dfs2(son[x],topf);
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i];
		if(!idx[y]) dfs2(y,y);
	}
}
struct node{
	int data,maxl,maxr,sum,lazy;
	node(){data=maxl=maxr=sum=0;lazy=INF;}
}t[N<<2];
struct SGT{
	
	node merge(node a,node b){
		node c;
		c.sum=a.sum+b.sum;
		c.maxl=max(a.maxl,a.sum+b.maxl);
		c.maxr=max(b.maxr,b.sum+a.maxr);
		c.data=max(a.data,max(b.data,a.maxr+b.maxl));
		return c;
	}
	void build(int l,int r,int id){
		t[id].lazy=INF;
		if(l==r){
			t[id].sum=a[l];
			t[id].data=t[id].maxl=t[id].maxr=max(a[l],0ll);
			return ;
		}
		int mid=(l+r)>>1;
		build(l,mid,id<<1);build(mid+1,r,id<<1|1);
		t[id]=merge(t[id<<1],t[id<<1|1]);
	}
	void f(int id,int l,int r,int k){
		t[id].sum=k*(r-l+1);
		t[id].maxl=t[id].maxr=t[id].data=max(0ll,t[id].sum);
		t[id].lazy=k;
	}
	void pushdown(int id,int l,int r){
		if(t[id].lazy==INF) return ;
		int mid=(l+r)>>1;
		f(id<<1,l,mid,t[id].lazy);
		f(id<<1|1,mid+1,r,t[id].lazy);
		t[id].lazy=INF;
	}
	void change(int l,int r,int id,int k,int L,int R){
		if(l<=L&&R<=r){
			f(id,L,R,k);
			return ; 
		}
		pushdown(id,L,R);
		int mid=(L+R)>>1;
		if(mid>=l) change(l,r,id<<1,k,L,mid);
		if(mid<r) change(l,r,id<<1|1,k,mid+1,R);
		t[id]=merge(t[id<<1],t[id<<1|1]);
	}
	node query(int l,int r,int id,int L,int R){
		if(l<=L&&R<=r) return t[id];
		pushdown(id,L,R);
		int mid=(L+R)>>1;
		node x,y;
		if(mid>=l) x=query(l,r,id<<1,L,mid);
		if(mid<r) y=query(l,r,id<<1|1,mid+1,R);
		return merge(x,y);
	}
	void Change(int x,int y,int k){
		while(top[x]!=top[y]){
			if(dep[top[x]]<dep[top[y]]) swap(x,y);
			change(idx[top[x]],idx[x],1,k,1,n);
			x=fa[top[x]];
		}
		if(dep[x]>dep[y]) swap(x,y);
		change(idx[x],idx[y],1,k,1,n);
	}
	node Query(int x,int y){
		node L,R;
		while(top[x]^top[y]){
			if(dep[top[x]]<dep[top[y]]){
				R=merge(query(idx[top[y]],idx[y],1,1,n),R);
				y=fa[top[y]];
			}
			else{
				L=merge(query(idx[top[x]],idx[x],1,1,n),L);
				x=fa[top[x]];
			}
		}
		if(dep[x]>dep[y]) L=merge(L,query(idx[y],idx[x],1,1,n));
		else R=merge(R,query(idx[x],idx[y],1,1,n));
		swap(L.maxl,L.maxr);
		return merge(L,R);
	}
}tree;
signed main(){
	n=rd();
	node x;
	for(int i=1;i<=n;i++) b[i]=rd();
	for(int i=1;i<n;i++){
		int x=rd(),y=rd();
		g[x].push_back(y);
		g[y].push_back(x);
	}
	dfs1(1,0);dfs2(1,1);
	tree.build(1,n,1);
	m=rd();
	while(m--){
		int op=rd(),x=rd(),y=rd(),z;
		if(op==2){
			z=rd();
			tree.Change(x,y,z);
		}
		else{
			printf("%lld\n",tree.Query(x,y).data);
		}
	}
	return 0;
}
2023/2/26 20:23
加载中...