萌新求助!!!
查看原帖
萌新求助!!!
60932
Linno楼主2022/2/18 16:28

看完第一份题解之后写了一遍,样例过了自信提交,结果WA了,对照了之后找不出错误来QAQ

#include<bits/stdc++.h>
//#define int long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=2e5+7;

int n,q,va[N];
vector<int>G[N];

int sz[N],dep[N],fa[N],son[N],dfn[N],idfn[N],bel[N],idx=0;

void dfs1(int x){
	sz[x]=1;
	for(auto to:G[x]){
		if(to==fa[x]) continue;
		fa[to]=x;
		dep[to]=dep[x]+1;
		dfs1(to);
		sz[x]+=sz[to];
		if(sz[to]>sz[son[x]]) son[x]=to;
	}
}

void dfs2(int x,int tp){
	dfn[x]=++idx;
	idfn[idx]=x;
	bel[x]=tp;
	if(son[x]) dfs2(son[x],tp);
	for(auto to:G[x]){
		if(to==fa[x]||to==son[x]) continue;
		dfs2(to,to);
	}
}

struct T{
	int sum,tg;
	int lmx,rmx,mx;
	T(){sum=tg=lmx=rmx=mx=0;}
}tr[N<<2];
#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((l+r)>>1)

T pushup(T x,T y){
	T ans;
	ans.sum=x.sum+y.sum;
	ans.lmx=max(x.lmx,x.sum+y.lmx);
	ans.rmx=max(y.rmx,y.sum+x.rmx);
	ans.mx=max(max(x.mx,y.mx),x.rmx+y.lmx);
	ans.tg=0;
	return ans;
}

void pushdown(int p,int l,int r){
	if(tr[p].tg&&l!=r){
		int k=tr[p].tg;
		tr[ls].tg=tr[rs].tg=k;
		tr[ls].sum=(mid-l+1)*k;tr[rs].sum=(r-mid)*k;
		tr[ls].mx=tr[ls].lmx=tr[ls].rmx=max(0ll,tr[ls].sum);
		tr[rs].mx=tr[rs].lmx=tr[rs].rmx=max(0ll,tr[rs].sum);
		tr[p].tg=0;
	}
}

void build(int p,int l,int r){
	if(l==r){
		tr[p].sum=va[idfn[l]];
		tr[p].lmx=tr[p].rmx=tr[p].mx=max(tr[p].sum,0ll);
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	tr[p]=pushup(tr[ls],tr[rs]);	
}

void modify(int p,int l,int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr){
		tr[p].sum=(r-l+1)*k;
		tr[p].tg=k;
		tr[p].lmx=tr[p].rmx=tr[p].mx=max(0ll,tr[p].sum);
		return;
	}
	pushdown(p,l,r);
	if(ql<=mid) modify(ls,l,mid,ql,qr,k);
	if(qr>mid) modify(rs,mid+1,r,ql,qr,k);
	tr[p]=pushup(tr[ls],tr[rs]);
}

T query(int p,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return tr[p];
	pushdown(p,l,r);
	T L,R;
	if(ql<=mid) L=query(ls,l,mid,ql,qr);
	if(qr>mid) R=query(rs,mid+1,r,ql,qr);
	return pushup(L,R);
}

T chainquery(int u,int v){
	T L,R;
	while(bel[u]!=bel[v]){
		if(dep[bel[u]]>dep[bel[v]]){
			L=pushup(query(1,1,n,dfn[bel[u]],dfn[u]),L);
			u=fa[bel[u]];
		}else{
			R=pushup(query(1,1,n,dfn[bel[v]],dfn[v]),R);
			v=fa[bel[v]];
		}
	}
	if(dep[u]>dep[v]) L=pushup(query(1,1,n,dfn[v],dfn[u]),L);
	else R=pushup(query(1,1,n,dfn[u],dfn[v]),R);
	swap(L.lmx,L.rmx);
	return pushup(L,R);
}

void chainmodify(int u,int v,int w){
	while(bel[u]!=bel[v]){
		if(dep[bel[u]]<dep[bel[v]]) swap(u,v);
		modify(1,1,n,dfn[bel[u]],dfn[u],w);
		u=fa[bel[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	modify(1,1,n,dfn[v],dfn[u],w);
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>va[i];
	int u,v,w,op;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs1(1);
	dfs2(1,1);
	build(1,1,n);
	cin>>q;
	while(q--){
		cin>>op>>u>>v;
		if(op==1){
			cout<<(chainquery(u,v).mx)<<"\n";
		}else{
			cin>>w;
			chainmodify(u,v,w);
		}
	}
	return 0;
}
2022/2/18 16:28
加载中...