Submission #1117101

#TimeUsernameProblemLanguageResultExecution timeMemory
1117101ttamxEvent Hopping 2 (JOI21_event2)C++17
100 / 100
207 ms20980 KiB
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; const int LG=17; int n,k; int l[N],r[N]; vector<int> ep; set<int> st,ed; vector<int> ans; struct Doubling{ int nxt[LG][N]; void set(int u,int v){ nxt[0][u]=v; } void build(){ for(int i=1;i<LG;i++){ for(int j=0;j<=n;j++){ nxt[i][j]=nxt[i-1][nxt[i-1][j]]; } } } template<class F> int query(int u,const F &f){ if(!f(u))return 0; int res=0; for(int i=LG-1;i>=0;i--){ int v=nxt[i][u]; if(f(v)){ u=v; res|=1<<i; } } return res+1; } }pre; int search(int x){ int lo=0,hi=ep.size()-1; while(lo<hi){ int m=(lo+hi+1)/2; if(x>=r[ep[m]])lo=m; else hi=m-1; } return ep[lo]; } int query(int x){ int cur=search(*st.lower_bound(x)); int lb=*prev(ed.upper_bound(x)); return pre.query(cur,[&](int u){return l[u]>=lb;}); } int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n >> k; for(int i=1;i<=n;i++){ cin >> l[i] >> r[i]; } vector<int> ord(n); iota(ord.begin(),ord.end(),1); sort(ord.begin(),ord.end(),[&](int i,int j){ return r[i]<r[j]||(r[i]==r[j]&&l[i]>l[j]); }); ep.emplace_back(0); int idx=0; for(auto i:ord){ if(l[i]<=l[ep.back()]){ continue; } while(idx+1<ep.size()&&r[ep[idx+1]]<=l[i]){ idx++; } pre.set(i,ep[idx]); ep.emplace_back(i); } st.emplace(0); st.emplace(1e9); ed.emplace(1); ed.emplace(1e9+1); pre.build(); int base=query(1); if(base<k){ cout << -1; exit(0); } for(int i=1;i<=n;i++){ int pos=*ed.upper_bound(l[i]); if(pos<=r[i]||pos<=*st.lower_bound(r[i])){ continue; } int memo=base; base-=query(l[i])-1; st.emplace(l[i]); ed.emplace(r[i]); base+=query(l[i]); base+=query(r[i]); if(base<k){ base=memo; st.erase(l[i]); ed.erase(r[i]); }else{ ans.emplace_back(i); if(ans.size()==k){ break; } } } assert(ans.size()==k); for(auto x:ans){ cout << x << "\n"; } }

Compilation message (stderr)

event2.cpp: In function 'int main()':
event2.cpp:74:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |         while(idx+1<ep.size()&&r[ep[idx+1]]<=l[i]){
      |               ~~~~~^~~~~~~~~~
event2.cpp:107:26: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  107 |             if(ans.size()==k){
      |                ~~~~~~~~~~^~~
In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from event2.cpp:1:
event2.cpp:112:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  112 |     assert(ans.size()==k);
      |            ~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...