• 「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
    ",ans[i]);
    	}
    }
    
  • 相关阅读:
    嵌入式系统移植三部曲 王晓峰
    嵌入式系统移植三部曲 李炎朔
    ser and client.c 王晓峰
    李炎朔 编程分析
    嵌入式系统移植三步曲 赵晓晓
    嵌入式系统移植三步曲 孟明明
    现在 搞技术确实越来越不值钱了
    Linux C局域网通信程序 刘志卿
    Firefox全面兼容中国银联“在线支付”
    Linux常识型试题
  • 原文地址:https://www.cnblogs.com/ctmlpfs/p/14071836.html
Copyright © 2020-2023  润新知