이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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(cl == cr){
return best[cl] * x;
}
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;
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, mid);
cur = ask(1, 0, k - 1, m) - (c[mid] - c[i]);
res = max(res, cur);
if(cur > bes){
bes = cur;
opt = i;
}
}
solve(cl, mid - 1, optl, opt);
solve(mid + 1, cr, opt, optr);
}
int main(){
fastIO;
int n;
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;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |