Submission #116150

# Submission time Handle Problem Language Result Execution time Memory
116150 2019-06-11T01:26:04 Z RezwanArefin01 Werewolf (IOI18_werewolf) C++17
100 / 100
1732 ms 169324 KB
#include <bits/stdc++.h>
#include "werewolf.h"
using namespace std;

typedef vector<int> vi; 
typedef vector<vi> vvi; 

const int N = 2e5 + 10; 
vi adj[N], t[N << 2];  
int n, p[N], idx, vert[N];

void build(int node, int l, int r, vi &in) {
    if(l == r) {
        t[node].push_back(in[vert[l]]); 
        return; 
    }
    int m = l + r >> 1; 
    build(node << 1, l, m, in); 
    build(node << 1 | 1, m + 1, r, in); 

    merge(t[node << 1].begin(), t[node << 1].end(), 
        t[node << 1 | 1].begin(), t[node << 1 | 1].end(), 
        back_inserter(t[node]));
}

bool query(int node, int l, int r, int i, int j, int x, int y) {
    if(r < i || l > j) return 0; 
    if(i <= l && r <= j) {
        vi &v = t[node];
        auto L = lower_bound(v.begin(), v.end(), x); 
        if(L == v.end()) return 0; 
        return *L <= y; 
    }
    int m = l + r >> 1; 
    return query(node << 1, l, m, i, j, x, y) || 
        query(node << 1 | 1, m + 1, r, i, j, x, y); 
}

int find(int u) {
    return u == p[u] ? u : p[u] = find(p[u]); 
}

void build_rt(bool wolf, vector<vi> &t) {
    int st = wolf ? 0 : n - 1; 
    int ed = wolf ? n : -1; 
    int inc = wolf ? 1 : -1; 

    iota(p, p + N, 0); 

    for(int i = st; i != ed; i += inc) {
        for(int v : adj[i]) {
            if((wolf && v > i) || (!wolf && v < i)) break; 
            v = find(v);
            if(v == i) continue;
            p[v] = i;
            t[i].push_back(v);
        }
    }
}

void dfs(vvi &t, vvi &p, vi &in, vi &out, int u, int par, bool wolf = 0) {
    in[u] = ++idx;
    if(wolf) vert[idx] = u;
    p[u][0] = par; 
    for(int i = 1; i <= 18; ++i) if(p[u][i - 1] + 1) 
        p[u][i] = p[p[u][i - 1]][i - 1]; 
    for(int v : t[u]) if(v - par) 
        dfs(t, p, in, out, v, u, wolf); 
    out[u] = idx;
}

int walk(vvi &p, int u, int k, bool wolf) {
    for(int i = 18; i >= 0; --i) if(p[u][i] + 1) {
        int v = p[u][i];
        if((wolf && v <= k) || (!wolf && v >= k)) {
            u = v;
        }
    }
    return u;
}

vi check_validity(int _N, vi X, vi Y, vi S, vi E, vi L, vi R) {
    n = _N;
    for(int i = 0; i < X.size(); ++i) {
        adj[X[i]].push_back(Y[i]); 
        adj[Y[i]].push_back(X[i]); 
    }

    for(int i = 0; i < n; ++i) 
        sort(adj[i].begin(), adj[i].end()); 

    vvi pw(n, vi(19, -1)); 
    vvi ph(n, vi(19, -1)); 
    vvi tw(n), th(n);
    vi iw(n), ow(n), ih(n), oh(n); 

    build_rt(1, tw); 
    for(int i = 0; i < n; ++i) 
        reverse(adj[i].begin(), adj[i].end()); 
    build_rt(0, th);


    dfs(tw, pw, iw, ow, n - 1, -1, 1); 
    idx = 0; 
    dfs(th, ph, ih, oh, 0, -1); 

    build(1, 1, n, ih); 

    int Q = S.size();
    vi ans(Q);  

    for(int i = 0; i < Q; ++i) {
        int u = walk(ph, S[i], L[i], 0);
        int v = walk(pw, E[i], R[i], 1); 

        ans[i] = query(1, 1, n, iw[v], ow[v], ih[u], oh[u]);
    }

    return ans;
}

Compilation message

werewolf.cpp: In function 'void build(int, int, int, vi&)':
werewolf.cpp:17:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int m = l + r >> 1; 
             ~~^~~
werewolf.cpp: In function 'bool query(int, int, int, int, int, int, int)':
werewolf.cpp:34:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int m = l + r >> 1; 
             ~~^~~
