Skip to content

Commit 48eaada

Browse files
Create 17-Prize.cpp
1 parent 5e4f66f commit 48eaada

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

IOI/17-Prize.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#include "prize.h"
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
const int mxN=2e5;
6+
int n, a, ft[mxN+1];
7+
vector<int> v;
8+
9+
void upd(int i) {
10+
for(++i; i<=n; i+=i&-i)
11+
++ft[i];
12+
}
13+
14+
int qry(int i) {
15+
int r=0;
16+
for(; i; i-=i&-i)
17+
r+=ft[i];
18+
return r;
19+
}
20+
21+
int dc(int l=0, int r=n-1, int sl=0, int sr=a) {
22+
if(l>r)
23+
return -1;
24+
int ml=(l+r)/2, mr=ml;
25+
vector<int> b;
26+
for(; ml>=l; --ml) {
27+
if(qry(r+1)-qry(l)>=sr-sl)
28+
return -1;
29+
if(qry(ml+1)-qry(ml))
30+
continue;
31+
b=ask(ml);
32+
int c=b[0]+b[1];
33+
if(!c)
34+
return ml;
35+
if(c>a) {
36+
a=c;
37+
for(int vi : v)
38+
upd(vi);
39+
v.clear();
40+
return dc();
41+
}
42+
if(c==a) {
43+
v.push_back(ml);
44+
b[1]=b[0]+mr-ml;
45+
break;
46+
}
47+
if(c<a)
48+
upd(ml);
49+
}
50+
if(ml<l)
51+
b[1]=sl+mr-ml;
52+
int rl=dc(l, ml-1, sl, b[0]);
53+
return ~rl?rl:dc(mr+1, r, b[1], sr);
54+
}
55+
56+
int find_best(int N) {
57+
n=N;
58+
vector<int> b=ask(n-1);
59+
a=b[0]+b[1];
60+
return a?dc():n-1;
61+
}

0 commit comments

Comments
 (0)