Submission #1197666

#TimeUsernameProblemLanguageResultExecution timeMemory
1197666Hamed_GhaffariJousting tournament (IOI12_tournament)C++20
100 / 100
72 ms8776 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; #define lc id<<1 #define rc lc|1 #define mid ((l+r)>>1) const int MXN = 1e5+5, inf = 1e9; int n; namespace seg1 { int seg[MXN<<2]; bool lz[MXN<<2]; void build(int l=0, int r=n, int id=1) { seg[id] = r-l; lz[id] = 0; if(r-l == 1) return; build(l, mid, lc); build(mid, r, rc); } inline void apply(int id) { seg[id] = 0; lz[id] = 1; } inline void push(int l, int r, int id) { if(r-l>1 && lz[id]) { apply(lc); apply(rc); } lz[id] = 0; } void upd(int s, int e, int l=0, int r=n, int id=1) { if(s>=r || l>=e) return; if(s<=l && r<=e) return apply(id); push(l, r, id); upd(s, e, l, mid, lc); upd(s, e, mid, r, rc); seg[id] = seg[lc] + seg[rc]; } int find(int x, int l=0, int r=n, int id=1) { if(seg[id]<x) return -1; if(r-l == 1) return l; push(l, r, id); int res = find(x, l, mid, lc); return res==-1 ? find(x-seg[lc], mid, r, rc) : res; } } namespace seg2 { pll seg[MXN<<2]; ll lz[MXN<<2]; void build(int l=0, int r=n, int id=1) { seg[id] = pll(0, -l); if(r-l == 1) return; build(l, mid, lc); build(mid, r, rc); } void upd(int s, int e, int x, int l=0, int r=n, int id=1) { if(s>=r || l>=e) return; if(s<=l && r<=e) { seg[id].first += x; lz[id] += x; return; } upd(s, e, x, l, mid, lc); upd(s, e, x, mid, r, rc); seg[id] = max(seg[lc], seg[rc]); seg[id].first += lz[id]; } } int GetBestPosition(int n, int C, int R, int *a, int *s, int *e) { ::n = n; seg1::build(); for(int i=0; i<C; i++) { s[i] = seg1::find(s[i]+1); e[i] = seg1::find(e[i]+2); if(e[i]==-1) e[i] = n; e[i]--; seg1::upd(s[i]+1, e[i]+1); } vector<pii> segs; int lst=-1; for(int i=0; i<n-1; i++) if(a[i]>R) { if(i-lst>1) segs.push_back({lst+1, i}); lst = i; } if(n-1-lst>1) segs.push_back({lst+1, n-1}); pll ans = {-1, -1}; seg2::build(); for(int i=0; i<C; i++) { int pos = lower_bound(segs.begin(), segs.end(), pii(s[i]+1, 0))-segs.begin()-1; if(pos>=0 && segs[pos].second>=e[i]) seg2::upd(s[i], e[i]+1, 1); else seg2::upd(s[i], e[i], -inf); ans = max(ans, seg2::seg[1]); } return -ans.second; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...