답안 #1037440

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1037440 2024-07-28T21:25:40 Z c2zi6 늑대인간 (IOI18_werewolf) C++14
100 / 100
529 ms 109288 KB
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define replr(i, a, b) for (int i = int(a); i <= int(b); ++i)
#define reprl(i, a, b) for (int i = int(a); i >= int(b); --i)
#define rep(i, n) for (int i = 0; i < int(n); ++i)
#define mkp(a, b) make_pair(a, b)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef vector<PII> VPI;
typedef vector<VI> VVI;
typedef vector<VVI> VVVI;
typedef vector<VPI> VVPI;
typedef pair<ll, ll> PLL;
typedef vector<ll> VL;
typedef vector<PLL> VPL;
typedef vector<VL> VVL;
typedef vector<VVL> VVVL;
typedef vector<VPL> VVPL;
template<class T> T setmax(T& a, T b) {if (a < b) return a = b; return a;}
template<class T> T setmin(T& a, T b) {if (a < b) return a; return a = b;}
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template<class T>
using indset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#include "werewolf.h"

namespace TEST2 {
    int n;
    VVI gp;
    void dfs(int u, VI& vis, int mn, int mx) {
        vis[u] = true;
        for (int v : gp[u]) if (!vis[v]) {
            if (mn <= v && v <= mx) {
                dfs(v, vis, mn, mx);
            }
        }
    }
    VI solve(int N, VI X, VI Y, VI S, VI E, VI L, VI R) {
        n = N;
        gp = VVI(n);
        rep(i, X.size()) {
            gp[X[i]].pb(Y[i]);
            gp[Y[i]].pb(X[i]);
        }
        VI ansret;
        rep(i, S.size()) {
            auto[s, e, l, r] = make_tuple(S[i], E[i], L[i], R[i]);
            VI visa, visb;
            visa = visb = VI(n);
            dfs(s, visa, l, +2e9);
            dfs(e, visb, -2e9, r);
            bool ans = false;
            rep(u, n) if (visa[u] && visb[u]) ans = true;
            ansret.pb(ans);
        }
        return ansret;
    }
}

struct DSU {
    int n;
    VI par;
    DSU(){}
    DSU(int n_arg) : n(n_arg) {
        par = VI(n);
        rep(u, n) par[u] = u;
    }
    int get(int u) {
        return u == par[u] ? u : (par[u] = get(par[u]));
    }
    bool onion(int u, int v) {
        u = get(u);
        v = get(v);
        if (u == v) return false;
        par[v] = u;
        return true;
    }
} dsu;

struct COMPTREE {
    int n;
    VVI par;
    VVI gp;
    VI tin, tout;
    VI euler;
    int tc;
    COMPTREE(){}
    COMPTREE(int n_arg) : n(n_arg) {
        par = VVI(n, VI(20, -1));
        gp = VVI(n);
        tin = tout = VI(n);
    }
    void dfs(int u) {
        euler.pb(u);
        tin[u] = tc++;
        for (int v : gp[u]) dfs(v);
        tout[u] = tc-1;
    }
    void init() {
        replr(i, 1, 19) rep(u, n) par[u][i] = par[par[u][i-1]][i-1];
        int root;
        rep(u, n) {
            if (par[u][0] == u) root = u;
            else gp[par[u][0]].pb(u);
        }
        tc = 0;
        dfs(root);
    }
    int lift(int u, int L, int R) {
        reprl(i, 19, 0) if (L <= par[u][i] && par[u][i] <= R) u = par[u][i];
        return u;
    }
    void print() {
        rep(u, n) cout << u << "'s parent: " << par[u][0] << endl;
        for (int u : euler) cout << u << " "; cout << endl;
    }
    void print(int u) {
        replr(i, tin[u], tout[u]) cout << euler[i] << " ";
        cout << endl;
    }
} lwp, hgp;

struct QUERY {
    int ind;
    int al, ar;
    int bl, br;
};
bool operator<(const QUERY& a, const QUERY& b) {
    return a.ar < b.ar;
}

struct SEGTREE {
    int n;
    VI tree;
    SEGTREE(int sz) {
        n = 1;
        while (n < sz) n *= 2;
        tree = VI(2*n, -1);
    }
    void set(int N, int L, int R, int i, int s) {
        if (i < L || i > R) return;
        if (L == R) {
            tree[N] = s;
            return;
        }
        int M = (L + R) / 2;
        set(2*N+1, L, M, i, s);
        set(2*N+2, M+1, R, i, s);
        tree[N] = max(tree[2*N+1], tree[2*N+2]);
    }
    int get(int N, int L, int R, int l, int r) {
        if (l <= L && R <= r) return tree[N];
        if (R < l || L > r) return -1;
        int M = (L + R) / 2;
        return max(get(2*N+1, L, M, l, r), get(2*N+2, M+1, R, l, r));
    }
    void set(int i, int s) {
        set(0, 0, n-1, i, s);
    }
    int get(int l, int r) {
        return get(0, 0, n-1, l, r);
    }
};

