#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define watch(x) cout<<(#x)<<"="<<(x)<<'\n'
#define mset(d,val) memset(d,val,sizeof(d))
#define setp(x) cout<<fixed<<setprecision(x)
#define forn(i,a,b) for(int i=(a);i<(b);i++)
#define fore(i,a,b) for(int i=(a);i<=(b);i++)
#define pb push_back
#define F first
#define S second
#define pqueue priority_queue
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<ll> vi;
typedef vector<ii> vii;
typedef long double ld;
typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds;
void amin(ll &a, ll b){ a=min(a,b); }
void amax(ll &a, ll b){ a=max(a,b); }
void YES(){cout<<"YES\n";} void NO(){cout<<"NO\n";}
void SD(int t=0){ cout<<"PASSED "<<t<<endl; }
const ll INF = ll(1e18);
const int MOD = 998244353;
class LazySegmentTree{
private:
int size_;
vector<ll> v,lazy;
void update(int s, int e, ll val, int k, int l, int r){
push(k, l, r);
if(r < s || e < l) return;
if(s <= l && r <= e){
lazy[k] += val;
push(k, l, r);
}
else{
update(s, e, val, k*2, l, (l+r)>>1);
update(s, e, val, k*2+1, ((l+r)>>1)+1, r);
v[k] = merge(v[k*2], v[k*2+1]);
}
}
ll query(int s, int e, int k, int l, int r){
push(k, l, r);
if(r < s || e < l) return INF; //dummy value
if(s <= l && r <= e) return v[k];
ll lc = query(s, e, k*2, l, (l+r)>>1);
ll rc = query(s, e, k*2+1, ((l+r)>>1)+1, r);
return merge(lc, rc);
}
public:
LazySegmentTree(): v(vector<ll>()), lazy(vector<ll>()) {}
LazySegmentTree(int n){
for(size_=1;size_<n;) size_<<=1;
v.resize(size_*4);
lazy.resize(size_*4);
}
void reset(){
v.assign(size_*4,0);
lazy.assign(size_*4,0);
}
inline void push(int k, int l, int r){
if(lazy[k]!=0){
v[k] += lazy[k]; //remember to consider the range!
if(l!=r){
lazy[k*2]+=lazy[k];
lazy[k*2+1]+=lazy[k];
}
lazy[k]=0;
}
}
inline ll merge(ll x, ll y){
return min(x,y);
}
inline void update(int l, int r, ll val){
update(l, r, val, 1, 0, size_-1);
}
inline ll query(int l, int r){
return query(l, r, 1, 0, size_-1);
}
};
const bool DEBUG = 0;
const int MAXN = 100005;
int n,S,Q,E;
vii adj[MAXN];
vii edges;
ll dist[MAXN];
vi shops;
LazySegmentTree st;
vii que[MAXN]; //friend location, query index
int in[MAXN],out[MAXN],tmr=-1,dep[MAXN];
ll ans[MAXN];
void dfs_euler(int u, int p)
{
//cout<<"dfs_euler("<<u+1<<","<<p+1<<")"<<endl;
in[u]=++tmr;
for(ii tmp: adj[u])
{
int v=tmp.F; ll w=tmp.S;
if(v==p) continue;
dep[v]=dep[u]+1;
dist[v]=dist[u]+w;
dfs_euler(v,u);
}
out[u]=tmr;
}
void dfs(int u, int p)
{
//cout<<"dfs("<<u+1<<","<<p+1<<")"<<endl;
for(ii q: que[u])
{
int sub=q.F, id=q.S;
//u is in queried subtree
if(in[sub]<=in[u] && out[u]<=out[sub]){
ans[id]=st.query(in[sub], out[sub]);
}
//outside, escaped
else{
ans[id]=-1;
}
}
for(ii tmp: adj[u])
{
int v=tmp.F; ll w=tmp.S;
if(v==p) continue;
st.update(in[v], out[v], -w);
st.update(0, in[v]-1, w);
st.update(out[v]+1, n-1, w);
dfs(v,u);
//undo everything
st.update(in[v], out[v], w);
st.update(0, in[v]-1, -w);
st.update(out[v]+1, n-1, -w);
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>n>>S>>Q>>E; E--;
st=LazySegmentTree(n);
forn(i,0,n) st.update(i,i,INF);
forn(i,0,n-1){
int u,v; ll w; cin>>u>>v>>w; u--; v--;
adj[u].pb({v,w});
adj[v].pb({u,w});
edges.pb({u,v});
}
dfs_euler(E,-1);
forn(i,0,S){
int u; cin>>u; u--;
shops.pb(u);
st.update(in[u], in[u], -INF+dist[u]); //distance from node E
}
forn(i,0,Q){
int e; cin>>e; e--;
int u=edges[e].F, v=edges[e].S;
if(dep[u]>dep[v]) swap(u,v); //ensure v is lower (deeper)
int f; cin>>f; f--; //friend
que[f].pb({v,i});
}
dfs(E,-1);
forn(i,0,Q){
if(ans[i]>1e16) cout<<"oo\n";
else if(ans[i]==-1) cout<<"escaped\n";
else cout<<ans[i]<<'\n';
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
5504 KB |
Output is correct |
2 |
Correct |
6 ms |
5504 KB |
Output is correct |
3 |
Correct |
7 ms |
5504 KB |
Output is correct |
4 |
Correct |
7 ms |
5504 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
5504 KB |
Output is correct |
2 |
Correct |
6 ms |
5504 KB |
Output is correct |
3 |
Correct |
7 ms |
5504 KB |
Output is correct |
4 |
Correct |
7 ms |
5504 KB |
Output is correct |
5 |
Correct |
6 ms |
5248 KB |
Output is correct |
6 |
Correct |
5 ms |
5248 KB |
Output is correct |
7 |
Correct |
6 ms |
5376 KB |
Output is correct |
8 |
Correct |
6 ms |
5256 KB |
Output is correct |
9 |
Correct |
8 ms |
5376 KB |
Output is correct |
10 |
Correct |
5 ms |
5376 KB |
Output is correct |
11 |
Correct |
5 ms |
5248 KB |
Output is correct |
12 |
Correct |
5 ms |
5248 KB |
Output is correct |
13 |
Correct |
6 ms |
5376 KB |
Output is correct |
14 |
Correct |
5 ms |
5376 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
390 ms |
30824 KB |
Output is correct |
2 |
Correct |
410 ms |
30568 KB |
Output is correct |
3 |
Correct |
421 ms |
30568 KB |
Output is correct |
4 |
Correct |
445 ms |
34152 KB |
Output is correct |
5 |
Correct |
424 ms |
34280 KB |
Output is correct |
6 |
Correct |
424 ms |
38888 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
5504 KB |
Output is correct |
2 |
Correct |
6 ms |
5504 KB |
Output is correct |
3 |
Correct |
7 ms |
5504 KB |
Output is correct |
4 |
Correct |
7 ms |
5504 KB |
Output is correct |
5 |
Correct |
6 ms |
5248 KB |
Output is correct |
6 |
Correct |
5 ms |
5248 KB |
Output is correct |
7 |
Correct |
6 ms |
5376 KB |
Output is correct |
8 |
Correct |
6 ms |
5256 KB |
Output is correct |
9 |
Correct |
8 ms |
5376 KB |
Output is correct |
10 |
Correct |
5 ms |
5376 KB |
Output is correct |
11 |
Correct |
5 ms |
5248 KB |
Output is correct |
12 |
Correct |
5 ms |
5248 KB |
Output is correct |
13 |
Correct |
6 ms |
5376 KB |
Output is correct |
14 |
Correct |
5 ms |
5376 KB |
Output is correct |
15 |
Correct |
390 ms |
30824 KB |
Output is correct |
16 |
Correct |
410 ms |
30568 KB |
Output is correct |
17 |
Correct |
421 ms |
30568 KB |
Output is correct |
18 |
Correct |
445 ms |
34152 KB |
Output is correct |
19 |
Correct |
424 ms |
34280 KB |
Output is correct |
20 |
Correct |
424 ms |
38888 KB |
Output is correct |
21 |
Correct |
371 ms |
29544 KB |
Output is correct |
22 |
Correct |
396 ms |
29148 KB |
Output is correct |
23 |
Correct |
409 ms |
29288 KB |
Output is correct |
24 |
Correct |
391 ms |
33384 KB |
Output is correct |
25 |
Correct |
399 ms |
39144 KB |
Output is correct |
26 |
Correct |
376 ms |
29420 KB |
Output is correct |
27 |
Correct |
378 ms |
29164 KB |
Output is correct |
28 |
Correct |
373 ms |
29160 KB |
Output is correct |
29 |
Correct |
390 ms |
31976 KB |
Output is correct |
30 |
Correct |
426 ms |
35312 KB |
Output is correct |
31 |
Correct |
354 ms |
29544 KB |
Output is correct |
32 |
Correct |
372 ms |
29416 KB |
Output is correct |
33 |
Correct |
375 ms |
29416 KB |
Output is correct |
34 |
Correct |
408 ms |
33128 KB |
Output is correct |
35 |
Correct |
392 ms |
39016 KB |
Output is correct |
36 |
Correct |
404 ms |
33512 KB |
Output is correct |