답안 #155451

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
155451 2019-09-28T11:01:01 Z Mercenary 늑대인간 (IOI18_werewolf) C++14
100 / 100
999 ms 111608 KB
#include "werewolf.h"
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
const int logn = log2(maxn) + 1;
vector<int> e[maxn] , adj[maxn] , radj[maxn];
int lab[maxn];
int in[2][maxn] , out[2][maxn] , id[2][maxn];
int nTime = 0;
int P[2][maxn][logn];
int n;
#define pb push_back
void DFS(int u , int par , vector<int> adj[] , int in[] , int out[] , int id[] ,  int P[maxn][logn]){
    P[u][0] = par;
    for(int i = 1 ; i < logn ; ++i){
        if(P[u][i - 1] >= 0 && P[u][i - 1] < n)P[u][i] = P[P[u][i - 1]][i - 1];
        else P[u][i] = P[u][i - 1];
    }
    in[u] = ++nTime;
    id[nTime] = u;
    for(int c : adj[u]){
        DFS(c , u , adj , in , out, id , P);
    }
    out[u] = nTime;
}
int bit[maxn];

void add(int x){
    for(;x <= n ;x += x & -x){
        bit[x]++;
    }
}
int query(int x){
    int res = 0;
    for( ; x > 0 ; x &= x - 1){
        res += bit[x];
    }
    return res;
}

vector<tuple<int,int,int,int>> a[maxn];

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;
    for(int i = 0 ; i < (int)X.size() ; ++i){
        e[X[i]].pb(Y[i]);
        e[Y[i]].pb(X[i]);
    }
    fill_n(lab,maxn,-1);
    function<int(int)> FindLab = [&](int u){
        return lab[u] < 0 ? u : lab[u] = FindLab(lab[u]);
    };
    auto add = [&](int x , int y , vector<int> adj[]){
        int s = FindLab(x);
        int d = FindLab(y);
        if(s == d)return;
        lab[d] = s;
        adj[s].pb(d);
    };
    for(int i = 0 ; i < n ; ++i){
        for(int c : e[i]){
            if(c < i)add(i , c , radj);
        }
    }
    fill_n(lab,maxn,-1);
    for(int i = n - 1 ; i >= 0 ; --i){
        for(int c : e[i]){
            if(c > i)add(i , c , adj);
        }
    }
    DFS(0 , -1 , adj , in[0] , out[0] , id[0] , P[0]);
    nTime = 0;
    DFS(n - 1 , n , radj , in[1] , out[1] , id[1] , P[1]);
    int q = S.size();
    vector<int> res(q , 0);
    for(int i = 0 ; i < q ; ++i){
        int s = S[i];int e = E[i];
        for(int j = logn - 1 ; j >= 0 ; --j){
            if(P[0][s][j] >= L[i])s = P[0][s][j];
            if(P[1][e][j] <= R[i])e = P[1][e][j];
        }
        a[in[0][s] - 1].emplace_back(-1 , in[1][e] , out[1][e] , i);
        a[out[0][s]].emplace_back(1 , in[1][e] , out[1][e] , i);
    }
    for(int i = 1 ; i <= n ; ++i){
        ::add(in[1][id[0][i]]);
//        cout << in[1][id[0][i]] << endl;
        for(auto & c : a[i]){
            int delta , l , r , id;
            tie(delta , l , r , id) = c;
            res[id] += delta * (query(r) - query(l - 1));
        }
    }
    for(int i = 0 ; i < q ; ++i){
        res[i] = res[i] > 0;
    }
    return res;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 19960 KB Output is correct
