Minimize the error
You are given two arrays A and B, each of size n. The error, E, between these two arrays is defined . You have to perform exactly k1 operations on array A and exactly k2 operations on array B. In one operation, you have to choose one element of the array and increase or decrease it by 1.
Output the minimum possible value of error after k1 operations on array A and k2 operations on array B have been performed.
Input
The first line contains three space-separated integers n (1 ≤ n ≤ 103), k1 and k2 (0 ≤ k1 + k2 ≤ 103, k1 and k2 are non-negative) — size of arrays and number of operations to perform on A and B respectively.
Second line contains n space separated integers a1, a2, …, an ( - 106 ≤ ai ≤ 106) — array A.
Third line contains n space separated integers b1, b2, …, bn ( - 106 ≤ bi ≤ 106)— array B.
Output
Output a single integer — the minimum possible value of after doing exactly k1 operations on array A and exactly k2 operations on array B.
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#include <functional>
#define inf 1000000000
using namespace std;
typedef long long ll;
const int MAXN=1e9+10;
const int MAX=1e5+10;
const double eps=1e-6;
int n,k1,k2;
struct NODE{
ll a,b,dis;
friend operator<(NODE a,NODE b){
return a.dis<b.dis;
}
};
NODE node[MAX];
priority_queue<NODE>q;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
//freopen("output.txt","w",stdout);
#endif
cin>>n>>k1>>k2;
int temp=k1+k2;
for(int i=1;i<=n;i++)
scanf("%lld",&node[i].a);
for(int i=1;i<=n;i++){
scanf("%lld",&node[i].b);
node[i].dis=abs(node[i].a-node[i].b);
q.push(node[i]);
}
ll ans=0;
while(temp){
NODE t=q.top();
q.pop();
if(!t.dis) break;
t.dis--;temp--;
q.push(t);
}
while(q.size()){
NODE t=q.top();q.pop();
ans+=t.dis*t.dis;
}
if(temp&&temp%2!=0) cout<<ans+1<<endl;
else cout<<ans<<endl;
return 0;
}