File tree Expand file tree Collapse file tree 1 file changed +62
-0
lines changed
rozwiazania/xxvi/etap2/dzien2/cyk Expand file tree Collapse file tree 1 file changed +62
-0
lines changed Original file line number Diff line number Diff line change 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+
You can’t perform that action at this time.
0 commit comments