Submission #1324117

#TimeUsernameProblemLanguageResultExecution timeMemory
1324117sh_qaxxorov_571Xylophone (JOI18_xylophone)C++20
0 / 100
1 ms400 KiB
#include <bits/stdc++.h> using namespace std; // Grader tomonidan taqdim etiladigan funksiyalar int query(int s, int t); // s..t oralig'idagi max-min farqini qaytaradi void answer(int i, int a); // i-chi barni a balandlikda deb javob beradi void solve(int N) { vector<int> pos(N+1, -1); // balandlik bo'yicha index saqlaymiz vector<int> bar(N+1, 0); // index bo'yicha balandlik // Eng past (1) va eng yuqori (N) barlarni topamiz int l = 1, r = N; while(l < r) { int diff = query(l, r); if(diff == N-1) break; // Agar farq kam bo'lsa, segmentni qisqartiramiz int mid = (l+r)/2; int left_diff = query(l, mid); if(left_diff == mid-l) r = mid; else l = mid+1; } // Eng past balandlik = 1, eng yuqori balandlik = N int min_pos = l; int max_pos = r; pos[1] = min_pos; pos[N] = max_pos; bar[min_pos] = 1; bar[max_pos] = N; // Qolgan balandliklarni aniqlash set<int> remaining; for(int i=1; i<=N; i++) { if(i != min_pos && i != max_pos) remaining.insert(i); } // Segmentlarni bo'lib, binary search bilan aniqlash function<void(int,int,int,int)> dfs = [&](int l, int r, int low, int high) { if(l > r || low+1 == high) return; int mid_val = (low+high)/2; int left_diff = query(l, r); // left_diff yordamida qaysi bar yuqoriroq yoki pastroq ekanini aniqlash vector<int> new_remaining; for(int i : remaining) { int d = max(high, i) - min(low, i); if(d == left_diff) new_remaining.push_back(i); } // Recursive chaqirish for(int val : new_remaining) { bar[val] = val; pos[val] = val; // soddalashtirilgan misol uchun remaining.erase(val); } }; dfs(1,N,1,N); // Javobni beramiz for(int i=1; i<=N; i++) { answer(i, bar[i]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...