Submission #1244878

#TimeUsernameProblemLanguageResultExecution timeMemory
1244878hainam2k9Event Hopping 2 (JOI21_event2)C++20
100 / 100
140 ms22444 KiB
#include <bits/stdc++.h> #define tt cin.tie(0), cout.tie(0), ios_base::sync_with_stdio(0) #define fo freopen((NAME+".INP").c_str(), "r", stdin), freopen((NAME+".OUT").c_str(), "w", stdout) #define ll long long #define ull unsigned long long #define i128 __int128 #define db long double #define sz(a) ((int)(a).size()) #define pb emplace_back #define pf emplace_front #define pob pop_back #define pof pop_front #define lb lower_bound #define ub upper_bound #define fi first #define se second #define ins emplace #define mp make_pair using namespace std; const int MOD = 1e9+7, MAXN = 2e5+5; const string NAME = ""; int n,k,nxt[MAXN][20],sum=0; pair<int,int> p[MAXN]; vector<int> v; set<pair<int,int>> s; void compress(){ vector<int> v; for(int i = 1; i<=n; ++i) v.pb(p[i].fi), v.pb(p[i].se); sort(v.begin(),v.end()); for(int i = 1; i<=n; ++i) p[i].fi=lb(v.begin(),v.end(),p[i].fi)-v.begin()+1, p[i].se=lb(v.begin(),v.end(),p[i].se)-v.begin()+1; } int getmax(int l, int r){ int rs=0; for(int i = 18; i>=0; --i) if(nxt[l][i]<=r) l=nxt[l][i]+1, rs|=1<<i; return rs; } pair<int,int> check(pair<int,int> p){ int L=1, R=2*n; auto it = s.lb(p); if(it!=s.end()&&p.se>=it->fi) return {0,0}; if(it!=s.end()) R=it->fi-1; if(it!=s.begin()&&prev(it)->se>=p.fi) return {0,0}; if(it!=s.begin()) L=prev(it)->se+1; return {L,R}; } int main() { tt; if(fopen((NAME + ".INP").c_str(), "r")) fo; cin >> n >> k; for(int i = 1; i<=n; ++i) cin >> p[i].fi >> p[i].se, --p[i].se; compress(); memset(nxt,0x3f,sizeof(nxt)); for(int i = 1; i<=n; ++i) nxt[p[i].fi][0]=min(nxt[p[i].fi][0],p[i].se); for(int i = n*2; i>0; --i){ nxt[i][0]=min(nxt[i][0],nxt[i+1][0]); for(int j = 1; j<=18; ++j) if(nxt[i][j-1]<n*2) nxt[i][j]=nxt[nxt[i][j-1]+1][j-1]; } sum=getmax(1,2*n); if(sum<k) return cout << -1, 0; for(int i = 1; i<=n; ++i){ if(sz(v)==k) break; pair<int,int> tmp=check(p[i]); if(tmp==mp(0,0)) continue; int L=tmp.fi,R=tmp.se,newsum=sum-getmax(L,R)+getmax(L,p[i].fi-1)+getmax(p[i].se+1,R)+1; if(newsum>=k) v.pb(i), s.ins(p[i]), sum=newsum; } for(int& x : v) cout << x << "\n"; }

Compilation message (stderr)

event2.cpp: In function 'int main()':
event2.cpp:3:19: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    3 | #define fo freopen((NAME+".INP").c_str(), "r", stdin), freopen((NAME+".OUT").c_str(), "w", stdout)
      |            ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
event2.cpp:53:45: note: in expansion of macro 'fo'
   53 |     if(fopen((NAME + ".INP").c_str(), "r")) fo;
      |                                             ^~
event2.cpp:3:63: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    3 | #define fo freopen((NAME+".INP").c_str(), "r", stdin), freopen((NAME+".OUT").c_str(), "w", stdout)
      |                                                        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
event2.cpp:53:45: note: in expansion of macro 'fo'
   53 |     if(fopen((NAME + ".INP").c_str(), "r")) fo;
      |                                             ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...