Submission #206092

# Submission time Handle Problem Language Result Execution time Memory
206092 2020-03-02T09:02:21 Z alishahali1382 Valley (BOI19_valley) C++14
100 / 100
366 ms 24312 KB
#include <bits/stdc++.h>
#pragma GCC optimize ("O2")
#pragma GCC optimize ("unroll-loops")
//#pragma GCC optimize("no-stack-protector,fast-math")

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef pair<ll, ll> pll;
#define debug(x) cerr<<#x<<'='<<(x)<<endl;
#define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl;
#define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl;
#define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;}
#define all(x) x.begin(), x.end()
#define pb push_back
#define kill(x) return cout<<x<<'\n', 0;

const ld eps=1e-7;
const int inf=1000000010;
const ll INF=10000000000000010LL;
const int mod = 1000000007;
const int MAXN = 100010, LOG=20;

int n, m, q, k, u, v, x, y, t, a, b, root;
int E[MAXN][3];
int stt[MAXN], fnt[MAXN], timer=1;
int par[MAXN], parid[MAXN];
ll seg[MAXN<<2], lazy[MAXN<<2];
ll ans[MAXN];
vector<int> G[MAXN];
vector<pii> Q[MAXN];

void add_lazy(int id, ll val){
	seg[id]+=val;
	lazy[id]+=val;
}

void shift(int id){
	if (!lazy[id]) return ;
	add_lazy(id<<1, lazy[id]);
	add_lazy(id<<1 | 1, lazy[id]);
	lazy[id]=0;
}

void Add(int id, int tl, int tr, int l, int r, ll val){
	if (r<=tl || tr<=l) return ;
	if (l<=tl && tr<=r){
		add_lazy(id, val);
		return ;
	}
	shift(id);
	int mid=(tl+tr)>>1;
	Add(id<<1, tl, mid, l, r, val);
	Add(id<<1 | 1, mid, tr, l, r, val);
	seg[id]=min(seg[id<<1], seg[id<<1 | 1]);
}

ll Get(int id, int tl, int tr, int l, int r){
	if (r<=tl || tr<=l) return seg[0];
	if (l<=tl && tr<=r) return seg[id];
	shift(id);
	int mid=(tl+tr)>>1;
	return min(Get(id<<1, tl, mid, l, r), Get(id<<1 | 1, mid, tr, l, r));
}

void dfs1(int node){
	stt[node]=timer++;
	for (int v:G[node]) if (v!=par[node]){
		par[v]=node;
		dfs1(v);
	}
	fnt[node]=timer;
}

void dfs2(int node){
	for (pii p:Q[node]) ans[p.second]=Get(1, 1, n+1, stt[p.first], fnt[p.first]);
	for (int v:G[node]) if (v!=par[node]){
		int id=parid[v];
		Add(1, 1, n+1, 1, n+1, E[id][2]);
		Add(1, 1, n+1, stt[v], fnt[v], -2*E[id][2]);
		dfs2(v);
		Add(1, 1, n+1, 1, n+1, -E[id][2]);
		Add(1, 1, n+1, stt[v], fnt[v], 2*E[id][2]);
	}
}

int main(){
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	seg[0]=INF;
	cin>>n>>m>>q>>root;
	for (int i=1; i<n; i++){
		cin>>E[i][0]>>E[i][1]>>E[i][2];
		G[E[i][0]].pb(E[i][1]);
		G[E[i][1]].pb(E[i][0]);
	}
	dfs1(root);
	while (m--){
		cin>>v;
		Add(1, 1, n+1, stt[v], stt[v]+1, -INF);
	}
	Add(1, 1, n+1, 1, n+1, +INF);
	for (int i=1; i<n; i++){
		if (par[E[i][0]]!=E[i][1]) swap(E[i][0], E[i][1]);
		parid[E[i][0]]=i;
		Add(1, 1, n+1, stt[E[i][0]], fnt[E[i][0]], E[i][2]);
	}
	
	for (int i=1; i<=q; i++){
		cin>>x>>v;
		if (stt[E[x][0]]<=stt[v] && fnt[v]<=fnt[E[x][0]]) Q[v].pb({E[x][0], i});
		else ans[i]=-1;
	}
	dfs2(root);
	
	for (int i=1; i<=q; i++){
		if (ans[i]<0) cout<<"escaped\n";
		else if (ans[i]>=INF) cout<<"oo\n";
		else cout<<ans[i]<<'\n';
	}
	
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 10 ms 5368 KB Output is correct
2 Correct 10 ms 5368 KB Output is correct
3 Correct 11 ms 5368 KB Output is correct
4 Correct 10 ms 5368 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 5368 KB Output is correct
2 Correct 10 ms 5368 KB Output is correct
3 Correct 11 ms 5368 KB Output is correct
4 Correct 10 ms 5368 KB Output is correct
5 Correct 9 ms 5240 KB Output is correct
6 Correct 9 ms 5240 KB Output is correct
7 Correct 9 ms 5240 KB Output is correct
8 Correct 9 ms 5240 KB Output is correct
9 Correct 9 ms 5240 KB Output is correct
10 Correct 10 ms 5240 KB Output is correct
11 Correct 9 ms 5240 KB Output is correct
12 Correct 9 ms 5240 KB Output is correct
13 Correct 9 ms 5240 KB Output is correct
14 Correct 9 ms 5240 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 304 ms 18168 KB Output is correct
2 Correct 310 ms 17784 KB Output is correct
3 Correct 332 ms 17784 KB Output is correct
4 Correct 345 ms 19192 KB Output is correct
5 Correct 313 ms 18168 KB Output is correct
6 Correct 366 ms 24056 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 5368 KB Output is correct
2 Correct 10 ms 5368 KB Output is correct
3 Correct 11 ms 5368 KB Output is correct
4 Correct 10 ms 5368 KB Output is correct
5 Correct 9 ms 5240 KB Output is correct
6 Correct 9 ms 5240 KB Output is correct
7 Correct 9 ms 5240 KB Output is correct
8 Correct 9 ms 5240 KB Output is correct
9 Correct 9 ms 5240 KB Output is correct
10 Correct 10 ms 5240 KB Output is correct
11 Correct 9 ms 5240 KB Output is correct
12 Correct 9 ms 5240 KB Output is correct
13 Correct 9 ms 5240 KB Output is correct
14 Correct 9 ms 5240 KB Output is correct
15 Correct 304 ms 18168 KB Output is correct
16 Correct 310 ms 17784 KB Output is correct
17 Correct 332 ms 17784 KB Output is correct
18 Correct 345 ms 19192 KB Output is correct
19 Correct 313 ms 18168 KB Output is correct
20 Correct 366 ms 24056 KB Output is correct
21 Correct 273 ms 21208 KB Output is correct
22 Correct 275 ms 20920 KB Output is correct
23 Correct 284 ms 20984 KB Output is correct
24 Correct 333 ms 22652 KB Output is correct
25 Correct 318 ms 24312 KB Output is correct
26 Correct 245 ms 21240 KB Output is correct
27 Correct 274 ms 21112 KB Output is correct
28 Correct 285 ms 20856 KB Output is correct
29 Correct 315 ms 22264 KB Output is correct
30 Correct 321 ms 22776 KB Output is correct
31 Correct 265 ms 21368 KB Output is correct
32 Correct 269 ms 20984 KB Output is correct
33 Correct 285 ms 20984 KB Output is correct
34 Correct 322 ms 22564 KB Output is correct
35 Correct 326 ms 24188 KB Output is correct
36 Correct 288 ms 21752 KB Output is correct