제출 #417196

#제출 시각아이디문제언어결과실행 시간메모리
417196tqbfjotldEvent Hopping 2 (JOI21_event2)C++14
100 / 100
166 ms14668 KiB
#include <bits/stdc++.h>
using namespace std;

int decomp[100005][20];
vector<pair<int,int> > stuff;
vector<pair<pair<int,int>,int> > sorted;
int pos[100005];

int point(int cur, int amt){
    for (int x = 0; x<20; x++){
        if (amt&(1<<x)){
            cur = decomp[cur][x];
        }
    }
    return cur;
}

int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    for (int x = 0; x<n; x++){
        int a,b;
        scanf("%d%d",&a,&b);
        stuff.push_back({a,b});
        sorted.push_back({{a,b},x});
    }
    sorted.push_back({{1000000000,1000000001},n});
    sort(sorted.begin(),sorted.end());
    decomp[n][0] = n+1;
    decomp[n+1][0] = n+1;
    for (int x = n-1; x>=0; x--){
        decomp[x][0] = lower_bound(sorted.begin(),sorted.end(),make_pair(make_pair(sorted[x].first.second,-1),-1))-sorted.begin();
        decomp[x][0] = min(decomp[x][0],decomp[x+1][0]);
    }
    for (int x = 1; x<20; x++){
        for (int y = 0; y<=n+1; y++){
            decomp[y][x] = decomp[decomp[y][x-1]][x-1];
        }
    }
    if (point(0,k)>n){
        printf("-1");
        return 0;
    }
    for (int x = 0; x<n; x++){
        pos[sorted[x].second]=x;
    }
    vector<int> ans;
    set<pair<int,int> > rem;
    int curans = 0;
    int cur = 0;
    for (int y = 19; y>=0; y--){
        if (decomp[cur][y]<=n){
            cur = decomp[cur][y];
            curans += (1<<y);
        }
    }
    rem.insert({0,n});
    for (int x = 0; x<n; x++){
        if (ans.size()==k) break;
       // for (auto x : rem) printf("(%d,%d) ",x);
       // printf("\n");
        auto it = rem.lower_bound({pos[x]+1,-1});
        if (it==rem.begin()) continue;
        it--;
      //  printf("cur interval = %d, %d\n",(*it));
      //  printf("also %d %d\n",sorted[(*it).first].first.first,sorted[(*it).second].first.first);
        if (sorted[(*it).first].first.first>stuff[x].first || sorted[(*it).second].first.first<stuff[x].second) continue;
      //  printf("hi\n");
        int st = (*it).first;
        int en = (*it).second;
        int ans1 = 0;
        int cur = st;
        for (int y = 19; y>=0; y--){
            if (decomp[cur][y]<=pos[x]){
                cur = decomp[cur][y];
                ans1 += (1<<y);
            }
        }
        int ans2 = 0;
        int tt = lower_bound(sorted.begin(),sorted.end(),make_pair(make_pair(stuff[x].second,-1),-1))-sorted.begin();
        cur = tt;
        for (int y = 19; y>=0; y--){
            if (decomp[cur][y]<=en){
                cur = decomp[cur][y];
                ans2 += (1<<y);
            }
        }
        int ans3 = 0;
        cur = st;
        for (int y = 19; y>=0; y--){
            if (decomp[cur][y]<=en){
                cur = decomp[cur][y];
                ans3 += (1<<y);
            }
        }
      //  printf("ans1: %d, ans2: %d\n",ans1,ans2);
        if (curans-ans3+ans1+ans2+1+ans.size()>=k){
            rem.erase(it);
            if (pos[x]>st)rem.insert({st,pos[x]});
            if (en>tt)rem.insert({tt,en});
            ans.push_back(x);
            curans += ans1+ans2-ans3;
        }
    }
    for (int x  : ans){
        printf("%d\n",x+1);
    }
}

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

event2.cpp: In function 'int main()':
event2.cpp:59:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   59 |         if (ans.size()==k) break;
      |             ~~~~~~~~~~^~~
event2.cpp:97:47: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   97 |         if (curans-ans3+ans1+ans2+1+ans.size()>=k){
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
event2.cpp:20:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |     scanf("%d%d",&n,&k);
      |     ~~~~~^~~~~~~~~~~~~~
event2.cpp:23:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |         scanf("%d%d",&a,&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...