Submission #1329052

#TimeUsernameProblemLanguageResultExecution timeMemory
1329052MuhammadSaramSimfonija (COCI19_simfonija)C++20
44 / 110
446 ms65508 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define all(v) v.begin(), v.end()

const int inf = 2e6, M = 1e5 + 1;

int pre3[2*inf+5],n,l,r,pre2[2*inf+5];
int* pre1=pre2+inf+1;
int* pre=pre3+inf+1;
vector<int> v;

int cal(int x,int y,int m,int a)
{
	x=max(x,l), y=min(y,r);
	if (x>y) return 0;
	y=min(y,inf), x=max(x,-inf);
	return (pre[y]-pre[x-1])*m+a*(pre1[y]-pre1[x-1]);
}

signed main()
{
	int m;
	cin>>n>>m;
	int a[n], b[n];
	for (int i=0;i<n;i++)
		cin>>a[i];
	for (int i=0;i<n;i++)
		cin>>b[i], v.push_back(a[i]-b[i]);
	sort(all(v));
	for (int i=0;i<v.size();i++)
		pre[v[i]]+=abs(v[i]), pre1[v[i]]++;
	for (int i=-inf+1;i<=inf;i++)
		pre1[i]+=pre1[i-1], pre[i]+=pre[i-1];
	int ans=1e18;
	for (int k=-inf;k<=inf;k++)
	{
		int s=-1, e=2*inf+1;
		while (s+1<e)
		{
			int mid=(s+e)/2;
			int x=pre1[max(-mid-k,-inf-1)]+n-pre1[min(mid-k-1,inf)];
			if (x>=m)
				s=mid;
			else
				e=mid;
		}
		l=-s-k+1, r=s-k-1;int val=0;
		if (k<0)
			val=cal(l,0,1,-k)+cal(1,-k,-1,-k)+cal(-k+1,r,1,k);
		else
			val=cal(l,-k,1,-k)+cal(-k+1,0,-1,k)+cal(1,r,1,k);
		ans=min(ans,val);
	}
	cout<<ans<<endl;

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...