纯萌新,求助,全WA
查看原帖
纯萌新,求助,全WA
180106
Kirie_LingKui楼主2020/11/23 19:12

RT,求助(线段树略显毒瘤

#include<iostream>
#include<cstring>
#include<cstdio>
#define Maxn 100005
#define ls p<<1
#define rs p<<1|1
using namespace std;
struct edge{int nxt,t,val;}e[Maxn<<1];
struct node{int l,r,lazyS,lazyC,Max;}t[Maxn<<2];
int head[Maxn],n,m,a[Maxn],dep[Maxn],son[Maxn],size[Maxn],fa[Maxn];
int id[Maxn],rk[Maxn],top[Maxn],num=0,ef[Maxn],et[Maxn],temp[Maxn];
char S[100];
void read()
{
	char ch=getchar();int x=0;
	while((ch<'a'||ch>'z')&&(ch<'A'||ch>'Z')) ch=getchar();
	while((ch<='z'&&ch>='a')&&(ch<='Z'&&ch>='A')){S[x]=ch;x++;ch=getchar();}
}
void add_edge(int f,int t,int v)
{
	e[++num].nxt=head[f];
	e[num].t=t,e[num].val=v;
	head[f]=num;
}
void dfs1(int x,int d)
 {
	dep[x]=d,size[x]=1;
	for(int i=head[x];i;i=e[i].nxt)
	{
		int v=e[i].t;
		if(v==fa[x]) continue;
		temp[v]=e[i].val;
		fa[v]=x;dfs1(v,d+1);
		size[x]+=size[v];
		if(size[v]>size[son[x]]) son[x]=v;
	}
}
void dfs2(int x,int tp)
{
	id[++num]=x,rk[x]=num;top[x]=tp;
	if(!son[x])return;
	else dfs2(son[x],tp);
	for(int i=head[x];i;i=e[i].nxt)
	{
		int v=e[i].t;
		if(v==fa[x]||v==son[x]) continue;
		dfs2(v,v);
	}
}
void push_down(int p)
{
	int s=t[p].lazyS,c=t[p].lazyC;
	t[p].lazyS=0,t[p].lazyC=-1;
	if(s==0&&c==-1) return;
	if(c!=-1)
	{
		t[ls].lazyC=c,t[rs].lazyC=c;
		t[ls].lazyS=0,t[rs].lazyS=0;
		t[ls].Max=c;t[rs].Max=c;
	}
	t[ls].lazyS+=s;t[rs].lazyS+=s;
	t[ls].Max+=s;t[rs].Max+=s;
}
void ModifyC(int l,int r,int p,int w)
{
	if(t[p].l==l&&t[p].r==r)
	{
		t[p].lazyC=w;t[p].lazyS=0;t[p].Max=w;
		return ;
	}
	push_down(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l>mid) ModifyC(l,r,rs,w);
	else if(r<=mid) ModifyC(l,r,ls,w);
	else ModifyC(l,mid,ls,w),ModifyC(mid+1,r,rs,w);
	t[p].Max=max(t[ls].Max,t[rs].Max);
}
void ModifyS(int l,int r,int p,int k)
{
	if(t[p].l==l&&t[p].r==r)
	{
		t[p].lazyS+=k;t[p].Max+=k;
		return;
	}
	push_down(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(r<=mid) ModifyS(l,r,ls,k);
	else if(l>mid) ModifyS(l,r,rs,k);
	else ModifyS(l,mid,ls,k),ModifyS(mid+1,r,rs,k);
	t[p].Max=max(t[ls].Max,t[rs].Max);
}
void built(int l,int r,int p)//
{
	t[p].l=l,t[p].r=r;
	if(l==r){t[p].Max=a[l];return;}
	int mid=(l+r)>>1;t[p].lazyC=-1;
	built(l,mid,ls),built(mid+1,r,rs);
	t[p].Max=max(t[ls].Max,t[rs].Max);
}
int query(int l,int r,int p)//
{
	if(t[p].l==l&&t[p].r==r) return t[p].Max;
	push_down(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(r<=mid) return query(l,r,ls);
	else if(l>mid) return query(l,r,rs);
		else return max(query(l,mid,ls),query(mid+1,r,rs));
}
void ModifySOnTree(int x,int y,int k)
{
	while(top[x]!=top[y])
	{
		if(dep[x]<dep[y]) swap(x,y);
		ModifyS(rk[top[x]],rk[x],1,k);x=fa[top[x]];
	}
	if(dep[x]<dep[y]) swap(x,y);
	if(x==y) return;
	ModifyS(rk[y]+1,rk[x],1,k);
}
void ModifyCOnTree(int x,int y,int k)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ModifyC(rk[top[x]],rk[x],1,k);x=fa[top[x]];
	}
	if(dep[x]<dep[y]) swap(x,y);
	if(x==y) return;
	if(dep[x]>dep[y])ModifyC(rk[y]+1,rk[x],1,k);
}
int QueryOnTree(int x,int y)
{
	int ans=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=max(query(rk[top[x]],rk[x],1),ans);x=fa[top[x]];
	}
	if(dep[x]<dep[y]) swap(x,y);
	if(x==y) return ans;
	if(dep[x]>dep[y])ans=max(query(rk[y]+1,rk[x],1),ans);return ans;
}
int main()
{
	cin>>n;
	for(int i=1;i<n;++i)
	{
		int f,t,v;cin>>f>>t>>v;
		add_edge(f,t,v);add_edge(t,f,v);
		ef[i]=f,et[i]=t;
	}
	int s=1;
	num=0;fa[s]=s;
	dfs1(s,1),dfs2(s,s);
	for(int i=1;i<=n;++i) a[rk[i]]=temp[i];
	built(1,n,1);cin>>S;
	while(S[0]!='S')
	{
		if(S[0]=='M')
		{
			int x,y;cin>>x>>y;
			cout<<QueryOnTree(x,y)<<"\n";
		}
		if(S[0]=='A')
		{
			int x,y,k;cin>>x>>y>>k;
			ModifySOnTree(x,y,k);
		}
		if(S[0]=='C')
		{
			if(S[1]=='h')
			{
				int k,w;cin>>k>>w;
				if(fa[et[k]]==ef[k])
					ModifyC(rk[et[k]],rk[et[k]],1,w);
				else
					ModifyC(rk[ef[k]],rk[ef[k]],1,w);
			}
			else
			{
				int u,v,w;cin>>u>>v>>w;
				ModifyCOnTree(u,v,w);
			}
		}
		cin>>S;
	}
	return 0;
}
2020/11/23 19:12
加载中...