제출 #348401

#제출 시각아이디문제언어결과실행 시간메모리
348401dennisstar마상시합 토너먼트 (IOI12_tournament)C++17
100 / 100
112 ms6764 KiB
#include <bits/stdc++.h> using namespace std; const int MX = 1e5 + 5, SMX = 1<<18; int N, C, R; int K[MX], S[MX], E[MX], A[MX]; struct { int st[SMX]; void init(int i, int s, int e) { if (s==e) { st[i]=1; return ; } int m=(s+e)/2; init(i*2, s, m); init(i*2+1, m+1, e); st[i]=st[i*2]+st[i*2+1]; } int find(int i, int s, int e, int t) { if (st[i]<t) return e+1; if (s==e) return s; int m=(s+e)/2; if (st[i*2]>=t) return find(i*2, s, m, t); else return find(i*2+1, m+1, e, t-st[i*2]); } void upd(int i, int s, int e, int l, int r) { if (e<l||r<s||!st[i]) return ; if (l<=s&&e<=r) { st[i]=0; return ; } int m=(s+e)/2; upd(i*2, s, m, l, r); upd(i*2+1, m+1, e, l, r); st[i]=st[i*2]+st[i*2+1]; } }S1; struct { int st[SMX]; void init(int i, int s, int e) { if (s==e) { st[i]=K[s]; return ; } int m=(s+e)/2; init(i*2, s, m); init(i*2+1, m+1, e); st[i]=max(st[i*2], st[i*2+1]); } int get(int i, int s, int e, int l, int r) { if (e<l||r<s) return 0; if (l<=s&&e<=r) return st[i]; int m=(s+e)/2; return max(get(i*2, s, m, l, r), get(i*2+1, m+1, e, l, r)); } }S2; int sol() { S1.init(1, 1, N); S2.init(1, 1, N-1); for (int i=1; i<=C; i++) { int l=S1.find(1, 1, N, S[i]), r=S1.find(1, 1, N, E[i]+1)-1; S1.upd(1, 1, N, l+1, r); if (S2.get(1, 1, N-1, l, r-1)<R) A[l]++, A[r+1]--; } int mx=0, r=1; for (int i=1; i<=N; i++) { A[i]+=A[i-1]; if (A[i]>mx) mx=A[i], r=i; } return r-1; } int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) { ::N=N, ::C=C, ::R=R+1; for (int i=1; i<=N-1; i++) ::K[i]=K[i-1]+1; for (int i=1; i<=C; i++) ::S[i]=S[i-1]+1, ::E[i]=E[i-1]+1; return sol(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...