제출 #1236816

#제출 시각아이디문제언어결과실행 시간메모리
1236816nikd늑대인간 (IOI18_werewolf)C++20
34 / 100
218 ms74060 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;

struct sparse_min{
    int n, k;
    vector<vector<int>> st;
    vector<int> lg;
    sparse_min(vector<int> &v): n(v.size()){
        lg.resize(n+1);
        lg[1] = 0;
        for(int i = 2; i<=n; i++) lg[i] = lg[i/2]+1;
        k= lg[n]+1;
        st.resize(k+1, vector<int>(n));
        copy(v.begin(), v.end(), st[0].begin());
        for(int j = 1; j<=k; j++){
            for(int i= 0; i+(1<<j)-1<n; i++){
                st[j][i] = min(st[j-1][i], st[j-1][i+(1<<(j-1))]);
            }
        }
    }
    int q(int l, int r){
        if(l>r) swap(l, r);
        int p2 = lg[r-l+1];
        return min(st[p2][l], st[p2][r-(1<<p2)+1]);
    }
};

struct sparse_max{
    int n, k;
    vector<vector<int>> st;
    vector<int> lg;
    sparse_max(vector<int> &v): n(v.size()){
        lg.resize(n+1);
        lg[1] = 0;
        for(int i = 2; i<=n; i++) lg[i] = lg[i/2]+1;
        k= lg[n]+1;
        st.resize(k+1, vector<int>(n));
        copy(v.begin(), v.end(), st[0].begin());
        for(int j = 1; j<=k; j++){
            for(int i= 0; i+(1<<j)-1<n; i++){
                st[j][i] = max(st[j-1][i], st[j-1][i+(1<<(j-1))]);
            }
        }
    }
    int q(int l, int r){
        if(l>r) swap(l, r);
        int p2 = lg[r-l+1];
        return max(st[p2][l], st[p2][r-(1<<p2)+1]);
    }
};

std::vector<int> check_validity(int N, std::vector<int> X, std::vector<int> Y,
                                std::vector<int> S, std::vector<int> E,
                                std::vector<int> L, std::vector<int> R) {
    
    vector<vector<int>> adj(N);
    for(int i = 0; i<X.size(); i++){
        adj[X[i]].push_back(Y[i]);
        adj[Y[i]].push_back(X[i]);
    }
    vector<int> idx(N, 0);
    vector<int> val(N);
    int st;
    for(int i = 0; i<N; i++) if(adj[i].size() == 1) st = i;
    function<void(int, int, int)> dfs = [&](int v, int p, int i){
        idx[v] = i;
        val[i] = v;
        for(int u: adj[v]){
            if(u!=p) dfs(u, v, i+1);
        }
        return;
    };
    dfs(st, -1, 0);
    sparse_min st_mn(val);
    sparse_max st_mx(val);
    vector<int> sol(E.size(), 0);
    for(int i = 0; i<S.size(); i++){
        int ll = idx[S[i]];
        int rr = idx[E[i]];
        int l = ll;
        int r = rr;
        if(l>r) swap(l, r);
        r +=1;
        while(1){
            if(r-l<1){
                sol[i] = 0; break;
            }
            int m = (l+r)/2;
            
            int m1 = st_mn.q(ll, m);
            int m2 = st_mx.q(m, rr);
            if(m1>=L[i] && m2 <= R[i]){
                sol[i] = 1; break;
            }
            if(m1<L[i] && m2 > R[i]){
                sol[i] = 0; break;
            }
            if(ll<=rr){
                if(m1<L[i]){
                    r = m;
                }
                if(m2>R[i]){
                    l = m+1;
                }
            }
            else{
                if(m1 < L[i]){
                    l = m+1;
                }
                if(m2>R[i]){
                    r = m;
                }
            }
        }
    }
    return sol;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...