Submission #45459

#TimeUsernameProblemLanguageResultExecution timeMemory
45459choikiwonLong Mansion (JOI17_long_mansion)C++17
25 / 100
3046 ms240472 KiB
#include<bits/stdc++.h>
using namespace std;

const int MN = 500010;

int N, Q;
int C[MN];
vector<int> A[MN], B[MN];
int L[MN], R[MN], X[MN], Y[MN];

struct BIT {
    vector<int> tree;
    void init() {
        tree = vector<int>(4 * N, -1e9);
    }
    void upd(int idx, int val, int l, int r, int n) {
        if(idx < l || r < idx) return;
        if(l == r) {
            tree[n] = val;
            return;
        }
        int m = (l + r)>>1;
        upd(idx, val, l, m, 2*n);
        upd(idx, val, m + 1, r, 2*n + 1);
        tree[n] = max(tree[2*n], tree[2*n + 1]);
    }
    int quer(int a, int b, int l, int r, int n) {
        if(b < l || r < a) return -1e9;
        if(a <= l && r <= b) return tree[n];
        int m = (l + r)>>1;
        int L = quer(a, b, l, m, 2*n);
        int R = quer(a, b, m + 1, r, 2*n + 1);
        return max(L, R);
    }
} bit1, bit2, bit3, bit4;

int main() {
    scanf("%d", &N);

    for(int i = 0; i < N - 1; i++) {
        scanf("%d", &C[i]);
        C[i]--;
    }

    for(int i = 0; i < N; i++) {
        int k; scanf("%d", &k);
        A[i].resize(k);
        for(int j = 0; j < k; j++) {
            scanf("%d", &A[i][j]);
            A[i][j]--;
        }
    }

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < A[i].size(); j++) {
            B[ A[i][j] ].push_back(i);
        }
    }
    for(int i = 0; i < N - 1; i++) {
        int s = 0, e = (int)B[ C[i] ].size() - 1, p = -1;
        while(s <= e) {
            int m = (s + e)>>1;

            if(B[ C[i] ][m] <= i) {
                p = B[ C[i] ][m];
                s = m + 1;
            }
            else e = m - 1;
        }
        L[i] = p;
    }
    for(int i = N - 1; i >= 1; i--) {
        int s = 0, e = (int)B[ C[i - 1] ].size() - 1, p = N;
        while(s <= e) {
            int m = (s + e)>>1;

            if(B[ C[i - 1] ][m] >= i) {
                p = B[ C[i - 1] ][m];
                e = m - 1;
            }
            else s = m + 1;
        }
        R[i] = p;
    }
    L[N - 1] = -1;
    R[0] = N;

    bit1.init();
    bit2.init();
    for(int i = 0; i < N; i++) {
        bit1.upd(i, R[i], 0, N - 1, 1);
        bit2.upd(i, -L[i], 0, N - 1, 1);
    }
    for(int i = 0; i < N - 1; i++) {
        int s = L[i] + 1, e = i, p = N;
        while(s <= e) {
            int m = (s + e)>>1;

            if(bit1.quer(L[i] + 1, m, 0, N - 1, 1) > i) {
                p = m;
                e = m - 1;
            }
            else s = m + 1;
        }
        X[i] = p;
    }
    for(int i = N - 1; i >= 1; i--) {
        int s = i, e = R[i] - 1, p = -1;
        while(s <= e) {
            int m = (s + e)>>1;

            if(-bit2.quer(m, R[i] - 1, 0, N - 1, 1) < i) {
                p = m;
                s = m + 1;
            }
            else e = m - 1;
        }
        Y[i] = p;
    }

    bit3.init();
    bit4.init();
    for(int i = 0; i < N; i++) {
        bit3.upd(i, -X[i], 0, N - 1, 1);
        bit4.upd(i, Y[i], 0, N - 1, 1);
    }

    scanf("%d", &Q);

    for(int i = 0; i < Q; i++) {
        int x, y; scanf("%d %d", &x, &y);
        x--; y--;

        if(x < y) {
            if(-bit3.quer(x, y - 1, 0, N - 1, 1) <= x) printf("NO\n");
            else printf("YES\n");
        }
        else {
            if(bit4.quer(y + 1, x, 0, N - 1, 1) >= x) printf("NO\n");
            else printf("YES\n");
        }
    }
}

Compilation message (stderr)

long_mansion.cpp: In function 'int main()':
long_mansion.cpp:55:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < A[i].size(); j++) {
                        ~~^~~~~~~~~~~~~
long_mansion.cpp:38:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &N);
     ~~~~~^~~~~~~~~~
long_mansion.cpp:41:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &C[i]);
         ~~~~~^~~~~~~~~~~~~
long_mansion.cpp:46:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int k; scanf("%d", &k);
                ~~~~~^~~~~~~~~~
long_mansion.cpp:49:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &A[i][j]);
             ~~~~~^~~~~~~~~~~~~~~~
long_mansion.cpp:128:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &Q);
     ~~~~~^~~~~~~~~~
long_mansion.cpp:131:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int x, y; scanf("%d %d", &x, &y);
                   ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...