Submission #1268313

#TimeUsernameProblemLanguageResultExecution timeMemory
1268313Bui_Quoc_CuongWerewolf (IOI18_werewolf)C++20
100 / 100
414 ms107964 KiB
#include <bits/stdc++.h>
using namespace std;    
const int maxn = 2e5 + 5;
int n, m, q;
int X[maxn], Y[maxn], S[maxn], E[maxn], L[maxn], R[maxn]; 
vector <int> g[maxn];
vector <int> adj[maxn][2];
struct DisjointSet{
    int par[maxn], root;
    void init(){
        for(int i = 1; i <= n; i++){
            par[i] = i;
        }
    }
    int find(int i){
        return par[i] == i ? i : par[i] = find(par[i]);
    }
    bool joint(int u, int v, int t){
        int x = find(u), y = find(v);
        if(x == y) return 0;
        adj[x][t].push_back(y);
        root = x;
        par[y] = x;
        return 1;
    }
} DSU0, DSU1;   
int tin[maxn][2], tout[maxn][2], timedfs, jump[maxn][20][2], arr[maxn][2];
void dfs(int u, int t){
    tin[u][t] = ++ timedfs;
    arr[timedfs][t] = u;
    for(int &v : adj[u][t]){
        jump[v][0][t] = u;
        for(int j = 1; (1 << j) <= n; j++){
            jump[v][j][t] = jump[jump[v][j - 1][t]][j - 1][t];
        }
        dfs(v, t);
    }
    tout[u][t] = timedfs;
}
vector <array <int, 4>> ask[maxn];
int bit[maxn];
void up(int u, int val){
    for(int i = u; i <= n; i+= i&-i) bit[i]+= val;
}
int get(int u){
    int sum = 0;
    for(int i = u; i; i-= i&-i) sum+= bit[i];
    return sum;
}
vector <int> check_validity(int N, vector <int> X, vector <int> Y, vector <int> S, vector <int> E, vector <int> L, vector <int> R){
    n = N;
    q = S.size();
    m = X.size();
    vector <int> ans(q, 0);
    for(int i = 0; i < m; i++){
        // cin >> X[i];
        X[i]++;
    }
    for(int i = 0; i < m; i++){
        // cin >> Y[i];
        Y[i]++;
    }
    for(int i = 0; i < q; i++){
        // cin >> S[i];
        S[i]++;
    }
    for(int i = 0; i < q; i++){
        // cin >> E[i];
        E[i]++;
    }
    for(int i = 0; i < q; i++){
        // cin >> L[i];
        L[i]++;
    }
    for(int i = 0; i < q; i++){
        // cin >> R[i];
        R[i]++;
    }
    for(int i = 0; i < m; i++){
        g[X[i]].push_back(Y[i]);
        g[Y[i]].push_back(X[i]);
    }
    DSU0.init();
    DSU1.init();
    for(int i = 1; i <= n; i++){
        for(int j : g[i]) if(j < i){
            DSU0.joint(i, j, 0);
        }
    }
    for(int i = n; i >= 1; i--){
        for(int j : g[i] ) if(j > i){
            DSU1.joint(i, j, 1);
        }
    }
    timedfs = 0;
    dfs(DSU0.root, 0);
    timedfs = 0;
    dfs(DSU1.root, 1);
    for(int i = 0; i < q; i++){
        int l = L[i], r = R[i], s = S[i], t = E[i];
        int z = __lg(n);
        for(int ss = z; ss >= 0; ss--){
            if(jump[s][ss][1] >= l) s = jump[s][ss][1];
            if(jump[t][ss][0] <= r && jump[t][ss][0] != 0) t = jump[t][ss][0];
        }
        ask[tout[t][0]].push_back({tin[s][1], tout[s][1], i, 1});
        ask[tin[t][0] - 1].push_back({tin[s][1], tout[s][1], i, - 1});
    }
    for(int j = 1; j <= n; j++){
        up(tin[arr[j][0]][1], 1);
        for(auto it : ask[j]){
            ans[it[2]]+= it[3] * (get(it[1]) - get(it[0] - 1));
        }
    }   
    for(int i = 0; i < q; i++){
        ans[i] = (ans[i] > 0);
    }
    return ans;
}
// int32_t main(){
//     ios_base::sync_with_stdio(0); cin.tie(0); 
//     #define koa "kieuoanh"
//     if(fopen(koa".inp", "r")){
//         freopen(koa".inp", "r", stdin); freopen(koa".out", "w", stdout);
//     }
//     cin >> n >> m >> q;
//     for(int i = 1; i <= m; i++){
//         cin >> X[i];
//         X[i]++;
//     }
//     for(int i = 1; i <= m; i++){
//         cin >> Y[i];
//         Y[i]++;
//     }
//     for(int i = 1; i <= q; i++){
//         cin >> S[i];
//         S[i]++;
//     }
//     for(int i = 1; i <= q; i++){
//         cin >> E[i];
//         E[i]++;
//     }
//     for(int i = 1; i <= q; i++){
//         cin >> L[i];
//         L[i]++;
//     }
//     for(int i = 1; i <= q; i++){
//         cin >> R[i];
//         R[i]++;
//     }
//     for(int i = 1; i <= m; i++){
//         g[X[i]].push_back(Y[i]);
//         g[Y[i]].push_back(X[i]);
//     }
//     DSU0.init();
//     DSU1.init();
//     for(int i = 1; i <= n; i++){
//         for(int j : g[i]) if(j < i){
//             DSU0.joint(i, j, 0);
//         }
//     }
//     for(int i = n; i >= 1; i--){
//         for(int j : g[i] ) if(j > i){
//             DSU1.joint(i, j, 1);
//         }
//     }
//     timedfs = 0;
//     dfs(DSU0.root, 0);
//     timedfs = 0;
//     dfs(DSU1.root, 1);
//     for(int i = 1; i <= q; i++){
//         int l = L[i], r = R[i], s = S[i], t = E[i];
//         int z = __lg(n);
//         for(int ss = z; ss >= 0; ss--){
//             if(jump[s][ss][1] >= l) s = jump[s][ss][1];
//             if(jump[t][ss][0] <= r && jump[t][ss][0] != 0) t = jump[t][ss][0];
//         }
//         ask[tout[t][0]].push_back({tin[s][1], tout[s][1], i, 1});
//         ask[tin[t][0] - 1].push_back({tin[s][1], tout[s][1], i, - 1});
//     }
//     for(int j = 1; j <= n; j++){
//         up(tin[arr[j][0]][1], 1);
//         for(auto it : ask[j]){
//             ans[it[2]]+= it[3] * (get(it[1]) - get(it[0] - 1));
//         }
//     }   
//     for(int i = 1; i <= q; i++){
//         cout << (ans[i] > 0) << "\n";
//     }
//     return 0;
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...