Submission #1301054

#TimeUsernameProblemLanguageResultExecution timeMemory
1301054trandangquangEvent Hopping 2 (JOI21_event2)C++20
100 / 100
153 ms26852 KiB
#include<bits/stdc++.h> using namespace std; #define foru(i,a,b) for(int i=(a); i<=(b); ++i) #define ford(i,a,b) for(int i=(a); i>=(b); --i) #define rep(i,a) for(int i=0; i<(a); ++i) #define sz(a) (int)(a).size() #define all(a) (a).begin(),(a).end() #define bit(s,i) (((s)>>(i))&1) #define ii pair<int,int> #define vi vector<int> #define vii vector<ii> #define fi first #define se second #define ll long long #define int long long #define eb emplace_back #define pb push_back #define __builtin_popcount __builtin_popcountll #define _ << " " << template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;} template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;} const int N=1e5+5; const int INF=1e9; const int LG=17; int n,k,cntSeg,jump[N][LG+1]; ii seg[N],iniSeg[N],seg2[N]; set<ii> st; void buildJump(){ foru(i,1,cntSeg) jump[i][0]=lower_bound(seg2+1,seg2+1+cntSeg,ii(seg2[i].se,0))-seg2; foru(i,1,LG){ foru(j,1,cntSeg){ if(jump[j][i-1]>cntSeg) jump[j][i]=jump[j][i-1]; else jump[j][i]=jump[jump[j][i-1]][i-1]; } } } int numSeg(int l, int r){ int s=lower_bound(seg2+1,seg2+1+cntSeg,ii(l,0))-seg2; if(seg2[s].se>r || s>cntSeg) return 0; int res=1; ford(i,LG,0){ if(jump[s][i]<=cntSeg && seg2[jump[s][i]].se<=r){ res+=1<<i; s=jump[s][i]; } } return res; } void solve(){ cin>>n>>k; foru(i,1,n){ cin>>seg[i].fi>>seg[i].se; iniSeg[i]=seg[i]; } sort(seg+1,seg+1+n,[](ii x, ii y){return x.se<y.se || (x.se==y.se && x.fi>y.fi);}); foru(i,1,n){ if(cntSeg!=0 && seg[i].fi<=seg2[cntSeg].fi && seg2[cntSeg].se<=seg[i].se) continue; seg2[++cntSeg]=seg[i]; } buildJump(); st.insert({-1,-1}); st.insert({INF+1,INF+1}); vi segAns; int curNum=numSeg(-1,INF+1); if(curNum<k){ cout<<"-1\n"; return; } foru(i,1,n){ auto itL=st.lower_bound(iniSeg[i]); auto itR=itL; --itL; if(iniSeg[i].fi<itL->se || iniSeg[i].se>itR->fi) continue; int numAfter=curNum-numSeg(itL->se,itR->fi)+numSeg(itL->se,iniSeg[i].fi)+numSeg(iniSeg[i].se,itR->fi); if(k>0 && numAfter>=k-1){ curNum=numAfter; --k; segAns.eb(i); st.insert(iniSeg[i]); } } for(int i:segAns) cout<<i<<'\n'; } int32_t main(){ #define task "test" if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin.tie(0)->sync_with_stdio(0); int tc=1; //cin>>tc; foru(i,1,tc){ solve(); } }

Compilation message (stderr)

event2.cpp: In function 'int32_t main()':
event2.cpp:102:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  102 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
event2.cpp:103:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  103 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...