Submission #1286315

#TimeUsernameProblemLanguageResultExecution timeMemory
1286315denislavEvent Hopping 2 (JOI21_event2)C++20
7 / 100
89 ms23680 KiB
# include <iostream> # include <vector> # include <algorithm> # include <set> using namespace std; const int MAX=2e5+11,LOG=20,INF=1e9; int n,k; pair<int,int> a[MAX]; int st[MAX][LOG]; void sparse_table() { for(int i=0;i<=n*2+1;i++) st[i][0]=INF; vector<pair<int,int>> v; for(int i=1;i<=n;i++) { v.push_back({a[i].first,i}); v.push_back({a[i].second,-i}); } sort(v.rbegin(),v.rend()); int to=INF; for(pair<int,int> pa: v) { if(pa.second<0) st[pa.first][0]=to; else to=min(to,a[pa.second].second); } st[0][0]=to; for(int i=n*2;i>=0;i--) st[i][0]=min(st[i][0],st[i+1][0]); for(int j=1;j<LOG;j++) { for(int i=0;i<=n*2;i++) { if(st[i][j-1]==INF or st[st[i][j-1]][j-1]==INF) st[i][j]=INF; else st[i][j]=st[st[i][j-1]][j-1]; } } //for(int i=0;i<=n*2;i++) cout<<i<<":"<<st[i][0]<<"\n"; } int lift(int r, int to) { int ans=0; for(int j=LOG-1;j>=0;j--) { if(st[r][j]<=to) { ans+=(1<<j); r=st[r][j]; } } return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>k; vector<pair<int,int>> compr; for(int i=1;i<=n;i++) { cin>>a[i].first>>a[i].second; compr.push_back({a[i].first,i}); compr.push_back({a[i].second,-i}); } sort(compr.begin(),compr.end()); int last=-1,ct=0; for(pair<int,int> pa: compr) { if(pa.first!=last) { ct++; last=pa.first; } if(pa.second>=0) a[pa.second].first=ct; else a[-pa.second].second=ct; } sparse_table(); //for(int i=1;i<=n;i++) cout<<a[i].first<<" "<<a[i].second<<"\n"; int curr=lift(0,n*2); set<pair<int,int>> s={{0,0},{n*2,n*2}}; vector<int> ans; for(int i=1;i<=n;i++) { if((int)s.size()==k+2) break; s.insert(a[i]); auto it=s.find(a[i]),itL=it,itR=it; itL--;itR++; int r=(itL->second),l=(itR->first); if(r>a[i].first or l<a[i].second) { s.erase(a[i]); continue; } int delta=lift(r,a[i].first)+1+lift(a[i].second,l)-lift(r,l); if(curr+delta>=k) { ans.push_back(i); curr+=delta; } else s.erase(a[i]); } if((int)ans.size()==k) { for(int x: ans) cout<<x<<"\n"; } else cout<<-1<<"\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...