제출 #1096297

#제출 시각아이디문제언어결과실행 시간메모리
1096297boclobanchatValley (BOI19_valley)C++14
100 / 100
215 ms32852 KiB
#include<bits/stdc++.h>
using namespace std;
#define ii pair<long long,long long>
#define fi first
#define se second
struct path { long long l,r,v; };
const int MAXN=1e5+5;
const long long INF=1e18;
int L[MAXN],R[MAXN],dis[MAXN],tdfs=0,n,s,q,h;
long long seg[MAXN*4],lazy[MAXN*4],ans[MAXN],D[MAXN];
path P[MAXN];
ii Q[MAXN];
vector<ii> ds[MAXN];
vector<int> vq[MAXN];
bool ck[MAXN];
void dfs(int i,int pre)
{
	L[i]=++tdfs;
	for(auto v:ds[i]) if(v.fi!=pre)
	{
		dis[v.fi]=dis[i]+1,D[v.fi]=D[i]+v.se;
		dfs(v.fi,i);
	}
	R[i]=tdfs;
}
void down(int pos)
{
	long long val=lazy[pos];
	seg[pos*2]+=val,seg[pos*2+1]+=val;
	lazy[pos*2]+=val,lazy[pos*2+1]+=val,lazy[pos]=0;
}
void update(int l,int r,int u,int v,long long val,int pos)
{
	if(v<l||r<u) return ;
	if(u<=l&&r<=v)
	{
		seg[pos]+=val,lazy[pos]+=val;
		return ;
	}
	int mid=(l+r)/2;
	down(pos);
	update(l,mid,u,v,val,pos*2);
	update(mid+1,r,u,v,val,pos*2+1);
	seg[pos]=min(seg[pos*2],seg[pos*2+1]);
}
long long get(int l,int r,int u,int v,int pos)
{
	if(u<=l&&r<=v) return seg[pos];
	int mid=(l+r)/2;
	down(pos);
	if(v<=mid) return get(l,mid,u,v,pos*2);
	if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
	return min(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
long long inr(int l,int r) { return get(1,n,l,r,1); }
long long onr(int l,int r)
{
	long long ans=INF;
	if(l>1) ans=min(ans,get(1,n,1,l-1,1));
	if(r<n) ans=min(ans,get(1,n,r+1,n,1));
	return ans;
}
bool check(int a,int b) { return L[a]<=L[b]&&R[b]<=R[a]; }
void dfsus(int i,int pre)
{
	for(auto v:vq[i])
	{
		int p=Q[v].fi,a=P[p].l,b=P[p].r;
		if(dis[a]<dis[b]) swap(a,b);
		if((check(a,h)^check(a,i))==0) ans[v]=-1;
		else if(check(a,i)) ans[v]=inr(L[a],R[a]);
		else ans[v]=onr(L[a],R[a]);
	}
	for(auto v:ds[i]) if(v.fi!=pre)
	{
		update(1,n,1,n,v.se,1);
		update(1,n,L[v.fi],R[v.fi],-v.se*2,1);
		dfsus(v.fi,i);
		update(1,n,1,n,-v.se,1);
		update(1,n,L[v.fi],R[v.fi],v.se*2,1);
	}
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>s>>q>>h;
    for(int i=1;i<n;i++)
    {
    	int l,r,v;
    	cin>>l>>r>>v;
    	ds[l].push_back({r,v}),ds[r].push_back({l,v}),P[i]={l,r,v};
	}
	dfs(1,1);
	for(int i=1;i<=s;i++)
	{
		int res;
		cin>>res;
		ck[res]=true;
	}
	for(int i=1;i<=n;i++) if(ck[i]) update(1,n,L[i],L[i],D[i],1);
	else update(1,n,L[i],L[i],INF,1);
	for(int i=1;i<=q;i++)
	{
		cin>>Q[i].fi>>Q[i].se;
		vq[Q[i].se].push_back(i);
	}
	dfsus(1,1);
	for(int i=1;i<=q;i++) if(ans[i]==-1) cout<<"escaped\n";
	else if(ans[i]<1e16) cout<<ans[i]<<"\n";
	else cout<<"oo\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...