Submission #589803

#TimeUsernameProblemLanguageResultExecution timeMemory
589803marcipan5000Event Hopping 2 (JOI21_event2)C++14
100 / 100
859 ms51212 KiB
#include <bits/stdc++.h> using namespace std; struct event{ int s; int a,b; int inda,indb; }; struct break_point{ int a; int ind; }; int n,k; vector<event> t; event null_event; vector<int> h[200005]; vector<break_point> g; vector<break_point> gs; break_point u; int m; map<int,int,less<int>> ass; int p=0; int lmin=1e9,rmax=-1; bool kis(break_point x,break_point y) { return((x.a<y.a)||((x.a==y.a)&&(x.ind<y.ind))); } struct classcomp{ bool operator() (const event x,const event y) const { return((x.a<y.a)||((x.a==y.a)&&(x.s<y.s))); } }; int max_place(int l,int r) { int cur_ind=ass[l]; if ((h[cur_ind].size()==0)||(g[h[cur_ind][0]].a>r)) { return(0); } int db=1,depth=1; while ((h[cur_ind].size()>depth)&&(g[h[cur_ind][depth]].a<=r)) { db=db*2; depth++; } return(max_place(g[h[cur_ind][depth-1]].a,r)+db); } bool intersect(event x,event y) { return(!((x.b<=y.a)||(x.a>=y.b))); } int ans; int ans2; set<event,classcomp> an; set<event,classcomp>::iterator it; int d,e; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> k; null_event.s=0; null_event.a=0; null_event.b=0; null_event.inda=-1; null_event.indb=-1; t.assign(n+1,null_event); for (int i=1;i<=n;i++) { cin >> t[i].a >> t[i].b; lmin=min(lmin,t[i].a); rmax=max(rmax,t[i].b); t[i].s=i; if (ass.find(t[i].a)==ass.end()) { u.a=t[i].a; u.ind=p; g.push_back(u); ass[t[i].a]=p; p++; } t[i].inda=ass[t[i].a]; if (ass.find(t[i].b)==ass.end()) { u.a=t[i].b; u.ind=p; g.push_back(u); ass[t[i].b]=p; p++; } t[i].indb=ass[t[i].b]; if (h[t[i].inda].size()==0) { h[t[i].inda].push_back(t[i].indb); } else if (g[h[t[i].inda][0]].a>t[i].b) { h[t[i].inda][0]=t[i].indb; } } gs=g; m=g.size(); sort(gs.begin(),gs.end(),kis); for (int i=m-2;i>=0;i--) { if (h[gs[i+1].ind].size()>0) { if (h[gs[i].ind].size()==0) { h[gs[i].ind].push_back(h[gs[i+1].ind][0]); } else if (g[h[gs[i+1].ind][0]].a<g[h[gs[i].ind][0]].a) { h[gs[i].ind][0]=h[gs[i+1].ind][0]; } } } for (int j=1;j<=100;j++) { for (int i=0;i<m;i++) { if (h[gs[i].ind].size()<j) { break; } if (h[h[gs[i].ind][j-1]].size()<j) { break; } h[gs[i].ind].push_back(h[h[gs[i].ind][j-1]][j-1]); } } /* for (int i=0;i<m;i++) { cout << i << ": " << gs[i].a << " " << gs[i].ind << " jumps: "; for (int j:h[gs[i].ind]) { cout << g[j].a << " "; } cout << endl; } int d,e; while (true) { cin >> d >> e; cout << max_place(d,e) << endl; } */ ans=max_place(lmin,rmax); if (ans<k) { cout << -1 << endl; return(0); } event z; z.a=-1e9; z.b=lmin; z.s=-1; an.insert(z); z.a=rmax; z.b=1e9+1; z.s=-2; an.insert(z); //cout << lmin << " " << rmax << endl; for (int i=1;i<=n;i++) { ans2=ans; it=an.lower_bound(t[i]); //cout << i << " " << (*it).s << endl; //cout << (it==an.end()) << endl; if (intersect(*it,t[i])) { continue; } e=(*it).a; it--; //cout << i << " " << (*it).s << endl; if (intersect(*it,t[i])) { continue; } d=(*it).b; ans2-=max_place(d,e); ans2+=1; ans2+=max_place(d,t[i].a); ans2+=max_place(t[i].b,e); if (ans2>=k) { an.insert(t[i]); ans=ans2; } if (an.size()==2+k) { break; } //cout << ans << " " << ans2 << endl; } vector<int> kiir; for (event i:an) { if (i.s>0) { kiir.push_back(i.s); } } sort(kiir.begin(),kiir.end()); for (int i:kiir) { cout << i << endl; } return 0; } /* 5 4 1 3 2 5 8 9 6 8 10 15 */

Compilation message (stderr)

event2.cpp: In function 'int max_place(int, int)':
event2.cpp:44:30: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   44 |     while ((h[cur_ind].size()>depth)&&(g[h[cur_ind][depth]].a<=r)) {
      |             ~~~~~~~~~~~~~~~~~^~~~~~
event2.cpp: In function 'int main()':
event2.cpp:102:36: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  102 |             if (h[gs[i].ind].size()<j) {
      |                 ~~~~~~~~~~~~~~~~~~~^~
event2.cpp:105:44: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  105 |             if (h[h[gs[i].ind][j-1]].size()<j) {
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
event2.cpp:169:22: warning: comparison of integer expressions of different signedness: 'std::set<event, classcomp>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  169 |         if (an.size()==2+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...