Submission #312311

#TimeUsernameProblemLanguageResultExecution timeMemory
312311YJUCake 3 (JOI19_cake3)C++14
24 / 100
4046 ms18152 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("unroll-loops,no-stack-protector")
using namespace std;
typedef int ll;
typedef long double ld;
typedef pair<ll,ll> pll;
const ll MOD=1e9+7;
const ll MOD2=998244353;
const ll N=1e6+5;
const ld pi=3.14159265359;
const ll INF=(1LL<<30);
#define SQ(i) ((i)*(i))
#define REP(i,n) for(ll i=0;i<n;i++)
#define REP1(i,n) for(ll i=1;i<=n;i++)
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define setp setprecision
#define lwb lower_bound
#define SZ(_a) (ll)_a.size()

ll pl=1,pr=0,n,m,x,y,cnt[4*N],rev[N];
long long ans=-INF,sum[4*N];
map<ll,ll> A;
vector<pll> v;
vector<ll> lis;

void insert(ll id,ll l,ll r,ll to,ll d){
	if(l==r-1){cnt[id]+=d;sum[id]=cnt[id]*rev[l];return ;}
	ll mid=(l+r)/2;
	if(to<mid){
		insert(id*2,l,mid,to,d);
	}else{
		insert(id*2+1,mid,r,to,d);
	}
	cnt[id]=cnt[id*2]+cnt[id*2+1];
	sum[id]=sum[id*2]+sum[id*2+1];
}

long long query(ll id,ll l,ll r,ll le){
	if(l==r-1){return le*rev[l];}
	ll mid=(l+r)/2;
	if(le>=cnt[id*2+1]){
		return sum[id*2+1]+query(id*2,l,mid,le-cnt[id*2+1]);
	}else{
		return query(id*2+1,mid,r,le);
	}
}
 
void get_ans(ll l,ll r){
	++l;--r;
	while(pl>l){insert(1,0,SZ(lis),A[v[--pl].X],1);}
	while(pr<r){insert(1,0,SZ(lis),A[v[++pr].X],1);}
	while(pl<l){insert(1,0,SZ(lis),A[v[pl++].X],-1);}
	while(pr>r){insert(1,0,SZ(lis),A[v[pr--].X],-1);}
}
 
void solve(ll ql,ll qr,ll al,ll ar){
	if(ql>qr)return ;
	ll mid=(ql+qr)/2;
	long long bans=-INF,bpos=al;
	for(int i=min(mid-1,ar);i>=al;i--){
		get_ans(i,mid);
		long long tans=(cnt[1]<m?-INF:query(1,0,SZ(lis),m)-2*(v[mid].Y-v[i].Y)+v[mid].X+v[i].X);
		if(tans>bans){
			bpos=i,bans=tans;
		}
		ans=max(ans,tans);
	}
	solve(ql,mid-1,al,bpos);
	solve(mid+1,qr,bpos,ar);
}
 
int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	cin>>n>>m;
	m-=2;
	REP(i,n)cin>>x>>y,v.pb(mp(x,y)),lis.pb(x);
	sort(lis.begin(),lis.end());
	lis.resize(unique(lis.begin(),lis.end())-lis.begin());
	REP(i,SZ(lis))rev[i]=lis[i],A[lis[i]]=i;
	sort(v.begin(),v.end(),[](pll a,pll b){
		return (a.Y!=b.Y?a.Y<b.Y:a.X>b.X);
	});
	solve(0,n-1,0,n-1);
	cout<<ans<<"\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...