Skip to content

Commit 2c82e86

Browse files
committed
Dodano rozwiązanie zadania 'Przesunięcie cykliczne' z XXVI OI
1 parent 665024a commit 2c82e86

File tree

1 file changed

+62
-0
lines changed
  • rozwiazania/xxvi/etap2/dzien2/cyk

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Rozwiązanie zadania 'Przesunięcie cykliczne' z II etapu XXV OI.
2+
// Autor rozwiązania: Paweł Putra
3+
// Złożoność czasowa: O(log(n)))
4+
// Złożoność pamięciowa: O(1)
5+
// Ilość zapytań: 2 * log_2(n) + 2
6+
// Punkty: 100 (upsolve)
7+
8+
#include <stdlib.h>
9+
#include "cyklib.hpp"
10+
#define dbg(x) #x << " = " << x << " "
11+
using namespace std;
12+
using ll = long long;
13+
14+
ll teraz;
15+
16+
ll pytaj(int k) {
17+
teraz = circular_shift(k);
18+
return teraz;
19+
}
20+
21+
22+
void odpowiadaj(int n) {
23+
ll przed = teraz;
24+
ll po = pytaj(n);
25+
if (przed == po) {
26+
give_answer(n);
27+
exit(0);
28+
}
29+
}
30+
31+
bool mniej_niz_pol(int k) {
32+
ll a = teraz;
33+
ll b = pytaj(k);
34+
if (b == a) odpowiadaj(k);
35+
ll c = pytaj(k);
36+
if (c == a) odpowiadaj(2 * k);
37+
38+
int inwersje = (a > b) + (a > c) + (b > c);
39+
return inwersje % 2 == 0;
40+
}
41+
42+
int32_t main() {
43+
// Dobrze jest wiedzieć z czego zaczynamy.
44+
ll start = pytaj(0);
45+
pytaj(1);
46+
if (teraz == start) odpowiadaj(1);
47+
48+
int lo = 1;
49+
while (mniej_niz_pol(lo * 2)) lo *= 2;
50+
51+
int hi = 2 * lo;
52+
while (lo < hi) {
53+
int mid = (lo + hi + 1) / 2;
54+
if (mniej_niz_pol(mid)) lo = mid;
55+
else hi = mid - 1;
56+
}
57+
58+
// Zostały tylko dwie opcje na odpowiedź.
59+
odpowiadaj(2 * lo);
60+
odpowiadaj(2 * lo + 1);
61+
}
62+

0 commit comments

Comments
 (0)