Alex vrea să își usuce rufele pe balcon. El a spălat K tricouri și o șosetă. Uscătorul lui Alex are N niveluri, iar fiecare nivel are M locuri unde poate atârna câte un singur obiect de îmbrăcăminte. Alex usucă hainele într-un mod specific: începe prin a pune șoseta pe nivelul A, locul B, iar apoi aduce coșul de rufe cu cele K tricouri și le așază pe rând, mereu alegând o poziție liberă cât mai depărtată de locul unde a pus șoseta. Metrica pe care o găsește ca fiind cea mai potrivită când vine vorba de uscatul rufelor este distanța Manhattan, astfel încât distanța de la nivelul r1, locul c1 la nivelul r2, locul c2 are valoarea expresiei |r1 – r2| + |c1 - c2|.
Cerința
Aflați distanța dintre poziția unde a atârnat ultimul tricou și poziția unde se usucă șoseta.
Date de intrare
Pe prima linie a fișierului de intrare rufe.in se vor afla 5 numere întregi N, M, A, B, și K, cu semnificația din enunț, separate prin câte un spațiu.
Date de ieșire
În fișierul de ieșire rufe.out se va afla o singură linie care să conțină valoarea cerută.
Restricții și precizări
1 ≤ N, M ≤ 1.000.000.0001 ≤ A ≤ N1 ≤ B ≤ M1 ≤ K ≤ N * M – 1- Pentru teste în valoare de
13puncte se garantează căN, M ≤ 1.000. - Pentru alte teste în valoare de
12puncte se garantează căN ≤ 1.000.000. - Pentru alte teste în valoare de
12puncte se garantează căM ≤ 1.000.000. - Pentru alte teste în valoare de
18puncte se garantează căK ≤ 1.000.000. - Pentru alte teste în valoare de
7puncte se garantează căA = B = 1.
Exemplul 1:
rufe.in
5 6 3 3 4
rufe.out
4
Explicație
Uscătorul are 5 niveluri cu câte 6 locuri pe nivel. Șoseta se pune pe nivelul 3, locul 3. Primele 2 tricouri vor fi atârnate la distanță 5 în colțurile uscătorului. Următoarele 2 tricouri pot fi puse numai la distanță 4.
Exemplul 2:
rufe.in
3476 53410 438 9217 1000000
rufe.out
45818
Exemplul 3:
rufe.in
1000000000 1000000000 1 1 7
rufe.out
1999999995
Exemplul 4:
rufe.in
654321 123456 5454 1212 10000000000
rufe.out
628395
Explicație
În acest caz Alex usucă 1010 tricouri. Acordați atenție citirii unei astfel de valori din fișier.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("rufe.in");
ofstream cout("rufe.out");
long long int n, m, a, b, k, v, stanga, dreapta, mij, d, sus, st, jos, dr, k1;
int main(){
cin >> n >> m >> a >> b >> k;
sus = a - 1;
st = b - 1;
jos = n - a;
dr = m - b;
stanga = 1;
dreapta = max(sus + st, max(st + jos, max(jos + dr, dr + sus)));
while(stanga <= dreapta){
mij = (stanga + dreapta) / 2;
d = mij - 1;
k1 = 2 * (d + 1) * d;
if(d > sus){
v = d - sus;
k1 = k1 - v * v;
}
if(d > st){
v = d - st;
k1 = k1 - v * v;
}
if(d > jos){
v = d - jos;
k1 = k1 - v * v;
}
if(d > dr){
v = d - dr;
k1 = k1 - v * v;
}
if(d > st + sus + 1){
v = d - st - sus - 1;
k1 = k1 + v * (v + 1) / 2;
}
if(d > st + jos + 1){
v = d - st - jos - 1;
k1 = k1 + v * (v + 1) / 2;
}
if(d > dr + jos + 1){
v = d - dr - jos - 1;
k1 = k1 + v * (v + 1) / 2;
}
if(d > dr + sus + 1){
v = d - dr - sus - 1;
k1 = k1 + v * (v + 1) / 2;
}
k1 = m * n - k1 - 1;
if(k1 < k)
dreapta = mij - 1;
else
stanga = mij + 1;
}
cout << dreapta;
return 0;
}