2 Correct 21 ms 19960 KB Output is correct
3 Correct 24 ms 19960 KB Output is correct
4 Correct 21 ms 19964 KB Output is correct
5 Correct 21 ms 19960 KB Output is correct
6 Correct 22 ms 19960 KB Output is correct
7 Correct 25 ms 19976 KB Output is correct
8 Correct 20 ms 19960 KB Output is correct
9 Correct 26 ms 19960 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 19960 KB Output is correct
2 Correct 21 ms 19960 KB Output is correct
3 Correct 24 ms 19960 KB Output is correct
4 Correct 21 ms 19964 KB Output is correct
5 Correct 21 ms 19960 KB Output is correct
6 Correct 22 ms 19960 KB Output is correct
7 Correct 25 ms 19976 KB Output is correct
8 Correct 20 ms 19960 KB Output is correct
9 Correct 26 ms 19960 KB Output is correct
10 Correct 28 ms 21112 KB Output is correct
11 Correct 27 ms 21136 KB Output is correct
12 Correct 26 ms 21088 KB Output is correct
13 Correct 32 ms 21368 KB Output is correct
14 Correct 27 ms 21368 KB Output is correct
15 Correct 28 ms 21240 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 769 ms 88136 KB Output is correct
2 Correct 706 ms 96024 KB Output is correct
3 Correct 615 ms 89976 KB Output is correct
4 Correct 744 ms 86960 KB Output is correct
5 Correct 634 ms 87060 KB Output is correct
6 Correct 685 ms 88156 KB Output is correct
7 Correct 637 ms 86320 KB Output is correct
8 Correct 654 ms 95856 KB Output is correct
9 Correct 580 ms 88908 KB Output is correct
10 Correct 559 ms 86716 KB Output is correct
11 Correct 544 ms 86348 KB Output is correct
12 Correct 550 ms 85968 KB Output is correct
13 Correct 796 ms 102048 KB Output is correct
14 Correct 923 ms 101924 KB Output is correct
15 Correct 951 ms 101976 KB Output is correct
16 Correct 999 ms 101960 KB Output is correct
17 Correct 683 ms 86520 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 19960 KB Output is correct
2 Correct 21 ms 19960 KB Output is correct
3 Correct 24 ms 19960 KB Output is correct
4 Correct 21 ms 19964 KB Output is correct
5 Correct 21 ms 19960 KB Output is correct
6 Correct 22 ms 19960 KB Output is correct
7 Correct 25 ms 19976 KB Output is correct
8 Correct 20 ms 19960 KB Output is correct
9 Correct 26 ms 19960 KB Output is correct
10 Correct 28 ms 21112 KB Output is correct
11 Correct 27 ms 21136 KB Output is correct
12 Correct 26 ms 21088 KB Output is correct
13 Correct 32 ms 21368 KB Output is correct
14 Correct 27 ms 21368 KB Output is correct
15 Correct 28 ms 21240 KB Output is correct
16 Correct 769 ms 88136 KB Output is correct
17 Correct 706 ms 96024 KB Output is correct
18 Correct 615 ms 89976 KB Output is correct
19 Correct 744 ms 86960 KB Output is correct
20 Correct 634 ms 87060 KB Output is correct
21 Correct 685 ms 88156 KB Output is correct
22 Correct 637 ms 86320 KB Output is correct
23 Correct 654 ms 95856 KB Output is correct
24 Correct 580 ms 88908 KB Output is correct
25 Correct 559 ms 86716 KB Output is correct
26 Correct 544 ms 86348 KB Output is correct
27 Correct 550 ms 85968 KB Output is correct
28 Correct 796 ms 102048 KB Output is correct
29 Correct 923 ms 101924 KB Output is correct
30 Correct 951 ms 101976 KB Output is correct
31 Correct 999 ms 101960 KB Output is correct
32 Correct 683 ms 86520 KB Output is correct
33 Correct 809 ms 90000 KB Output is correct
34 Correct 384 ms 47456 KB Output is correct
35 Correct 843 ms 94968 KB Output is correct
36 Correct 823 ms 89592 KB Output is correct
37 Correct 858 ms 93624 KB Output is correct
38 Correct 817 ms 90780 KB Output is correct
39 Correct 880 ms 111608 KB Output is correct
40 Correct 925 ms 96780 KB Output is correct
41 Correct 732 ms 91252 KB Output is correct
42 Correct 579 ms 87136 KB Output is correct
43 Correct 886 ms 100704 KB Output is correct
44 Correct 739 ms 93304 KB Output is correct
45 Correct 662 ms 110072 KB Output is correct
46 Correct 670 ms 110576 KB Output is correct
47 Correct 767 ms 102048 KB Output is correct
48 Correct 748 ms 102152 KB Output is correct
49 Correct 764 ms 101988 KB Output is correct
50 Correct 837 ms 101976 KB Output is correct
51 Correct 888 ms 96980 KB Output is correct
52 Correct 915 ms 96932 KB Output is correct