#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 5;
int n, st, d, a[N], lim, Lb, Rb;
ll res = 0;
vector<int> rrh;
namespace PIT{
struct node{
node *l, *r;
int cnt = 0;
ll sum = 0;
node(node *l, node *r): l(l), r(r), cnt(0), sum(0LL){
if(l) cnt += l->cnt, sum += l->sum;
if(r) cnt += r->cnt, sum += r->sum;
}
node(int a, ll b): l(NULL), r(NULL), cnt(a), sum(b){}
};
node* ver[N];
int id = 0;
node* upd(int pos, int x, int y, int tl, int tr, node* i){
if(tl == tr) return new node(i->cnt + x, i->sum + y);
int tm = tl + tr >> 1;
if(pos <= tm) return new node(upd(pos, x, y, tl, tm, i->l), i->r);
else return new node(i->l, upd(pos, x, y, tm + 1, tr, i->r));
}
ll get(int k, int tl, int tr, node* le, node* ri){
if(tl == tr) return 1LL * rrh[tl] * min(k, ri->cnt - le->cnt);
int tm = tl + tr >> 1;
if(ri->r->cnt - le->r->cnt >= k) return get(k, tm + 1, tr, le->r, ri->r);
else return get(k - (ri->r->cnt - le->r->cnt), tl, tm, le->l, ri->l) + (ri->r->sum - le->r->sum);
}
void init(){
id = Lb - 1;
ver[id] = new node(0, 0); ver[id]->l = ver[id]->r = ver[id];
}
void update(int pos, int x, int y, int tl, int tr){
id += 1;
ver[id] = upd(pos, x, y, tl, tr, ver[id - 1]);
}
ll get_k(int k, int tl, int tr, int le, int ri){
return get(k, tl, tr, ver[le - 1], ver[ri]);
}
}
void init(){
Lb = max(1, st - d + 1);
Rb = min(n, st + d - 1);
for(int i = Lb; i <= Rb; i++) rrh.push_back(a[i]);
sort(rrh.begin(), rrh.end());
rrh.erase(unique(rrh.begin(), rrh.end()), rrh.end());
lim = rrh.size() - 1;
for(int i = Lb; i <= Rb; i++) a[i] = lower_bound(rrh.begin(), rrh.end(), a[i]) - rrh.begin();
PIT::init();
for(int i = Lb; i <= Rb; i++) PIT::update(a[i], 1, rrh[a[i]], 0, lim);
}
void solve(int l, int r, int optl, int optr){
if(l > r) return;
int mid = l + r >> 1, opt = -1;
ll cur = -1;
for(int i = max(optl, mid); i <= optr; i++){
int tmp = min(2*i - st - mid, i + st - 2*mid); // mid, st, i
ll val = PIT::get_k(min(d - tmp, i - mid + 1), 0, lim, mid, i);
if(val > cur){
cur = val;
opt = i;
}
}
res = max(res, cur);
solve(l, mid - 1, optl, opt);
solve(mid + 1, r, opt, optr);
}
long long findMaxAttraction(int _n, int _st, int _d, int _a[]){
n = _n; st = _st + 1; d = _d;
for(int i = 1; i <= n; i++) a[i] = _a[i - 1];
init();
solve(Lb, st, st, Rb);
return res;
}
//#define zNatsumi
#ifdef zNatsumi
int32_t main(){
cin.tie(0)->sync_with_stdio(0);
#define task "test"
if(fopen(task ".inp", "r")){
freopen(task ".inp", "r", stdin);
freopen(task ".out", "w", stdout);
}
int n, st, d, a[N];
cin >> n >> st >> d;
for(int i = 0; i < n; i++) cin >> a[i];
cout << findMaxAttraction(n, st, d, a);
}
#endif
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |