답안 #842210

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
842210 2023-09-02T14:42:20 Z serifefedartar Osumnjičeni (COCI21_osumnjiceni) C++17
0 / 110
69 ms 23496 KB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
typedef long long ll;
#define f first
#define s second
#define MOD 1000000007
#define LOGN 20
#define MAXN 200005

int sg[4*MAXN], lazy[4*MAXN];
int up[LOGN][MAXN], depth[MAXN];
vector<vector<int>> graph;
pair<int,int> segments[MAXN];
vector<int> cc;
void dfs(int node, int parent) {
    for (auto u : graph[node]) {
        if (u == parent)
            continue;
        depth[u] = depth[node] + 1;
        dfs(u, node);
    }
}

void update(int k, int a, int b, int q_l, int q_r, int val) {
    if (lazy[k]) {
        sg[k] += lazy[k];
        if (a != b) {
            lazy[2*k] += lazy[k];
            lazy[2*k+1] += lazy[k];
        }
        lazy[k] = 0;
    }

    if (b < q_l || a > q_r)
        return ;
    if (q_l <= a && b <= q_r) {
        sg[k] += val;
        if (a != b) {
            lazy[2*k] += val;
            lazy[2*k+1] += val;
        }
        return ;
    }
    update(2*k, a, (a+b)/2, q_l, q_r, val);
    update(2*k+1, (a+b)/2+1, b, q_l, q_r, val);
    sg[k] = max(sg[2*k], sg[2*k+1]);
}

int main() {
    fast
    int N;
    cin >> N;

    graph = vector<vector<int>>(N+2, vector<int>());
    for (int i = 1; i <= N; i++) {
        cin >> segments[i].f >> segments[i].s;
        cc.push_back(segments[i].f);
        cc.push_back(segments[i].s);
    }
    sort(cc.begin(), cc.end());
    cc.erase(unique(cc.begin(), cc.end()), cc.end());
    int n = cc.size();

    int L = 1;
    for (int R = 1; R <= N; R++) {
        update(1, 1, n, segments[R].f, segments[R].s, 1);
        if (sg[1] > 1) {
            up[0][L] = R;
            graph[R].push_back(L);
            update(1, 1, n, segments[L].f, segments[L].s, -1);
            L++;
        }
    }
    for (int i = 1; i <= N; i++) {
        if (up[0][i] == 0) {
            up[0][i] = N+1;
            graph[N+1].push_back(i);
        }
    }
    dfs(N+1, N+1);

    for (int i = 0; i < LOGN; i++)
        up[i][N+1] = N+1;
    for (int i = 1; i < LOGN; i++) {
        for (int j = 1; j <= N; j++) {
            up[i][j] = up[i-1][up[i-1][j]];
        }
    }

    int Q; 
    cin >> Q;
    while (Q--) {
        int a, b;
        cin >> a >> b;
        b = up[0][b];

        int cnt = 0;
        int now = a;
        for (int i = LOGN-1; i >= 0; i--) {
            if (depth[up[i][now]] > depth[b]) {
                now = up[i][now];
                cnt += (1<<i);
            }
        }
        cout << cnt + 1 << "\n";
    }
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 69 ms 23020 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 15192 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 15192 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 68 ms 23496 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 69 ms 23020 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -