WA求助,只能过样例和自捏数据
查看原帖
WA求助,只能过样例和自捏数据
155907
1379号监听员楼主2020/10/24 21:17

代码:

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<windows.h>
using namespace std;
const long long maxn=100005;
long long read()
{
	long long s=0,w=1;
	char c=getchar();
	while(c<'0' || c>'9')
	{
		if(c=='-') w=-1;
		c=getchar();
	} 
	while(c>='0' && c<='9')
	{
		s=(s<<3)+(s<<1)+(c^48);
		c=getchar();
	}
	return s*w;
} 
long long n,m;
struct edge{
	long long to,w;
};
vector<edge> e[maxn];
//vector<pair<long long,long long> > edges; 
void addedge(long long u,long long v,long long w)
{
	e[u].push_back(edge{v,w});
	e[v].push_back(edge{u,w});
}
long long val[maxn],dep[maxn],fa[maxn],sz[maxn],son[maxn];
long long seg[maxn],tot,top[maxn],rev[maxn*4];
long long eu[maxn],ev[maxn];
void dfs1(long long u,long long f,long long wlast)
{
	dep[u]=dep[f]+1;
	val[u]=wlast;
	fa[u]=f;
	sz[u]=1;
	long long mx=0;
	for(long long i=0;i<e[u].size();i++)
	{
		long long v=e[u][i].to,w=e[u][i].w;
		if(v==f) continue;
		dfs1(v,u,w);
		sz[u]+=sz[v];
		if(sz[v]>mx)
		{
			mx=sz[v];
			son[u]=v;
		}
	}
}
void dfs2(long long u)
{
	if(son[u])	
	{
		seg[son[u]]=++tot;
		rev[tot]=son[u];
		top[son[u]]=top[u];
		dfs2(son[u]);
		for(long long i=0;i<e[u].size();i++)
		{
			long long v=e[u][i].to;
			if(v!=fa[u] && v!=son[u])
			{
				seg[v]=++tot;
				rev[tot]=v;
				top[v]=v;
				dfs2(v);
			}
		}
	}
}
struct segtree{
	long long l,r,dat,add,chg=-1;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define dat(x) tree[x].dat
	#define add(x) tree[x].add
	#define chg(x) tree[x].chg 
};
segtree tree[maxn*4];
void build(long long p,long long l,long long r)
{
	l(p)=l;
	r(p)=r;
	if(l==r) 
	{
		dat(p)=val[rev[l]];
		return;
	}
	long long mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	dat(p)=max(dat(p<<1),dat(p<<1|1));
}
void spread(long long p)
{
	if(chg(p)!=-1)
	{
		dat(p<<1)=dat(p<<1|1)=chg(p<<1)=chg(p<<1|1)=chg(p);
		add(p)=0;
		chg(p)=-1;
	}
	if(add(p))
	{
		dat(p<<1)+=add(p);
		dat(p<<1|1)+=add(p);
		add(p<<1)+=add(p);
		add(p<<1|1)+=add(p);
		add(p)=0;
	}
}
void change(long long p,long long l,long long r,long long c)
{
	if(l>r) swap(l,r);
	spread(p);
	if(l<=l(p) && r>=r(p))
	{
		dat(p)=chg(p)=c;
		return;
	}
	long long mid=(l(p)+r(p))>>1;
	if(l<=mid) change(p<<1,l,r,c);
	if(r>mid) change(p<<1|1,l,r,c);
	dat(p)=max(dat(p<<1),dat(p<<1|1));
}
void update(long long p,long long l,long long r,long long c)
{
	if(l>r) swap(l,r);
	spread(p);
	if(l<=l(p) && r>=r(p))
	{
		add(p)+=c;
		dat(p)+=c;
		return;
	}
	long long mid=(l(p)+r(p))>>1;
	if(l<=mid) update(p<<1,l,r,c);
	if(r>mid) update(p<<1|1,l,r,c);
	dat(p)=max(dat(p<<1),dat(p<<1|1));
}
long long ask(long long p,long long l,long long r)
{
	if(l>r) swap(l,r);
	spread(p);
	if(l<=l(p) && r>=r(p))
	{
		return dat(p);
	}
	long long ans=0;
	long long mid=(l(p)+r(p))>>1;
	if(l<=mid) ans=max(ans,ask(p<<1,l,r));
	if(r>mid) ans=max(ans,ask(p<<1|1,l,r));
	return ans;
}
long long query(long long u,long long v)
{
	long long ans=0;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans=max(ans,ask(1,seg[top[u]],seg[u]));
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	ans=max(ans,ask(1,seg[u]+1,seg[v]));
	return ans;
}
void crange(long long u,long long v,long long c)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		change(1,seg[top[u]],seg[u],c);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	change(1,seg[u]+1,seg[v],c);
}
void urange(long long u,long long v,long long c)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		update(1,seg[top[u]],seg[u],c);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	update(1,seg[u]+1,seg[v],c);
}
string str;
long long x,y,z;
int main()
{
	n=read();
	for(long long i=1,u,v,w;i<n;i++)
	{
		u=read(),v=read(),w=read();
		addedge(u,v,w);
		eu[i]=u,ev[i]=v;
		//edges.push_back(make_pair(u,v));
	}
	dfs1(1,0,0);
	tot=seg[1]=rev[1]=top[1]=1;
	dfs2(1);
	build(1,1,n);
	while(1)
	{
		cin>>str;
		if(str=="Stop") break;
		else if(str=="Max")
		{
			x=read(),y=read();
			cout<<query(x,y)<<endl;
		}
		else if(str=="Change")
		{
			x=read(),z=read();
			//crange(edges[x].first,edges[x].second,z);
			if(dep[eu[x]]>dep[ev[x]]) change(1,seg[eu[x]],seg[eu[x]],z);
			else change(1,seg[ev[x]],seg[ev[x]],z);
		}
		else if(str=="Cover")
		{
			x=read(),y=read(),z=read();
			crange(x,y,z);
		}
		else if(str=="Add")
		{
			x=read(),y=read(),z=read();
			urange(x,y,z);
		}
	}
} 
2020/10/24 21:17
加载中...