File tree Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Expand file tree Collapse file tree 1 file changed +61
-0
lines changed Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments