#include"holiday.h"
#include <bits/stdc++.h>
using namespace std;
int* attraction;
int start;
int n,d;
vector<pair<int,int> > vatr;
long long pseg[8000005];
int cseg[8000005];
int lb[8000005];
int rb[8000005];
int llink[8000005];
int rlink[8000005];
int nodesz;
int newnode(int old = -1){
int nn = ++nodesz;
if(old != -1){
pseg[nn] = pseg[old];
cseg[nn] = cseg[old];
lb[nn] = lb[old];
rb[nn] = rb[old];
llink[nn] = llink[old];
rlink[nn] = rlink[old];
}
return nn;
}
int build(int l, int r){
int c = newnode();
pseg[c] = 0;
cseg[c] = 0;
lb[c] = l;
rb[c] = r;
if(l == r) return c;
int k = (l+r)/2;
llink[c] = build(l, k);
rlink[c] = build(k+1, r);
return c;
}
int update(int o, int idx){
int c = newnode(o);
if(lb[o] == rb[o]){
cseg[c] = 1;
pseg[c] = vatr[idx].first;
return c;
}
int k = (lb[o] + rb[o])/2;
if(idx <= k){
llink[c] = update(llink[c], idx);
}else{
rlink[c] = update(rlink[c], idx);
}
pseg[c] = pseg[llink[c]] + pseg[rlink[c]];
cseg[c] = cseg[llink[c]] + cseg[rlink[c]];
return c;
}
long long query(int n1, int n2, int lim){
int avail = cseg[n2] - cseg[n1];
if(avail <= lim) return pseg[n2] - pseg[n1];
int rsz = cseg[rlink[n2]] - cseg[rlink[n1]];
if(rsz < lim){
return query(llink[n1], llink[n2], lim - rsz) + pseg[rlink[n2]] - pseg[rlink[n1]];
}else{
return query(rlink[n1], rlink[n2], lim);
}
}
vector<int> versions;
long long computeManyMax(int k, int l, int r){
long long res = query(versions[l], versions[r+1], k);
return res;
}
long long divideConquer(int l, int r, int ll, int rr){
if(l > r) return 0ll;
int m = (l+r)/2;
long long ans = 0;
int rmidx = -1;
int lmidx = -1;
for(int i = ll; i <= rr; i++){
int dist = m-i+min(start-i,m-start);
if(dist > d) continue;
long long cur = computeManyMax(d - dist, i, m);
if(cur > ans){
ans = cur;
lmidx = rmidx = i;
}else if(cur == ans){
rmidx = i;
}
}
ans = max(ans, divideConquer(l, m-1, ll, rmidx));
ans = max(ans, divideConquer(m+1, r, lmidx, rr));
return ans;
}
long long int findMaxAttraction(int n, int start, int d, int attraction[]) {
::attraction = attraction;
::start = start;
::n = n;
::d = d;
for(int i = 0; i < n; i++) vatr.emplace_back(attraction[i], i);
sort(vatr.begin(), vatr.end());
int root = build(0, n-1);
versions.push_back(root);
for(int i = 0; i < n; i++){
int idx = lower_bound(vatr.begin(), vatr.end(), make_pair(attraction[i], i)) - vatr.begin();
int newroot = update(root, idx);
versions.push_back(newroot);
root = newroot;
}
return divideConquer(start, n-1, 0, start);
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
384 KB |
Output is correct |
2 |
Correct |
1 ms |
512 KB |
Output is correct |
3 |
Correct |
1 ms |
384 KB |
Output is correct |
4 |
Correct |
1 ms |
384 KB |
Output is correct |
5 |
Correct |
1 ms |
384 KB |
Output is correct |
6 |
Correct |
1 ms |
384 KB |
Output is correct |
7 |
Correct |
1 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
90 ms |
56712 KB |
Output is correct |
2 |
Correct |
81 ms |
56556 KB |
Output is correct |
3 |
Correct |
89 ms |
56556 KB |
Output is correct |
4 |
Correct |
88 ms |
56560 KB |
Output is correct |
5 |
Correct |
128 ms |
51656 KB |
Output is correct |
6 |
Correct |
32 ms |
14964 KB |
Output is correct |
7 |
Correct |
64 ms |
27760 KB |
Output is correct |
8 |
Correct |
83 ms |
33904 KB |
Output is correct |
9 |
Correct |
24 ms |
10364 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
1664 KB |
Output is correct |
2 |
Correct |
3 ms |
1664 KB |
Output is correct |
3 |
Correct |
3 ms |
1664 KB |
Output is correct |
4 |
Correct |
4 ms |
1536 KB |
Output is correct |
5 |
Correct |
4 ms |
1408 KB |
Output is correct |
6 |
Correct |
1 ms |
768 KB |
Output is correct |
7 |
Correct |
2 ms |
768 KB |
Output is correct |
8 |
Correct |
2 ms |
768 KB |
Output is correct |
9 |
Correct |
2 ms |
768 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
92 ms |
57196 KB |
Output is correct |
2 |
Correct |
97 ms |
57324 KB |
Output is correct |
3 |
Correct |
113 ms |
24560 KB |
Output is correct |
4 |
Correct |
4 ms |
1536 KB |
Output is correct |
5 |
Correct |
2 ms |
768 KB |
Output is correct |
6 |
Correct |
2 ms |
768 KB |
Output is correct |
7 |
Correct |
2 ms |
768 KB |
Output is correct |
8 |
Correct |
472 ms |
57192 KB |
Output is correct |
9 |
Correct |
386 ms |
57196 KB |
Output is correct |