werewolf.cpp: In function 'vi check_validity(int, vi, vi, vi, vi, vi, vi)':
werewolf.cpp:84:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < X.size(); ++i) {
                    ~~^~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 23 ms 24696 KB Output is correct
2 Correct 23 ms 24576 KB Output is correct
3 Correct 24 ms 24576 KB Output is correct
4 Correct 22 ms 24576 KB Output is correct
5 Correct 23 ms 24568 KB Output is correct
6 Correct 23 ms 24704 KB Output is correct
7 Correct 23 ms 24704 KB Output is correct
8 Correct 23 ms 24704 KB Output is correct
9 Correct 23 ms 24576 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 24696 KB Output is correct
2 Correct 23 ms 24576 KB Output is correct
3 Correct 24 ms 24576 KB Output is correct
4 Correct 22 ms 24576 KB Output is correct
5 Correct 23 ms 24568 KB Output is correct
6 Correct 23 ms 24704 KB Output is correct
7 Correct 23 ms 24704 KB Output is correct
8 Correct 23 ms 24704 KB Output is correct
9 Correct 23 ms 24576 KB Output is correct
10 Correct 32 ms 26368 KB Output is correct
11 Correct 32 ms 26360 KB Output is correct
12 Correct 30 ms 26360 KB Output is correct
13 Correct 31 ms 26620 KB Output is correct
14 Correct 31 ms 26616 KB Output is correct
15 Correct 32 ms 26496 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1128 ms 145400 KB Output is correct
2 Correct 1333 ms 153656 KB Output is correct
3 Correct 1143 ms 148204 KB Output is correct
4 Correct 1096 ms 146028 KB Output is correct
5 Correct 1075 ms 145836 KB Output is correct
6 Correct 1120 ms 145528 KB Output is correct
7 Correct 1045 ms 145428 KB Output is correct
8 Correct 1209 ms 153580 KB Output is correct
9 Correct 964 ms 148204 KB Output is correct
10 Correct 701 ms 145900 KB Output is correct
11 Correct 779 ms 145900 KB Output is correct
12 Correct 950 ms 145516 KB Output is correct
13 Correct 1564 ms 160624 KB Output is correct
14 Correct 1500 ms 160552 KB Output is correct
15 Correct 1502 ms 160704 KB Output is correct
16 Correct 1473 ms 160640 KB Output is correct
17 Correct 1048 ms 145500 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 24696 KB Output is correct
2 Correct 23 ms 24576 KB Output is correct
3 Correct 24 ms 24576 KB Output is correct
4 Correct 22 ms 24576 KB Output is correct
5 Correct 23 ms 24568 KB Output is correct
6 Correct 23 ms 24704 KB Output is correct
7 Correct 23 ms 24704 KB Output is correct
8 Correct 23 ms 24704 KB Output is correct
9 Correct 23 ms 24576 KB Output is correct
10 Correct 32 ms 26368 KB Output is correct
11 Correct 32 ms 26360 KB Output is correct
12 Correct 30 ms 26360 KB Output is correct
13 Correct 31 ms 26620 KB Output is correct
14 Correct 31 ms 26616 KB Output is correct
15 Correct 32 ms 26496 KB Output is correct
16 Correct 1128 ms 145400 KB Output is correct
17 Correct 1333 ms 153656 KB Output is correct
18 Correct 1143 ms 148204 KB Output is correct
19 Correct 1096 ms 146028 KB Output is correct
20 Correct 1075 ms 145836 KB Output is correct
21 Correct 1120 ms 145528 KB Output is correct
22 Correct 1045 ms 145428 KB Output is correct
23 Correct 1209 ms 153580 KB Output is correct
24 Correct 964 ms 148204 KB Output is correct
25 Correct 701 ms 145900 KB Output is correct
26 Correct 779 ms 145900 KB Output is correct
27 Correct 950 ms 145516 KB Output is correct
28 Correct 1564 ms 160624 KB Output is correct
29 Correct 1500 ms 160552 KB Output is correct
30 Correct 1502 ms 160704 KB Output is correct
31 Correct 1473 ms 160640 KB Output is correct
32 Correct 1048 ms 145500 KB Output is correct
33 Correct 1366 ms 147024 KB Output is correct
34 Correct 375 ms 56184 KB Output is correct
35 Correct 1547 ms 152316 KB Output is correct
36 Correct 1246 ms 146920 KB Output is correct
37 Correct 1510 ms 151020 KB Output is correct
38 Correct 1413 ms 148112 KB Output is correct
39 Correct 1564 ms 168812 KB Output is correct
40 Correct 1664 ms 159092 KB Output is correct
41 Correct 1160 ms 149756 KB Output is correct
42 Correct 850 ms 146732 KB Output is correct
43 Correct 1504 ms 159596 KB Output is correct
44 Correct 1483 ms 150716 KB Output is correct
45 Correct 1167 ms 169324 KB Output is correct
46 Correct 1405 ms 168940 KB Output is correct
47 Correct 1479 ms 160876 KB Output is correct
48 Correct 1507 ms 160748 KB Output is correct
49 Correct 1559 ms 161004 KB Output is correct
50 Correct 1732 ms 160464 KB Output is correct
51 Correct 1438 ms 159012 KB Output is correct
52 Correct 1461 ms 159084 KB Output is correct