제출 #262037

#제출 시각아이디문제언어결과실행 시간메모리
262037patrikpavic2Minerals (JOI19_minerals)C++17
70 / 100
43 ms2940 KiB
#include "minerals.h" #include <cstdio> #include <algorithm> #include <vector> #include <cstdlib> #define X first #define Y second #define PB push_back using namespace std; typedef long long ll; typedef pair < int, int > pii; const int N = 1e5 + 500; int kod[N], tp[N], P[N], ans[N]; int un[N], lst = 0, mks = 0, n; int pitaj(int x){ int nw = Query(x); int ret = abs(lst - nw); lst = nw; un[x] = !un[x]; return ret; } void pripremi(int l, int r, int raz){ if(l == r) return; mks = max(mks, raz); for(int i = l;i <= (l + r) / 2;i++) kod[i] += (1 << raz); pripremi(l, (l + r) / 2, raz + 1); pripremi((l + r) / 2 + 1, r, raz + 1); } void odradi(int red){ for(int i = 1;i <= 2 * n;i++){ if(!tp[i] && (un[i] ^ (!!(P[i] & (1 << red))))) pitaj(i); } for(int i = 1;i <= 2 * n;i++) if(tp[i]){ int odg = !pitaj(i); P[i] += odg * (1 << red); } } bool cmp(int x, int y){ return P[x] < P[y]; } void Solve(int nn) { n = nn; pripremi(0, n - 1, 0); int cur = 0; for(int i = 1;i <= 2 * n;i++){ tp[i] = pitaj(i); ans[i - 1] = i; if(!tp[i]) P[i] = kod[cur++]; } for(int i = 0;i <= mks;i++) odradi(i); sort(ans, ans + 2 * n, cmp); for(int i = 0;i < n;i++){ Answer(ans[2 * i], ans[2 * i + 1]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...