Pagini recente » Cod sursa (job #1346688) | Cod sursa (job #3183338) | Cod sursa (job #782002) | Cod sursa (job #1353295) | Cod sursa (job #125920)
Cod sursa(job #125920)
#include <cstdio>
#include <queue>
#define dim 50001
using namespace std;
int X[dim];
int Y[dim];
int Z[dim];
int L[dim];
int N;
long long Sol;
priority_queue <int> Q;
void clear()
{
while(Q.empty() == false)
Q.pop();
}
void solve(int A[])
{
int i, x, neg = 0, pos, cnt = 0;
long long ret = 0;
for(i=0; i<N; ++i)
{
L[i+1] = i - A[i+1];
if(L[i+1] < 0)
{
++ neg;
Q.push(L[i+1]);
}
ret += L[i+1] < 0 ? -L[i+1] : L[i+1];
}
pos = N - neg;
while(Q.empty() == false)
{
if(neg > pos)
{
x = Q.top(); Q.pop();
x = x < 0 ? -x : x;
x -= cnt;
ret -= x * neg;
ret += x * pos;
cnt += x;
-- neg;
++ pos;
}
else
{
clear();
break;
}
}
Sol += ret;
}
void kkt(int A[])
{
int i, ret, min = 0;
for(i=0; i<N; ++i)
L[i+1] = i;
for(i=1; i<=N; ++i)
min += L[i] > A[i] ? L[i] - A[i] : A[i] - L[i];
for(;;)
{
for(i=1; i<=N; ++i)
++ L[i];
ret = 0;
for(i=1; i<=N; ++i)
ret += L[i] > A[i] ? L[i] - A[i] : A[i] - L[i];
if(ret < min)
min = ret;
else
break;
}
Sol += min;
}
int main()
{
freopen("inundatii.in", "rt", stdin);
freopen("inundatii.out", "wt", stdout);
int i;
for(scanf("%d", &N), i=1; i<=N; ++i)
scanf("%d %d %d", X+i, Y+i, Z+i);
solve(X);
solve(Y);
solve(Z);
/*
kkt(X);
kkt(Y);
kkt(Z);
*/
printf("%lld", Sol);
fclose(stdin);
fclose(stdout);
return 0;
}