萌新求助树剖板子题
查看原帖
萌新求助树剖板子题
203102
Diamiko楼主2021/11/18 23:34

样例过了,但第一个点就wa,咋回事啊QWQ

#include<bits/stdc++.h>
#define update(x) t[x]=t[x<<1]+t[x<<1|1]
using namespace std;
const int N=100005;
struct SegmentTree
{
	int l,r,len,suf,pre,sum,ans;
	SegmentTree operator +(SegmentTree x)
	{
		if(l==r&&r==len&&len==suf&&suf==pre&&pre==sum&&sum==ans&&ans==0)return x;
		SegmentTree t,self=*this;
		if(r>=x.l)swap(x,self);
		t.l=self.l,t.r=x.r,t.len=self.len+x.len;
		t.sum=self.sum+x.sum;
		t.pre=max(self.pre,self.sum+x.pre);
		t.suf=max(x.suf,self.suf+x.sum);
		t.ans=max(self.ans,max(x.ans,self.suf+x.pre));
		return t;
	}
}t[N<<2];
int n,q,l,r,opt,a[N];
int tag[N<<2];
int id[N],top[N],tot,val[N],siz[N],fa[N],son[N],dep[N];
int head[N],nxt[N<<1],to[N<<1],cnt;
inline int read()
{
	char c(0);int x(0);bool flag(0);
	for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
	for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return flag?-x:x;
}
void write(int x)
{
	if(x<0) x=-x,putchar('-');
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
void build(int now,int l,int r)
{
	tag[now]=114514;
	if(l==r)
	{
		t[now]={l,r,1,val[l],val[l],val[l],val[l]};
		return;
	}
	int mid=l+r>>1;
	build(now<<1,l,mid);
	build(now<<1|1,mid+1,r);
	update(now);
}
inline void apply(int now,int tag)
{
	if(tag==114514)return;
	t[now].sum=t[now].len*tag;
	t[now].ans=t[now].suf=t[now].pre=tag>0?t[now].sum:tag;
}
inline int mergeTag(int x,int y)
{
	if(x==114514&&y==114514)return 114514;
	if(x==114514) return y;
	if(y==114514) return x;
	return y;
}
inline void givetag(int now,int Tag)
{
	tag[now]=mergeTag(tag[now],Tag);
	apply(now,Tag);
}
inline void pushdown(int now)
{
	if(tag[now]==114514)return;
	givetag(now<<1,tag[now]);
	givetag(now<<1|1,tag[now]);
	tag[now]=114514;
}
void modify(int now,int x,int y,int c)
{
	if(t[now].l!=t[now].r) pushdown(now);
	if(t[now].l>=x&&t[now].r<=y)
	{
		givetag(now,c);
		return;
	}
	int mid=t[now].l+t[now].r>>1;
	if(x<=mid) modify(now<<1,x,y,c);
	if(y>mid) modify(now<<1|1,x,y,c);
	update(now);
}
SegmentTree query(int now,int x,int y)
{
	if(t[now].l!=t[now].r) pushdown(now);
	if(t[now].l>=x&&t[now].r<=y) return t[now];
	int mid=t[now].l+t[now].r>>1;
	if(x<=mid&&y>mid) return query(now<<1,x,y)+query(now<<1|1,x,y);
	if(x<=mid) return query(now<<1,x,y);
	if(y>mid) return query(now<<1|1,x,y);
}
inline void addEdge(int u,int v)
{
	nxt[++cnt]=head[u];
	to[cnt]=v;
	head[u]=cnt;
}
void dfs1(int u,int father)
{
	fa[u]=father;
	siz[u]=1;
	dep[u]=dep[father]+1;
	for(int e=head[u];e;e=nxt[e])
	{
		int v=to[e];
		if(!dep[v]&&v!=father)
		{
			dfs1(v,u);
			siz[u]+=siz[v];
			if(siz[v]>siz[son[u]]) son[u]=v;
		}
	}
}
void dfs2(int u,int t)
{
	top[u]=t;
	id[u]=++tot;
	val[tot]=a[u];
	if(!son[u]) return;
	dfs2(son[u],t);
	for(int e=head[u];e;e=nxt[e])
	{
		int v=to[e];
		if(v!=son[u]&&v!=fa[u])
		{
			dfs2(v,v);
		}
	}
}
inline int base_query(int x,int y)
{
	SegmentTree ans={0,0,0,0,0,0,0};
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=ans+query(1,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(id[x]>id[y]) swap(x,y);
	ans=ans+query(1,id[x],id[y]);
	return max(ans.ans,0);
}
inline void base_change(int x,int y,int c)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		modify(1,id[top[x]],id[x],c);
		x=fa[top[x]];
	}
	if(id[x]>id[y]) swap(x,y);
	modify(1,id[x],id[y],c);
}
int main()
{
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<n;i++)
	{
		int x=read();
		int y=read();
		addEdge(x,y);
		addEdge(y,x);
	}
	dfs1(1,0);
	dfs2(1,1);
//	for(int i=1;i<=n;i++) cout<<val[i]<<' ';
//	cout<<endl;
	build(1,1,n);
	q=read();
	while(q--)
	{
		opt=read();l=read();r=read();
		if(opt==1) write(base_query(l,r)),putchar('\n');
		else base_change(l,r,read());
	}
	return 0;
}
2021/11/18 23:34
加载中...