제출 #889375

#제출 시각아이디문제언어결과실행 시간메모리
889375salmonRailway Trip 2 (JOI22_ho_t4)C++14
100 / 100
1893 ms353620 KiB
#include <bits/stdc++.h>
using namespace std;

int N;
int M,Q;
int A,B;
int K;
int lt[100100];
int rt[100100];
int l[100100][30];
int r[100100][30];

struct node{

    int s,e,m;
    node *l,*r;
    int le,ri;
    int d;

    node(int S, int E, int D){
        s = S;
        e = E;
        m = (s + e)/2;
        d = D;

        if(s == e){
            le = ::l[s][d];
            ri = ::r[s][d];
        }
        else{
            l = new node(s,m,d);
            r = new node(m + 1,e,d);

            le = min(l -> le, r -> le);
            ri = max(l -> ri, r -> ri);
        }
    }


    pair<int,int> query(int S, int E){
        if(S <= s && e <= E){
            return make_pair(le,ri);
        }

        pair<int,int> ii = make_pair(S,E);
        pair<int,int> ii1;

        if(S <= m){
            ii1 = l -> query(S,E);

            ii.first = min(ii.first, ii1.first);
            ii.second = max(ii.second,ii1.second);
        }
        if(m < E){
            ii1 = r -> query(S,E);

            ii.first = min(ii.first, ii1.first);
            ii.second = max(ii.second, ii1.second);
        }

        return ii;
    }
} *root[30];

int main(){

    scanf(" %d",&N);
    scanf(" %d",&K);
    scanf(" %d",&M);

    for(int i = 1; i <= N; i++){
        rt[i] = i;
        lt[i] = i;
    }

    for(int i = 1; i <= M; i++){
        scanf(" %d",&A);
        scanf(" %d",&B);

        if(B > A){
            rt[A] = max(rt[A],B);
        }
        else if(B < A){
            lt[A] = min(lt[A],B);
        }
    }

    deque<pair<int,int>> dq;

    for(int i = 1; i <= N; i++){

        while(!dq.empty() && dq.front().first == i){
            dq.pop_front();
        }

        while(!dq.empty() && dq.back().second <= rt[i]){
            dq.pop_back();
        }

        dq.push_back(make_pair(i + K,rt[i]) );

        r[i][0] = dq.front().second;
    }

    dq.clear();

    for(int i = N; i >= 1; i--){
        while(!dq.empty() && dq.front().first == i){
            dq.pop_front();
        }

        while(!dq.empty() && dq.back() .second >= lt[i]){
            dq.pop_back();
        }

        dq.push_back(make_pair(i - K,lt[i]));

        l[i][0] = dq.front().second;
    }

    root[0] = new node(1,N,0);


    for(int j = 1; j <= 25; j++){
        for(int i = 1; i <= N; i++){
            pair<int,int> ii = root[j - 1] -> query(i,i);

            ii = root[j - 1] -> query(ii.first,ii.second);

            l[i][j] = ii.first;
            r[i][j] = ii.second;
        }

        root[j] = new node(1,N,j);
    }

    scanf(" %d",&Q);

    for(int i = 0; i < Q; i++){
        scanf(" %d",&A);
        scanf(" %d",&B);

        int sum = 0;
        pair<int,int> ii = root[25] -> query(A,A);
        pair<int,int> temp;

        if(ii.first > B || B > ii.second){
            printf("-1\n");
        }
        else{
            ii = make_pair(A,A);
            temp = make_pair(A,A);

            for(int i = 25; i >= 0; i--){
                temp = root[i] -> query(ii.first, ii.second);

                if(temp.first > B || B > temp.second){
                    ii = temp;
                    sum += (1<<i);
                }
            }

            printf("%d\n",sum + 1);

        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:67:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |     scanf(" %d",&N);
      |     ~~~~~^~~~~~~~~~
Main.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |     scanf(" %d",&K);
      |     ~~~~~^~~~~~~~~~
Main.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |     scanf(" %d",&M);
      |     ~~~~~^~~~~~~~~~
Main.cpp:77:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |         scanf(" %d",&A);
      |         ~~~~~^~~~~~~~~~
Main.cpp:78:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |         scanf(" %d",&B);
      |         ~~~~~^~~~~~~~~~
Main.cpp:137:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  137 |     scanf(" %d",&Q);
      |     ~~~~~^~~~~~~~~~
Main.cpp:140:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  140 |         scanf(" %d",&A);
      |         ~~~~~^~~~~~~~~~
Main.cpp:141:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  141 |         scanf(" %d",&B);
      |         ~~~~~^~~~~~~~~~
#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...