Submission #1190000

#TimeUsernameProblemLanguageResultExecution timeMemory
1190000MatteoArcari늑대인간 (IOI18_werewolf)C++20
34 / 100
205 ms38032 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;

struct Segtree {
    int n;
    vi ma, mi;
    Segtree (vi ord) {
        n = ord.size();
        ma.resize(4 * n);
        mi.resize(4 * n);
        build(1, 0, n, ord);
    }
    void build (int i, int sl, int sr, vi &ord) {
        if (sr - sl == 1) {
            mi[i] = ma[i] = ord[sl];
            return;
        }
        int mid = sl + sr >> 1;
        build(2 * i, sl, mid, ord);
        build(2 * i + 1, mid, sr, ord);
        mi[i] = min(mi[2 * i], mi[2 * i + 1]);
        ma[i] = max(ma[2 * i], ma[2 * i + 1]);
    }
    int getL (int i, int sl, int sr, int l, int t) {
        if (sr <= l) return n;
        if (mi[i] >= t) return n;
        if (sr - sl == 1) return sl;
        int mid = sl + sr >> 1;
        int ans = getL(2 * i, sl, mid, l, t);
        if (ans != n) return ans;
        return getL(2 * i + 1, mid, sr, l, t);
    }
    int getL (int i, int l) {
        return getL(1, 0, n, i, l); 
    }
    int getR (int i, int sl, int sr, int r, int t) {
        if (sl >= r) return -1;
        if (ma[i] <= t) return -1;
        if (sr - sl == 1) return sl;
        int mid = sl + sr >> 1;
        int ans = getR(2 * i + 1, mid, sr, r, t);
        if (ans != -1) return ans;
        return getR(2 * i, sl, mid, r, t);
    }
    int getR (int i, int r) {
        return getR(1, 0, n, i, r); 
    }
};

vi check_validity(int n, vi x, vi y, vi s, vi e, vi l, vi r) {
    int q = s.size();
    int m = x.size();
    vector<vi> adj(n);
    for (int i = 0; i < m; i++) {
        adj[x[i]].push_back(y[i]);
        adj[y[i]].push_back(x[i]);
    }

    vi ans(q);

    vi ord(n), pos(n);
    for (int i = 0; i < n; i++) {
        if (adj[i].size() == 1) {
            ord[0] = i;
            ord[1] = adj[i][0];
            pos[i] = 0;
            pos[adj[i][0]] = 1;
            break;
        }
    }
    for (int i = 1; i + 1 < n; i++) {
        int j = adj[ord[i]][0] ^ adj[ord[i]][1] ^ ord[i - 1];
        ord[i + 1] = j;
        pos[j] = i + 1;
    }

    vi rev_ord = ord; reverse(rev_ord.begin(), rev_ord.end());
    vi rev_pos(n); 
    for (int i = 0; i < n; i++) rev_pos[rev_ord[i]] = i;

    Segtree Ord(ord);
    Segtree Rev(rev_ord);

    for (int i = 0; i < q; i++) {
        int left, right;
        if (pos[s[i]] < pos[e[i]]) {
            left = Ord.getL(pos[s[i]], l[i]) - 1;
            right = Ord.getR(pos[e[i]], r[i]) + 1;
        } else {
            left = Rev.getL(rev_pos[s[i]], l[i]) - 1;
            right = Rev.getR(rev_pos[e[i]], r[i]) + 1;
        }
        ans[i] = left >= right;
    }

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...