This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N = (int)2e5 + 9;
const ll inf = (ll)1e18;
vector<ll> best;
ll c[N];
ll v[N];
int m;
struct Node{
ll cnt;
ll sum;
};
Node T[N * 4 + 512];
int k;
void update(int node, int cl, int cr, int p, ll v){
T[node].cnt += v;
T[node].sum += v * 1ll * best[p];
if(cl == cr){
return;
}
int mid = (cl + cr) / 2;
if(mid >= p)
update(node * 2, cl, mid, p, v);
else
update(node * 2 + 1, mid + 1, cr, p, v);
}
ll ask(int node, int cl, int cr, int x){
if(T[node].cnt <= x){
return T[node].sum;
}
int mid = (cl + cr) / 2;
if(T[node * 2 + 1].cnt >= x){
return ask(node * 2 + 1, mid + 1, cr, x);
}
else{
return ask(node * 2, cl, mid, x - T[node * 2 + 1].cnt) + T[node * 2 + 1].sum;
}
}
int L = 0, R = -1;
void go(int l, int r){
while(L < l){
update(1, 0, k - 1, v[L], -1);
L ++ ;
}
while(L > l){
L -- ;
update(1, 0, k - 1, v[L], +1);
}
while(R < r){
R ++ ;
update(1, 0, k - 1, v[R], +1);
}
while(R > r){
update(1, 0, k - 1, v[R], -1);
R -- ;
}
}
ll res = -inf;
int n;
void solve(int cl, int cr, int optl, int optr){
if(cl > cr)
return;
int mid = (cl + cr) / 2;
ll cur=0;
int opt = -1;
ll bes = -inf;
for(int i = optl ; i <= min(optr, mid - m + 1); i ++ ){
go(i + 1, mid - 1);
cur = best[v[mid]] + best[v[i]] + ask(1, 0, k - 1, m - 2) - (c[mid] - c[i]);
res = max(res, cur);
if(cur > bes){
bes = cur;
opt = i;
}
}
solve(cl, mid - 1, 0, n - 1);
solve(mid + 1, cr, 0, n - 1);
}
int main(){
fastIO;
cin >> n >> m;
pii vv[n];
for(int i = 0 ; i < n; i ++ ){
cin >> vv[i].se >> vv[i].fi;
vv[i].fi *= 2ll;
best.push_back(vv[i].se);
}
sort(best.begin(), best.end());
best.resize(unique(best.begin(), best.end()) - best.begin());
k = best.size();
sort(vv, vv + n);
for(int i = 0 ; i < n; i ++ ){
c[i] = vv[i].fi;
v[i] = lower_bound(best.begin(), best.end(), vv[i].se) - best.begin();
}
solve(m - 1, n - 1, 0, n - 1);
cout << res << "\n";
return 0;
}
Compilation message (stderr)
cake3.cpp: In function 'void solve(int, int, int, int)':
cake3.cpp:83:9: warning: variable 'opt' set but not used [-Wunused-but-set-variable]
int opt = -1;
^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |