Submission #504019

# Submission time Handle Problem Language Result Execution time Memory
504019 2022-01-09T14:03:23 Z Victor Valley (BOI19_valley) C++17
100 / 100
509 ms 42200 KB
// #pragma GCC target ("avx,avx2,fma")
// #pragma GCC optimize ("Ofast,inline") // O1 - O2 - O3 - Os - Ofast
// #pragma GCC optimize ("unroll-loops")
#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b) for (int i = (a); i < (b); ++i)
#define per(i, a, b) for (int i = (b - 1); i >= (a); --i)
#define trav(a, x) for (auto &a : x)

#define all(x) x.begin(), x.end()
#define sz(x) x.size()
#define pb push_back
#define debug(x) cout << #x << " = " << x << endl

#define umap unordered_map
#define uset unordered_set

typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<vi> vvi;

typedef long long ll;
typedef pair<ll, ll> pll;
typedef vector<ll> vll;
typedef vector<pll> vpll;

const ll INF = 1e17;

struct Node {
    int lo, hi;
    ll madd = 0, val;
    Node *l, *r;

    Node(int L, int R) : lo(L), hi(R) {
        val = INF;
        if (hi - lo != 1) {
            int mid = (lo + hi) / 2;
            l = new Node(lo, mid);
            r = new Node(mid, hi);
        }
    }

    ll query(int L, int R) {
        // cout<<"L = "<<L<<" R = "<<R<<" lo = "<<lo<<" hi = "<<hi<<" val = "<<val<<endl;
        if (hi <= L || R <= lo) return INF;
        if (L <= lo && hi <= R) return val;

        push();
        return min(l->query(L, R), r->query(L, R));
    }

    void add(int L, int R, ll x) {
        if (hi <= L || R <= lo) return;
        if (L <= lo && hi <= R) {
            madd += x;
            val += x;

        } else {
            push();
            l->add(L, R, x);
            r->add(L, R, x);
            val = min(l->val, r->val);
        }
    }

    void push() {
        if (madd) {
            if (hi - lo != 1) {
                l->add(lo, hi, madd);
                r->add(lo, hi, madd);
            }
            madd = 0;
        }
    }
};

int n, s, q, e, euler_pos[100001], depth[100001], sub_size[100001], queries_sub[100001], cnt = 0, order[100001];
ll dist[100001];
vpll graph[100001];
vector<iii> edges;
vii queries[100001];
vi shop;
string ans[100001];
Node *segtree;

void prep(int u, int p, int cur_depth, ll cur_dist) {
    order[cnt] = u;
    euler_pos[u] = cnt++;

    sub_size[u] = 1;
    dist[u] = cur_dist;
    depth[u] = cur_depth;
    
    //cout<<"u = "<<u+1<<" dist = "<<dist[u]<<endl;

    trav(edge, graph[u]) {
        int v, w;
        tie(v, w) = edge;
        if (v != p) {
            prep(v, u, cur_depth + 1, cur_dist + w);
            sub_size[u] += sub_size[v];
            queries_sub[u] += queries_sub[v];
        }
    }
}

void solve(int u, int p) {
    trav(query, queries[u]) {
        int edge, indx;
        tie(edge, indx) = query;

        int a, b, w;
        w = edges[edge].first;
        tie(a, b) = edges[edge].second;
        if (depth[a] > depth[b]) swap(a, b);

        bool work = 1;
        if ((euler_pos[b] <= euler_pos[u] && euler_pos[u] < euler_pos[b] + sub_size[b]) ^ (euler_pos[b] <= euler_pos[e] && euler_pos[e] < euler_pos[b] + sub_size[b])) work = 0;

        if (work)
            ans[indx] = "escaped";
        else {
            ll min_dist;
            if (euler_pos[b] <= euler_pos[u] && euler_pos[u] < euler_pos[b] + sub_size[b]) {
                min_dist = segtree->query(euler_pos[b], euler_pos[b] + sub_size[b]);

            } else {
                min_dist = min(segtree->query(0, euler_pos[b]), segtree->query(euler_pos[b] + sub_size[b], n));
                //rep(i, 0, n) cout << "u = " << i + 1 << " dist = " << segtree->query(euler_pos[i], euler_pos[i] + 1) << endl;
            }
            ans[indx] = to_string(min_dist);
            if (min_dist > 1e15) ans[indx] = "oo";
        }
    }

    trav(edge, graph[u]) {
        int v, w;
        tie(v, w) = edge;
        if (v != p && queries_sub[v]) {
            segtree->add(0, euler_pos[v], w);
            segtree->add(euler_pos[v], euler_pos[v] + sub_size[v], -w);
            segtree->add(euler_pos[v] + sub_size[v], n, w);
            solve(v, u);
            segtree->add(0, euler_pos[v], -w);
            segtree->add(euler_pos[v], euler_pos[v] + sub_size[v], w);
            segtree->add(euler_pos[v] + sub_size[v], n, -w);
        }
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);

    memset(queries_sub, 0, sizeof(queries_sub));
    cin >> n >> s >> q >> e;
    e--;
    segtree = new Node(0, n);

    rep(i, 0, n - 1) {
        int u, v, w;
        cin >> u >> v >> w;
        edges.pb({w, {--u, --v}});
        graph[u].emplace_back(v, w);
        graph[v].emplace_back(u, w);
    }

    rep(i, 0, s) {
        int u;
        cin >> u;
        shop.pb(u - 1);
    }

    rep(i, 0, q) {
        int edge, u;
        cin >> edge >> u;
        queries[--u].emplace_back(edge - 1, i);
        ++queries_sub[u];
    }

    prep(0, 0, 0, 0);
    trav(u, shop) segtree->add(euler_pos[u], euler_pos[u]+1, dist[u] - INF);
    
    //rep(i, 0, n) cout << "u = " << i + 1 << " dist = " << segtree->query(euler_pos[i], euler_pos[i] + 1) << endl;
    //cout << endl;
    solve(0, 0);
    rep(i, 0, q) cout << ans[i] << endl;
    return 0;
}

Compilation message

valley.cpp: In function 'void solve(int, int)':
valley.cpp:116:19: warning: variable 'w' set but not used [-Wunused-but-set-variable]
  116 |         int a, b, w;
      |                   ^
# Verdict Execution time Memory Grader output
1 Correct 21 ms 8744 KB Output is correct
2 Correct 18 ms 8752 KB Output is correct
3 Correct 18 ms 8792 KB Output is correct
4 Correct 21 ms 8680 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 21 ms 8744 KB Output is correct
2 Correct 18 ms 8752 KB Output is correct
3 Correct 18 ms 8792 KB Output is correct
4 Correct 21 ms 8680 KB Output is correct
5 Correct 7 ms 8908 KB Output is correct
6 Correct 7 ms 8780 KB Output is correct
7 Correct 9 ms 8780 KB Output is correct
8 Correct 6 ms 8780 KB Output is correct
9 Correct 6 ms 8780 KB Output is correct
10 Correct 9 ms 8776 KB Output is correct
11 Correct 7 ms 8780 KB Output is correct
12 Correct 7 ms 8776 KB Output is correct
13 Correct 7 ms 8848 KB Output is correct
14 Correct 7 ms 8780 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 365 ms 29632 KB Output is correct
2 Correct 419 ms 29556 KB Output is correct
3 Correct 409 ms 29684 KB Output is correct
4 Correct 509 ms 33736 KB Output is correct
5 Correct 332 ms 32660 KB Output is correct
6 Correct 378 ms 42200 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 21 ms 8744 KB Output is correct
2 Correct 18 ms 8752 KB Output is correct
3 Correct 18 ms 8792 KB Output is correct
4 Correct 21 ms 8680 KB Output is correct
5 Correct 7 ms 8908 KB Output is correct
6 Correct 7 ms 8780 KB Output is correct
7 Correct 9 ms 8780 KB Output is correct
8 Correct 6 ms 8780 KB Output is correct
9 Correct 6 ms 8780 KB Output is correct
10 Correct 9 ms 8776 KB Output is correct
11 Correct 7 ms 8780 KB Output is correct
12 Correct 7 ms 8776 KB Output is correct
13 Correct 7 ms 8848 KB Output is correct
14 Correct 7 ms 8780 KB Output is correct
15 Correct 365 ms 29632 KB Output is correct
16 Correct 419 ms 29556 KB Output is correct
17 Correct 409 ms 29684 KB Output is correct
18 Correct 509 ms 33736 KB Output is correct
19 Correct 332 ms 32660 KB Output is correct
20 Correct 378 ms 42200 KB Output is correct
21 Correct 361 ms 30896 KB Output is correct
22 Correct 362 ms 30760 KB Output is correct
23 Correct 403 ms 30820 KB Output is correct
24 Correct 402 ms 33768 KB Output is correct
25 Correct 319 ms 39364 KB Output is correct
26 Correct 385 ms 30860 KB Output is correct
27 Correct 375 ms 30756 KB Output is correct
28 Correct 358 ms 30812 KB Output is correct
29 Correct 420 ms 34208 KB Output is correct
30 Correct 410 ms 36756 KB Output is correct
31 Correct 348 ms 30776 KB Output is correct
32 Correct 397 ms 30616 KB Output is correct
33 Correct 363 ms 30372 KB Output is correct
34 Correct 467 ms 33204 KB Output is correct
35 Correct 304 ms 38044 KB Output is correct
36 Correct 396 ms 31856 KB Output is correct