「BalticOI 2019 Day1」山谷

#include<bits/stdc++.h>
using namespace std;
#define N 1000010
#define int long long
struct no{
	int x,y;
};
vector<no>qu[N];
int n,s,q,e,h[N],v[N*2],nxt[N*2],ec,in[N],w[N*2],ou[N],a[N],b[N],ct,d[N],mx[N],mn[N],mv[N],tg[N],vi[N],cc,dv[N],st[N],tp,ans[N],fw[N];
void add(int x,int y,int z){v[++ec]=y;w[ec]=z;nxt[ec]=h[x];h[x]=ec;}
void dfs(int x,int fa){
	in[x]=++ct;
	if(vi[x]){
		mn[x]=++cc;
		st[cc]=x;
	}
	else
		mn[x]=1e9;
	for(int i=h[x];i;i=nxt[i])
		if(v[i]!=fa){
			dv[v[i]]=dv[x]+w[i];
			d[v[i]]=d[x]+1;
			dfs(v[i],x);
			mn[x]=min(mn[x],mn[v[i]]);
			mx[x]=max(mx[x],mx[v[i]]);
		}
	ou[x]=ct;
	if(vi[x])
		mx[x]=cc;
}
void pd(int o){
	if(tg[o]){
		tg[o*2]+=tg[o];
		tg[o*2+1]+=tg[o];
		mv[o*2]+=tg[o];
		mv[o*2+1]+=tg[o];
		tg[o]=0;
	}
}
void add(int o,int l,int r,int x,int y,int z){
	if(x>y||x>1e8||y>1e8)
		return;
	if(r<x||y<l)
		return;
	if(x<=l&&r<=y){
		mv[o]+=z;
		tg[o]+=z;
		return;
	}
	pd(o);
	int md=(l+r)/2;
	add(o*2,l,md,x,y,z);
	add(o*2+1,md+1,r,x,y,z);
	mv[o]=min(mv[o*2],mv[o*2+1]);
}
int qq(int o,int l,int r,int x,int y){
	if(x>y||x>1e8||y>1e8)
		return 1e18;
	if(r<x||y<l)
		return 1e18;
	if(x<=l&&r<=y)
		return mv[o];
	int md=(l+r)/2;
	pd(o);
	return min(qq(o*2,l,md,x,y),qq(o*2+1,md+1,r,x,y));
}
void dd(int x,int fa){
	for(int i=0;i<qu[x].size();i++){
		no y=qu[x][i];
		int e=a[y.x],f=b[y.x];
		if(d[e]<d[f])
			swap(e,f);
		if(in[e]<=in[x]&&in[x]<=ou[e])
			ans[y.y]=min(ans[y.y],qq(1,1,cc,mn[e],mx[e]));
		else{
			if(mn[e]>1)
				ans[y.y]=min(ans[y.y],qq(1,1,cc,1,mn[e]-1));
			if(mx[e]<cc)
				ans[y.y]=min(ans[y.y],qq(1,1,cc,mx[e]+1,cc));
		}
	}
	for(int i=h[x];i;i=nxt[i])
		if(v[i]!=fa){
			fw[v[i]]=w[i];
			add(1,1,cc,mn[v[i]],mx[v[i]],-w[i]);
			if(mn[v[i]]>1)
				add(1,1,cc,1,mn[v[i]]-1,w[i]);
			if(mx[v[i]]<cc)
				add(1,1,cc,mx[v[i]]+1,cc,w[i]);
			dd(v[i],x);
		}
	add(1,1,cc,mn[x],mx[x],fw[x]);
	if(mn[x]>1)
		add(1,1,cc,1,mn[x]-1,-fw[x]);
	if(mx[x]<cc)
		add(1,1,cc,mx[x]+1,cc,-fw[x]);
}
signed main(){
	scanf("%lld%lld%lld%lld",&n,&s,&q,&e);
	for(int i=1;i<n;i++){
		int x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		a[i]=x;
		b[i]=y;
		add(x,y,z);
		add(y,x,z);
	}
	for(int i=1;i<=s;i++){
		int x;
		scanf("%lld",&x);
		vi[x]=1;
	}
	dfs(e,0);
	memset(ans,127,sizeof(ans));
	for(int i=1;i<=q;i++){
		int x,y,e,f;
		scanf("%lld%lld",&x,&y);
		e=a[x];
		f=b[x];
		if(d[e]<d[f])
			swap(e,f);
		if(in[e]<=in[y]&&in[y]<=ou[e])
			qu[y].push_back((no){x,i});
		else
			ans[i]=-1;
	}
	for(int i=1;i<=cc;i++)
		add(1,1,cc,i,i,dv[st[i]]);
	dd(e,0);
	for(int i=1;i<=q;i++){
		if(ans[i]==-1)
			puts("escaped");
		else if(ans[i]>1e17)
			puts("oo");
		else
			printf("%lld\n",ans[i]);
	}
}
上一篇:多线程导致boost::remove_all 提前退出


下一篇:只知道Hadoop 3副本容错?用这种方式给公司节省五十万硬盘成本