WA 求助 悬 1 关
查看原帖
WA 求助 悬 1 关
807774
_Wind_Leaves_ShaDow_楼主2024/11/19 21:30

rt,没找到哪里有锅。救一下吧 qwq。

#include <bits/stdc++.h>
#define lint __int128
#define int long long
#define fi first
#define se second
#define Il inline
#define Rg register
#define Ri Rg int
#define pb push_back
#define vec vector
#define IT ::iterator
#define p_que priority_queue

using namespace std;
//typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
const int N=2e5,Inf=1e18;
const db eps=1e-9,pi=acos(-1.0);

int n,m,rt[N+5],dp[N+5],ans=-Inf;
int lsh[N+5],dn=0;
int si=0,sm[N*20+5],ss[N*20+5],ls[N*20+5],rs[N*20+5];
pii a[N+5];

Il void Disc(){
	for(Ri i=1;i<=n;i++)lsh[i]=a[i].se;
	sort(lsh+1,lsh+n+1);dn=unique(lsh+1,lsh+n+1)-lsh-1;
	for(Ri i=1;i<=n;i++)a[i].se=lower_bound(lsh+1,lsh+dn+1,a[i].se)-lsh;
	return;
}

Il int add(int ps,int l,int r,int fp){
	int p=++si;sm[p]=lsh[ps],ss[p]=1;ls[p]=ls[fp],rs[p]=rs[fp];
	if(l==r)return p;int mid=(l+r)>>1;
	if(ps<=mid)ls[p]=add(ps,l,mid,ls[fp]);
	else rs[p]=add(ps,mid+1,r,rs[fp]);
	sm[p]=sm[ls[p]]+sm[rs[p]],ss[p]=ss[ls[p]]+ss[rs[p]];
	return p;
}

Il int qsm(int pl,int pr,int l,int r,int K){
	if(ss[pr]-ss[pl]<=K)return sm[pr]-sm[pl];
	if(l==r)return K*lsh[l];int mid=(l+r)>>1;
	if(ss[rs[pr]]-ss[rs[pl]]>=K)return qsm(rs[pl],rs[pr],mid+1,r,K);
	return qsm(ls[pl],ls[pr],l,mid,K-(ss[rs[pr]]-ss[rs[pl]]))+sm[rs[pr]]-sm[rs[pl]];
}

Il void solve(int l,int r,int pl,int pr){
	if(l>r||pl>pr)return;int mid=(l+r)>>1,p=pl;dp[mid]=-Inf;
	for(Ri i=pl;i<=min(pr,mid-m+1);i++){
		int tm=qsm(rt[i-1],rt[mid],1,dn,m)+(a[i].fi<<1)-(a[mid].fi<<1);
		if(tm>=dp[mid])dp[mid]=tm,p=i;
	}
	solve(l,mid-1,pl,p),solve(mid+1,r,p,pr);
	return;
}

signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;for(Ri i=1;i<=n;i++)cin>>a[i].se>>a[i].fi;
	sort(a+1,a+n+1);Disc();
	for(Ri i=1;i<=n;i++)rt[i]=add(a[i].se,1,dn,rt[i-1]);
	solve(1,n,1,n);
	for(Ri i=1;i<=n;i++)ans=max(ans,dp[i]);
	cout<<ans;
	return 0;
}
2024/11/19 21:30
加载中...