过阳历了但全 WA 了,求调
查看原帖
过阳历了但全 WA 了,求调
716965
L_zaa_L楼主2024/11/27 13:47

rt

#include<bits/stdc++.h>
#define int long long
#define ls(x) ((x)*2)
#define rs(x) ((x)*2+1)
#define Debug(...) fprintf(stderr, __VA_ARGS__)
#define For(i,a,b) for(int i=a,i##end=b;i<=i##end;i++)
#define Rof(i,a,b) for(int i=a,i##end=b;i>=i##end;i--)
#define rep(i,  b) for(int i=1,i##end=b;i<=i##end;i++)
using namespace std;
const int N=1e6+5,base=999983,Mod=998244353;
//char buf[(1<<21)+5],*p1,*p2;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline void chmx(int &x,int y){(x<y)&&(x=y);}
inline void chmn(int &x,int y){(x>y)&&(x=y);}
inline void Add(int &x,int y){(x=x+y+Mod)%=Mod;}
inline int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f?-x:x;
}
void print(int n){
    if(n<0){
        putchar('-');
        n*=-1;
    }
    if(n>9) print(n/10);
    putchar(n%10+'0');
}
int n,m;
int a[N];
struct Seg{
	int x,l,r,all;
}tr[N<<2];
int lz[N];
bool vis[N];
vector<int>q[N];
int fa[N];
int son[N],dep[N],siz[N],top[N];
int id[N];
void dfs1(int x,int faz){
	fa[x]=faz;
	dep[x]=dep[faz]+1;
	siz[x]=1;
	for(auto v:q[x]){
		if(v==faz) continue;
		dfs1(v,x);
		siz[x]+=siz[v];
		if(siz[v]>siz[son[x]]){
			son[x]=v;
		}
	}
}
int cnt=0; 
int dfn[N];
void dfs2(int x,int tp){
    id[x]=++cnt;dfn[cnt]=x;
    top[x]=tp;
    if(!son[x])return; 
    dfs2(son[x],tp);
	for(auto v:q[x]){
        if(v==fa[x]||v==son[x])
			continue;
        dfs2(v,v);
    }
}
inline Seg merge(Seg L,Seg R){
	Seg res;
	res.x=max({L.x,R.x,L.r+R.l});
	res.all=L.all+R.all;
	res.l=max(L.l,L.all+R.l);
	res.r=max(R.r,R.all+L.r);
	return res;
}
inline void down(int x,int l,int r,int k){
	tr[x]={max(k,k*(r-l+1)),max(k,k*(r-l+1)),max(k,k*(r-l+1)),k*(r-l+1)};
	lz[x]=k;
}
inline void pushdown(int x,int l,int r){
	if(lz[x]!=INT_MIN){
		int mid=(l+r)>>1;
		down(ls(x),l,mid,lz[x]);
		down(rs(x),mid+1,r,lz[x]);
		lz[x]=INT_MIN;
	}
}
void build(int x,int l,int r){
	lz[x]=INT_MIN;
	if(l==r) {
		tr[x]={a[id[l]],a[id[l]],a[id[l]],a[id[l]]};
		return;
	}
	int mid=(l+r)>>1;
	build(ls(x),l,mid);build(rs(x),mid+1,r);
	tr[x]=merge(tr[ls(x)],tr[rs(x)]);
}
void updata(int x,int l,int r,int L,int R,int k){
	if(L>R) swap(L,R);
	if(L<=l&&r<=R){down(x,l,r,k);return;}
	int mid=(l+r)>>1;pushdown(x,l,r);
	if(L<=mid) updata(ls(x),l,mid,L,R,k);
	if(R>mid) updata(rs(x),mid+1,r,L,R,k);
	tr[x]=merge(tr[ls(x)],tr[rs(x)]);
}
Seg query(int x,int l,int r,int L,int R){
	if(L>R) swap(L,R);
	if(L<=l&&r<=R) return tr[x];
	int mid=(l+r)>>1;Seg res;pushdown(x,l,r);
	if(L<=mid&&R>mid) res=merge(query(ls(x),l,mid,L,R),query(rs(x),mid+1,r,L,R));
	else if(L<=mid) res=query(ls(x),l,mid,L,R);
	else if(R>mid) res=query(rs(x),mid+1,r,L,R);
	return res;
}
inline int LCA(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	return u;
}
inline Seg rev(Seg x){
	swap(x.l,x.r);
	return x;
}
pair<int,int>ans[N];
int tot;
inline int qry(int u,int v){
	int lca=LCA(u,v);
	Seg res={INT_MIN,INT_MIN,INT_MIN,0};
	while(id[top[u]]>id[lca]){
		if(res.x!=INT_MIN)res=merge(res,rev(query(1,1,n,id[top[u]],id[u])));
		else res=rev(query(1,1,n,id[top[u]],id[u]));
		u=fa[top[u]];
	}
	if(res.x!=INT_MIN)res=merge(res,rev(query(1,1,n,id[top[u]],id[u])));
	else res=rev(query(1,1,n,id[lca],id[u]));
	tot=0;
while(id[top[v]]>id[lca]){
		ans[++tot]={id[top[v]],id[v]};
		v=fa[top[v]];
	}
	if(v!=lca)ans[++tot]={id[lca]+1,id[v]};
	Rof(i,tot,1){
		if(res.x!=INT_MIN)res=merge(res,query(1,1,n,ans[i].first,ans[i].second));
		else res=query(1,1,n,ans[i].first,ans[i].second);
	}
	return res.x;
} 

inline void upd(int u,int v,int k){
	int lca=LCA(u,v);
	while(id[top[u]]>id[lca]){
		updata(1,1,n,id[top[u]],id[u],k);
		u=fa[top[u]];
	}
	updata(1,1,n,id[lca],id[u],k);
	while(id[top[v]]>id[lca]){
		updata(1,1,n,id[top[v]],id[v],k);
		v=fa[top[v]];
	}
	if(v!=lca)updata(1,1,n,id[lca],id[v],k);
} 
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	// ios::sync_with_stdio(false);
	// cin.tie(0); cout.tie(0);
	n=read(); 
	For(i,1,n)a[i]=read();
	For(i,1,n-1){
		int u=read(),v=read();
		q[u].push_back(v);
		q[v].push_back(u);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	int Q=read();
	while(Q--){
		int op=read();
		if(op==1){
			int u=read(),v=read();
			printf("%lld\n",max(0ll,qry(u,v)));
		}
		else{
			int u=read(),v=read(),k=read();
			upd(u,v,k);
		}
	}
#ifdef LOCAL
    Debug("\nMy Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
	return 0;
}

2024/11/27 13:47
加载中...