답안 #915402

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
915402 2024-01-23T19:53:53 Z SalihSahin Osumnjičeni (COCI21_osumnjiceni) C++14
0 / 110
1000 ms 91108 KB
#include<bits/stdc++.h>
#define pb push_back
#define int long long
#define mp make_pair
using namespace std;
 
const int mod = 998244353;
const int N = 4e5 + 5;
const int inf = 1e17*2;

struct SEGT{
    vector<int> tree;

    void init(int n){
        tree.assign(4*n, 0);
    }

    void update(int ind, int l, int r, int pos, int val){
        if(l == r){
            tree[ind] += val;
        }
        else{
            int m = (l + r)/2;

            if(pos <= m) update(ind*2, l, m, pos, val);
            else update(ind*2+1, m+1, r, pos, val);
            tree[ind] = tree[ind*2] + tree[ind*2+1];
        }
    }

    int query(int ind, int l, int r, int ql, int qr){
        if(l > r || l > qr || r < ql) return 0;
        if(l >= ql && r <= qr) return tree[ind];
        else{
            int m = (l + r)/2;

            return query(ind*2, l, m, ql, qr) + query(ind*2+1, m+1, r, ql, qr);
        }
    }
};

int32_t main(){
    int n;
    cin>>n;
    vector<pair<int, int> > a(n);
    set<int> ste;

    for(int i = 0; i < n; i++){
        int l, r;
        cin>>l>>r;
        ste.insert(l);
        ste.insert(r);
        a[i] = mp(l, r);
    }
    map<int, int> conv;
    int val = 1;
    for(auto itr: ste){
        conv[itr] = val;
        val++;
    }
    for(int i = 0; i < n; i++){
        a[i] = mp(conv[a[i].first], conv[a[i].second]);
    }
    SEGT seg;
    seg.init(N);
    vector<int> go(n);
    int r = 0;
    for(int l = 0; l < n; l++){
        while(r < n && seg.query(1, 1, N, a[r].first, a[r].second) == 0){
            seg.update(1, 1, N, a[r].first, 1);
            seg.update(1, 1, N, a[r].second, 1);
            r++;
        }
        go[l] = r;

        seg.update(1, 1, N, a[l].first, -1);
        seg.update(1, 1, N, a[l].second, -1);
    }
    int K = 18;

    /*
    for(int i = 0; i < n; i++){
        cout<<i<<" => "<<go[i]<<endl;
    }
    */

    vector<vector<int> > lift(K, vector<int>(n+1));
    for(int i = 0; i < n; i++){
        lift[0][i] = go[i];
    }
    lift[0][n] = n;

    for(int i = 1; i < K; i++){
        for(int j = 0; j <= n; j++){
            lift[i][j] = lift[i-1][lift[i-1][j]];
        }
    }

    int q;
    cin>>q;
    while(q--){
        int l, r;
        cin>>l>>r;
        int ans = 0;
        l--, r--;
        /*
        for(int i = K-1; i >= 0; i--){
            if(lift[i][l] <= r){
                l = lift[i][l];
                ans += (1 << i);
            }
        }

        cout<<ans<<endl;
        */

        while(l <= r){
            l = go[l];
            ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 878 ms 87892 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 28 ms 14684 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 28 ms 14684 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1020 ms 91108 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 878 ms 87892 KB Output isn't correct
2 Halted 0 ms 0 KB -