Səfərə!#11059

Səfərə! (Həll təhlili)

Tutaq ki, Smeşarik nöqtəsində yerləşir. O zaman saniyə ərzində o şəkildə göstərildiyi kimi rombun istənilən tam ədədi nöqtəsinə çata bilər.

Hər bir Smeşarik üçün müvafiq ölçüdə olan rombaların bir ortaq tam ədədi nöqtəyə malik olacağı ən kiçik təbii -ni tapmaq lazımdır. Üçüncü testi nəzərdən keçirək və t = 1, 2, 3 üçün üç Smeşarikə aid rombaları təsvir edək.

t = 3 halında smeşariklər, məsələn, və ya nöqtəsində qovuşa bilər.

Koordinat sistemini mənfi bucağı qədər qaynaq nöqtesindən döndərək şəkilləndirək. Bu çevirmədə rombalar kvadratlara çevriləcək. Çevirmə düsturlarını çıxaraq:

z' = ze^{-i\frac{\pi}{4}}

Və ya Dekart koordinatlarında:

x' + iy' = (x + iy) \cdot (\cos\left(\frac{\pi}{4}\right) - i\sin\left(\frac{\pi}{4}\right))
\begin{cases} x' = x\frac{\sqrt{2}}{2} + y\frac{\sqrt{2}}{2} \\ y' = -x\frac{\sqrt{2}}{2} + y\frac{\sqrt{2}}{2} \end{cases}

İrrasionalıqdan xilas olmaq üçün şəkili \sqrt{2} dəfə genişləndiririk. Bunun üçün aşağıdakı çevirmədən istifadə edək:

\begin{cases} x' = x + y \\ y' = -x + y \end{cases}

Üç nöqtəmizi çevirək:

Smeşariklərin çevrilmiş başlanğıc koordinatları olan bütün (x_i', y_i') nöqtələrini ehtiva edən düzbucaqlının koordinatlarını müəyyən edək. Mühayiyə edək:

Beləliklə, (min_x, min_y) və (max_x, max_y) əks künc nöqtələr olan düzbucaqlı bütün (x_i', y_i') nöqtələrini əhatə edəcəkdir. Hierbij is het de minimale oppervlakte van een rechthoek waarvan de zijden evenwijdig zijn met de coördinaatas.

In ons voorbeeld zal zo'n rechthoek (0, 0) - (6, 3) zijn.

Het verzamelpunt van de Smeşariks (res_x, res_y) zal het centrum van dit rechthoek zijn, oftewel het punt met coördinaten

(res_x, res_y) = \left(\frac{min_x + max_x}{2}, \frac{min_y + max_y}{2}\right)

Nu moeten we de minimale tijd vinden waarin alle Smeshari's hun punten (x_i', y_i') kunnen bereiken naar het punt (res_x, res_y). Voor de gedraaide diamant (vierkant in het nieuwe coördinatenstelsel) wordt de afstand van het punt (x_i', y_i') tot (res_x, res_y) berekend met de formule:

max( | x_i' - res_x |, | y_i' - res_y |)

Op deze manier kunnen alle Smeşariks zich in het punt (res_x, res_y) verzamelen in een tijd die gelijk is aan de maximale van deze afstanden:

\max_{1 \le i \le n}\left( max( | x_i' - res_x |, | y_i' - res_y |) \right)

Alqoritmin Hazırlanması

Çarpanla dəyişənini təyin edək.

typedef lon uzun ll;
#define INFL (ll)4e18

Giriş nöqtələrini massivində saxlayacağıq.

vektor<pair<ll, ll>> inp;

calc funksiyası ən uzaqda olan smeşarikdən nöqtəsinə qədər olan məsafəni hesablayır. Çevrilmiş smeşarik koordinatları massivində yer alır.

ll calc(ll x, ll y)
{
  ll res = 0;
  for (auto p : inp)
    res = max(res, max(abs(p.first - x), abs(p.second - y)));
  return res;
}

Proqramın əsas hissəsi. Giriş məlumatlarını oxuyuruq.

cin >> n;
minx = INFL; maxx = -INFL; miny = INFL; maxy = -INFL;
for (i = 0; i < n; i++)
{

Smeşariklərin başlanğıc koordinatları oxuyuruq. Koordinat müstəvisini bucağı qədər döndəririk və alınan koordinatları massivində saxlayırıq.

  cin >> x >> y;
  nx = x + y;
  ny = -x + y;
  inp.push_back({ nx, ny });

Bundan sonra smeşariklərin çevrilmiş koordinatları olan bütün (x_i', y_i') nöqtələrini ehtiva edən (min_x, min_y) və (max_x, max_y) əks künc nöqtələr olan düzbucaqlının koordinatlarını tapırıq.

  minx = min(minx, nx);
  maxx = max(maxx, nx);
  miny = min(miny, ny);
  maxy = max(maxy, ny);
}

Smeşariklərin toplanacağı nöqtəni (res_x, res_y) müəyyən edirik — bu cizgiliğın mərkəzi.

resx = (minx + maxx) / 2;
resy = (miny + maxy) / 2;

Bütün smeşariklərin öz nöqtələrindən (x_i', y_i') (res_x, res_y) nöqtəsinə çatması üçün lazım olan minimum vaxtı hesablayır və göstəririk.

ans = calc(resx, resy);
cout << ans << "\n";