思路

思路很简单,把a和b排个序,然后每次贪心地获得最大快乐值-最小痛苦值,每个三次就加上m,然后记录每次更新后的最大值就可以了。 1e6的数据,不加任何优化会有点危。

代码

#pragma GCC optimize("Ofast", "inline", "-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define int long long
using namespace std;
const int N=1e6+7;

int n,m,a[N],b[N];

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int j=1;j<=n;j++) cin>>b[j];
	stable_sort(a+1,a+1+n);
	stable_sort(b+1,b+1+n);
	int ans=0,tmp=0;
	for(int i=1,j=n;i<=n;i++,j--){
		if(i%3==0) tmp+=m;
		tmp+=(b[j]-a[i]);
		ans=max(tmp,ans);
	}
	cout<<ans<<"\n";
	return 0;
}