题解:
1、k1和k2可以加起来,因为操作可以加可以减,对于两个数来说就是为了互相靠近,使得差值最小
2、用STL优先队列来维护最大堆,然后每次对堆顶减1,特殊点是当堆顶是0时是加1,因为出现负数时无法维护后期操作。模拟一下就会发现当差值为零时加1和减1是没有区别的,因为最后要取平方。
3、最后是注意数据爆int就行了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000+10;
long long x[maxn],y[maxn];
priority_queue<long long> q;
int main(){
int n,k1,k2;
cin >> n >> k1 >> k2;
while(!q.empty()) q.pop();
for(int i=0;i<n;i++)
cin >> x[i];
for(int i=0;i<n;i++){
cin >> y[i];
q.push(abs(x[i]-y[i]));
}
long long k = k1 + k2,temp;
while(k > 0){
if(q.top()>0)
temp = q.top() - 1;
else
temp = 1;
k--;
q.pop();
q.push(temp);
}
long long sum = 0;
while(!q.empty()){
temp = q.top();
sum += pow(temp,2);
q.pop();
}
cout << sum << endl;
return 0;
}