제출 #576520

#제출 시각아이디문제언어결과실행 시간메모리
576520benson1029마상시합 토너먼트 (IOI12_tournament)C++14
100 / 100
142 ms7224 KiB
#include<bits/stdc++.h> using namespace std; int seg[400005]; int v[400005]; int tmp[400005]; int l[100005], r[100005]; int seg2[400005]; int k[100005]; void seg_set(int x, int l, int r, int p, int v) { if(l==r) { seg[x] = v; } else { if(p<=(l+r)/2) seg_set(x*2, l, (l+r)/2, p, v); else seg_set(x*2+1, (l+r)/2+1, r, p, v); seg[x] = seg[x*2] + seg[x*2+1]; } } int seg_qry(int x, int l, int r, int v) { if(l==r) return l; else { if(v <= seg[x*2]) return seg_qry(x*2, l, (l+r)/2, v); else return seg_qry(x*2+1, (l+r)/2+1, r, v-seg[x*2]); } } void seg2_build(int x, int l, int r) { if(l==r) seg2[x] = k[l]; else { seg2_build(x*2, l, (l+r)/2); seg2_build(x*2+1, (l+r)/2+1, r); seg2[x] = max(seg2[x*2], seg2[x*2+1]); } } int seg2_qry(int x, int l, int r, int ll, int rr) { if(l > rr || r < ll) return -1e9; if(ll <= l && r <= rr) return seg2[x]; return max(seg2_qry(x*2, l, (l+r)/2, ll, rr), seg2_qry(x*2+1, (l+r)/2+1, r, ll, rr)); } int diff[100005]; int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) { for(int i=0; i<N; i++) seg_set(1, 0, N-1, i, 1); for(int i=0; i<C; i++) { S[i]++; E[i]++; for(int j=S[i]; j<=E[i]; j++) { tmp[j] = seg_qry(1, 0, N-1, j); } l[i] = tmp[S[i]]; r[i] = tmp[E[i]] + v[tmp[E[i]]]; for(int j=S[i]+1; j<=E[i]; j++) { v[tmp[S[i]]] += v[tmp[j]]; seg_set(1, 0, N-1, tmp[j], 0); } v[tmp[S[i]]] += (E[i] - S[i]); } for(int i=0; i<N-1; i++) k[i] = K[i]; seg2_build(1, 0, N-2); for(int i=0; i<C; i++) { if(R > seg2_qry(1, 0, N-2, l[i], r[i]-1)) { diff[l[i]]++; diff[r[i]+1]--; } } int ans = -1, pos = -1; for(int i=0; i<N; i++) { if(i) diff[i] += diff[i-1]; if(diff[i] > ans) { ans = diff[i]; pos = i; } } return pos; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...