Submission #1275414

#TimeUsernameProblemLanguageResultExecution timeMemory
1275414SoMotThanhXuanValley (BOI19_valley)C++17
100 / 100
113 ms39192 KiB
#include<bits/stdc++.h>
using namespace std;
#define FOR(i , a, b)for(int i = a; i <= b; i++)
#define REP(i , a, b) for(int i = b ;i >= a;i--)
#define ALL(v) v.begin() , v.end()
#define pb push_back
#define F first
#define S second
#define pii pair<int ,int>
bool minimize(int& a, int b){
	if(a > b){
		a = b;
		return 1;
	}
	return 0;
}
bool minimizell(long long& a, long long b){
	if(a > b){
		a = b;
		return 1;
	}
	return 0;
}
bool maximize(int& a, int b){
	if(a < b){
		a = b;
		return 1;
	}
	return 0;
}
bool maximizell(long long& a, long long b){
	if(a < b){
		a = b;
		return 1;
	}
	return 0;
}
const int maxN = 1e5 + 999;
vector<pii> e[maxN];
int n , q, numHouse, escape;
int cost[maxN];
int house[maxN];
pii Edge[maxN];
const long long MAXLL = 1e18 +9;
namespace sub1{
	 bool check(){
		return (n <= 1000);
	 }
	 long long d[maxN];
	 bool vis[maxN];
	 void dfs(int u, int collapse){
		vis[u] = 1;
		for(auto X  : e[u]){
			int x = X.F , id = X.S;
			if(vis[x] || id == collapse)continue;
			d[x] = d[u] + cost[id];
			dfs(x, collapse);
		}
	 }
	 void solve(){
		FOR(xcxc, 1, q){
			int collapse ,root;
			cin >> collapse >> root;
			FOR(i, 1, n)vis[i] = 0;
			d[root] = 0;
			dfs(root, collapse);
			if(vis[escape]){
				cout << "escaped" << '\n';
				continue;
			}
			long long mndis = MAXLL;
			FOR(u , 1 ,numHouse){
				if(vis[house[u]])minimizell(mndis , d[house[u]]);
			}
			if(mndis ==  MAXLL)cout << "oo" << '\n';
			else cout << mndis << '\n';

		}



	 }

}
namespace ac{
	int dep[maxN];
	long long dp[maxN] , f[maxN];
	long long mx[maxN][20];
	int in[maxN] , out[maxN], TICK;
	int T[maxN][20];
	void pre(int u ,int p){
		in[u] = out[u] = ++TICK;
		for(auto X : e[u]){
			int x = X.F ,id = X.S;
			if(x == p)continue;
			dep[x] = dep[u] + 1;
			T[x][0] = u;
			f[x] = f[u] + cost[id];
			pre(x, u);
			minimizell(dp[u] , dp[x] + cost[id]);
		}
		out[u] = TICK;
	}
	bool isP(int p ,int u){
		return (in[p] <= in[u] && out[u] <= out[p]);
	}
	long long jump(int u ,int p){
		long long ans = MAXLL;
		REP(i, 0 , 18){
			if(dep[u] - dep[p] >= (1 << i)){
//					cout << i << " "<<u << " " << T[u][i] <<  " " << mx[u][i] << '\n';
				minimizell(ans, mx[u][i]);
				u = T[u][i];
			}
		}
		minimizell(ans, dp[u] - f[u]);
//		cout << u << '\n';
		return ans;
	}
	void solve(){
		FOR(u, 1, n)dp[u] = MAXLL;
		FOR(i  ,1 ,numHouse)dp[house[i]] = 0;
		pre(escape ,0);
		FOR(u, 1, n){
			mx[u][0] = dp[u] - f[u];
		}
		FOR(i, 1 , 18){
			FOR(u, 1, n){
				T[u][i] = T[T[u][i - 1]][i - 1];
				mx[u][i] = min(mx[u][i - 1] , mx[T[u][i - 1]][i -  1]);
			}
		}
		FOR(xcxc, 1, q){
			int collapse ,x;
			cin >> collapse >> x;
			int u = Edge[collapse].F , v = Edge[collapse].S;
			if(dep[u] < dep[v])swap(u ,v);
			/// dep[u] <= dep[v]
			if(isP(u ,x)){
				long long ans = MAXLL;
				minimizell(ans, dp[x]);
				long long k =  jump(x , u);
				minimizell(ans ,k + f[x]);
//				cout << dp[3] - f[3] + f[5];
				if(ans > 1e17)cout << "oo" << '\n';
				else cout << ans << '\n';

			}else{
				cout << "escaped" << '\n';
			}


		}

	}

}
void solve(){
	cin >> n >> numHouse >> q >> escape;
	FOR(i, 1 , n - 1){
		int u , v ;
		cin >> u >> v >> cost[i];
		e[u].pb({v, i});
		e[v].pb({u ,i});
		Edge[i] = {u , v};
	}
	FOR(i, 1, numHouse)cin >> house[i];
	if(sub1::check())return sub1::solve();
	ac::solve();



}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	solve();
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...