Submission #870065

#TimeUsernameProblemLanguageResultExecution timeMemory
870065wkspRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
1228 ms45716 KiB
#include<bits/stdc++.h>

using namespace std;

const int base = 131072;
const int max_long = 20;
pair<int, int> jump_tree[max_long][base*2];
int train[base];
int train_reverse[base];

pair<int, int> get_array(int a, int b, int log, int v = 1, int l = 0, int r = base - 1){
    if(a <= l and b >= r){
        return jump_tree[log][v];
    }
    if(a > r or b < l){
        return {1e9, 0};
    }
    int mid = (l+r)/2;
    pair<int, int> first = get_array(a, b, log, v * 2, l, mid);
    pair<int, int> second = get_array(a, b, log, v * 2 + 1, mid + 1, r);
    pair<int, int> result;
    result.first = min(first.first, second.first);
    result.second = max(first.second, second.second);
    return result;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n, k, m, q;
    cin >> n >> k >> m;
    for(int i = 0; i < m; i++){
        int a, b;
        cin >> a >> b;
        if(a < b){
            train[a] = max(train[a], b);
        }else{
            train_reverse[a] = min(train_reverse[a], b);
            if(train_reverse[a] == 0){
                train_reverse[a] = b;
            } 
        }
    }
    vector<pair<int, int>> actual_trains;
    int wsk = 0;
    for(int i = 0; i < 2 * base; i++){
        jump_tree[0][i] = {1e9, 0};
    }
    for(int i = 0; i <= n; i++){
        int c = train[i];
        while(!actual_trains.empty()){
            if(actual_trains[actual_trains.size()-1].first < c){
                actual_trains.pop_back();
            }else{
                break;
            }
        }
        if(c != 0){
            actual_trains.push_back({c, min(i + k - 1, c)});
        }
    
        if(actual_trains.empty()){
            jump_tree[0][base + i].second = i;
        }else{
            if(wsk >= actual_trains.size()){
                wsk = actual_trains.size()-1;
            }
            while(actual_trains[wsk].second < i){
                wsk++;
                if(wsk == actual_trains.size()){
                    wsk = 0;
                    actual_trains.clear();
                    break;
                }
            }
            if(!actual_trains.empty()){
                jump_tree[0][base + i].second = actual_trains[wsk].first;
            }else{
                jump_tree[0][base + i].second = i;
            }
        }
    }
    actual_trains.clear();
    for(int i = n; i > 0; i--){
        int c = train_reverse[i];
        while(!actual_trains.empty()){
            if(actual_trains[actual_trains.size()-1].first > c and c != 0){
                actual_trains.pop_back();
            }else{
                break;
            }
        }
        if(c != 0){
            actual_trains.push_back({c, max(i - k + 1, c)});
        }
    
        if(actual_trains.empty()){
            jump_tree[0][base + i].first = i;
        }else{
            if(wsk >= actual_trains.size()){
                wsk = actual_trains.size()-1;
            }
            while(actual_trains[wsk].second > i){
                wsk++;
                if(wsk == actual_trains.size()){
                    wsk = 0;
                    actual_trains.clear();
                    break;
                }
            }
            if(!actual_trains.empty()){
                jump_tree[0][base + i].first = actual_trains[wsk].first;
            }else{
                jump_tree[0][base + i].first =  i;
            }
        }
    }
    for(int i = base - 1; i > 0; i--){
        jump_tree[0][i].first = min(jump_tree[0][2*i].first, jump_tree[0][2*i+1].first);
        jump_tree[0][i].second = max(jump_tree[0][2*i].second, jump_tree[0][2*i+1].second);
    }
    for(int i = 1; i < max_long; i++){
        for(int j = 1; j <= base + n; j++){
            jump_tree[i][j] = get_array(jump_tree[i-1][j].first, jump_tree[i-1][j].second, i - 1);
        }
    }
    cin >> q;
    for(int i = 0; i < q; i++){
        int begin, end;
        cin >> begin >> end;
        int result = 0;
        int number = (1<<(max_long-1));
        pair<int, int> range = {begin, begin};
        for(int j = max_long - 1; j >= 0; j--){
            pair <int, int> new_range = get_array(range.first, range.second, j);
            if(new_range.first > end or new_range.second < end){
                result += number;
                range = new_range;
            }
            number /= 2;
        }
        pair <int, int> new_range_2 = get_array(range.first, range.second, 0);
        if(new_range_2.first > end or new_range_2.second < end){
            result = -1;
        }else{
            result++;
        }
        cout << result << '\n';
    }














    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:66:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |             if(wsk >= actual_trains.size()){
      |                ~~~~^~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:71:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |                 if(wsk == actual_trains.size()){
      |                    ~~~~^~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:101:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |             if(wsk >= actual_trains.size()){
      |                ~~~~^~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:106:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |                 if(wsk == actual_trains.size()){
      |                    ~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...