VI check_validity(int N, VI X, VI Y, VI S, VI E, VI L, VI R) {
    int n = N;
    VVI gp(n);
    rep(i, X.size()) {
        gp[X[i]].pb(Y[i]);
        gp[Y[i]].pb(X[i]);
    }
    lwp = hgp = COMPTREE(n);
    dsu = DSU(n);
    replr(u, 0, n-1) for (int v : gp[u]) if (v < u) {
        if (dsu.onion(u, v = dsu.get(v))) lwp.par[v][0] = u;
    }
    lwp.par[n-1][0] = n-1;
    lwp.init();
    dsu = DSU(n);
    reprl(u, n-1, 0) for (int v : gp[u]) if (v > u) {
        if (dsu.onion(u, v = dsu.get(v))) hgp.par[v][0] = u;
    }
    hgp.par[0][0] = 0;
    hgp.init();
    VI a = hgp.euler;
    VI aind = hgp.tin;
    VI b = lwp.euler;
    VI bind = lwp.tin;
    vector<QUERY> qrs;
    rep(i, S.size()) {
        int u = hgp.lift(S[i], L[i], +2e9);
        int v = lwp.lift(E[i], -2e9, R[i]);
        qrs.pb({i, hgp.tin[u], hgp.tout[u], lwp.tin[v], lwp.tout[v]});
    }
    sort(all(qrs));
    int ptr = 0;
    SEGTREE ds(n);
    VI ans(S.size());
    for (auto[ind, al, ar, bl, br] : qrs) {
        while (ptr <= ar) ds.set(bind[a[ptr]], ptr), ptr++;
        ans[ind] = (ds.get(bl, br) >= al);
    }
    return ans;
}



Compilation message

werewolf.cpp: In function 'VI TEST2::solve(int, VI, VI, VI, VI, VI, VI)':
werewolf.cpp:54:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   54 |             auto[s, e, l, r] = make_tuple(S[i], E[i], L[i], R[i]);
      |                 ^
werewolf.cpp: In member function 'void COMPTREE::print()':
werewolf.cpp:122:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  122 |         for (int u : euler) cout << u << " "; cout << endl;
      |         ^~~
werewolf.cpp:122:47: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  122 |         for (int u : euler) cout << u << " "; cout << endl;
      |                                               ^~~~
werewolf.cpp: In function 'VI check_validity(int, VI, VI, VI, VI, VI, VI)':
werewolf.cpp:206:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  206 |     for (auto[ind, al, ar, bl, br] : qrs) {
      |              ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 4 ms 1884 KB Output is correct
11 Correct 4 ms 2004 KB Output is correct
12 Correct 4 ms 1884 KB Output is correct
13 Correct 4 ms 1884 KB Output is correct
14 Correct 4 ms 2044 KB Output is correct
15 Correct 5 ms 1884 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 386 ms 101804 KB Output is correct
2 Correct 449 ms 103352 KB Output is correct
3 Correct 388 ms 103024 KB Output is correct
4 Correct 411 ms 102268 KB Output is correct
5 Correct 360 ms 101296 KB Output is correct
6 Correct 357 ms 102580 KB Output is correct
7 Correct 345 ms 101556 KB Output is correct
8 Correct 362 ms 103856 KB Output is correct
9 Correct 373 ms 102836 KB Output is correct
10 Correct 293 ms 102324 KB Output is correct
11 Correct 307 ms 102000 KB Output is correct
12 Correct 321 ms 101300 KB Output is correct
13 Correct 465 ms 108732 KB Output is correct
14 Correct 487 ms 108720 KB Output is correct
15 Correct 449 ms 108164 KB Output is correct
16 Correct 458 ms 108724 KB Output is correct
17 Correct 354 ms 101556 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 4 ms 1884 KB Output is correct
11 Correct 4 ms 2004 KB Output is correct
12 Correct 4 ms 1884 KB Output is correct
13 Correct 4 ms 1884 KB Output is correct
14 Correct 4 ms 2044 KB Output is correct
15 Correct 5 ms 1884 KB Output is correct
16 Correct 386 ms 101804 KB Output is correct
17 Correct 449 ms 103352 KB Output is correct
18 Correct 388 ms 103024 KB Output is correct
19 Correct 411 ms 102268 KB Output is correct
20 Correct 360 ms 101296 KB Output is correct
21 Correct 357 ms 102580 KB Output is correct
22 Correct 345 ms 101556 KB Output is correct
23 Correct 362 ms 103856 KB Output is correct
24 Correct 373 ms 102836 KB Output is correct
25 Correct 293 ms 102324 KB Output is correct
26 Correct 307 ms 102000 KB Output is correct
27 Correct 321 ms 101300 KB Output is correct
28 Correct 465 ms 108732 KB Output is correct
29 Correct 487 ms 108720 KB Output is correct
30 Correct 449 ms 108164 KB Output is correct
31 Correct 458 ms 108724 KB Output is correct
32 Correct 354 ms 101556 KB Output is correct
33 Correct 432 ms 101244 KB Output is correct
34 Correct 173 ms 26800 KB Output is correct
35 Correct 447 ms 103288 KB Output is correct
36 Correct 403 ms 102320 KB Output is correct
37 Correct 470 ms 102576 KB Output is correct
38 Correct 420 ms 102328 KB Output is correct
39 Correct 439 ms 108212 KB Output is correct
40 Correct 529 ms 108440 KB Output is correct
41 Correct 380 ms 102044 KB Output is correct
42 Correct 313 ms 102832 KB Output is correct
43 Correct 497 ms 107140 KB Output is correct
44 Correct 424 ms 102580 KB Output is correct
45 Correct 422 ms 109288 KB Output is correct
46 Correct 404 ms 108976 KB Output is correct
47 Correct 479 ms 108712 KB Output is correct
48 Correct 471 ms 108920 KB Output is correct
49 Correct 453 ms 108692 KB Output is correct
50 Correct 484 ms 109244 KB Output is correct
51 Correct 497 ms 107864 KB Output is correct
52 Correct 513 ms 107952 KB Output is correct