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.000
1 ≤ A ≤ N
1 ≤ B ≤ M
1 ≤ K ≤ N * M – 1
- Pentru teste în valoare de
13
puncte se garantează căN, M ≤ 1.000
. - Pentru alte teste în valoare de
12
puncte se garantează căN ≤ 1.000.000
. - Pentru alte teste în valoare de
12
puncte se garantează căM ≤ 1.000.000
. - Pentru alte teste în valoare de
18
puncte se garantează căK ≤ 1.000.000
. - Pentru alte teste în valoare de
7
puncte 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ă 10
10
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; }