This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
using namespace std;
#define rep(i,a,b) for(int i=a; i<=b; i++)
typedef vector<int> vi;
#define pb push_back
#define f first
#define s second
typedef long long ll;
const int N=200000;
int n,M;
int V[N], C[N];
int ind[N];
ll ans=-1e18;
int cnt[4*N];
ll sum[4*N];
void upd(int i, int v, int x=0, int lx=0, int rx=n){
if(rx-lx==1){
cnt[x]=(v!=0);
sum[x]=v;
return;
}
int m=(lx+rx)/2;
if(i<m) upd(i, v, 2*x+1, lx, m);
else upd(i, v, 2*x+2, m, rx);
cnt[x]=cnt[2*x+1]+cnt[2*x+2];
sum[x]=sum[2*x+1]+sum[2*x+2];
}
ll walk(int k, int x=0, int lx=0, int rx=n){
if(k<=0) return 0;
if(rx-lx==1) return sum[x]; // why needed
int m=(lx+rx)/2;
if(cnt[2*x+2]<=k) return sum[2*x+2]+walk(k-cnt[2*x+2], 2*x+1, lx ,m);
return walk(k, 2*x+2, m, rx);
}
void solve(int l, int r, int a, int b){ // [l, r) [a, b]
if(r<=l || b<a) return;
int m=(l+r)/2;
// if(a>=m-(M-2)) return solve(m+1, r, a, b);
pair<ll, int> opt={-1e18, 0};
for(int i=m-1; i>=max(l, b+1); i--) upd(ind[i], V[i]);
for(int i=min(m-1, b); i>=a; i--){
if(m-i+1>=M) opt=max(opt, {walk(M-2)+V[m]+V[i]+2*C[i]-2*C[m], i});
upd(ind[i], V[i]);
}
ans=max(ans, opt.f);
// cout << "opt " << m << " " << opt.s << " " << opt.f << "\n";
for(int i=m-1; i>=max(l, b+1); i--) upd(ind[i], 0);
for(int i=min(m-1, b); i>=a; i--) upd(ind[i], 0);
for(int i=opt.s+1; i<=b; i++) if(i<l) upd(ind[i], V[i]);
solve(l, m, a, opt.s);
for(int i=opt.s+1; i<=b; i++) if(i<l) upd(ind[i], 0);
for(int i=max(b+1, l); i<=m; i++) upd(ind[i], V[i]);
solve(m+1, r, opt.s, b);
for(int i=max(b+1, l); i<=m; i++) upd(ind[i], 0);
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin >> n >> M;
vector<pair<int, int>> vec;
rep(i,0,n-1){
int v,c; cin >> v >> c;
vec.push_back({c, v});
}
sort(vec.begin(), vec.end());
rep(i,0,n-1) V[i]=vec[i].second, C[i]=vec[i].first;
vec.clear();
rep(i,0,n-1) vec.push_back({V[i], i});
sort(vec.begin(), vec.end());
rep(i,0,n-1) ind[vec[i].s]=i;
solve(0, n, 0, n-1);
cout << ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |