제출 #21554

#제출 시각아이디문제언어결과실행 시간메모리
21554UshioBroken Device (JOI17_broken_device)C++14
85 / 100
72 ms4644 KiB
#include "Annalib.h" #include <algorithm> #include <iostream> #include <cstdlib> #include <vector> using namespace std; const int FCT = 2; int bitCount(int64_t x) { int ret = 0; while (x) { ++ret; x &= x - 1; } return ret; } void Anna( int N, long long X, int K, int P[] ){ vector<int> per(N + FCT); srand(141417941L); for (int i = 0; i < N + FCT; ++i) { per[i] = i; } for (int i = 0; i < N; ++i) { int pos = i + rand() % (N - i); swap(per[i], per[pos]); } int bit = 0; int validity = 0; vector<bool> bad(N + FCT, false); for (int i = 0; i < FCT; ++i) { bad[per[N + i]] = true; } for (int i = 0; i < K; ++i) { bad[P[i]] = true; } int op = bitCount(X) > 30; bool modeSet = false; for (int i = 0; i < N; ++i) { if (validity == 0) { if (modeSet) { bool ok = bad[per[i]]; for (int j = 1; j <= FCT; ++j) { ok |= bad[per[i + j]] && bit + j - 1 <= 59 && ((X & (1LL << (bit + j - 1))) > 0) != op; } if (ok) { Set(per[i], 0); validity = 0; } else { Set(per[i], 1); validity = FCT; } } else { if (bad[per[i]] || (bad[per[i + 1]] && op == 1)) { Set(per[i], 0); validity = 0; } else { Set(per[i], 1); validity = 1; } } } else { if (modeSet) { if (bit <= 59) { if (X & (1LL << bit)) { Set(per[i], 1 ^ op); } else { Set(per[i], op); } bit++; } else { Set(per[i], op); } validity--; } else { Set(per[i], op); modeSet = true; validity = 0; } } } cerr << "In: " << X << endl; }
#include "Brunolib.h" #include <algorithm> #include <iostream> #include <cstdlib> #include <vector> using namespace std; const int FCT = 2; long long Bruno( int N, int A[] ){ vector<int> per(N + 1); srand(141417941L); for (int i = 0; i < N + 1; ++i) { per[i] = i; } for (int i = 0; i < N; ++i) { int pos = i + rand() % (N - i); swap(per[i], per[pos]); } int validity = 0; int bit = 0; int64_t ans = 0; bool modeSet = false; int op; for (int i = 0; i < N; ++i) { if (validity == 0) { if (modeSet) { validity = A[per[i]] * FCT; } else { validity = A[per[i]]; } } else { if (modeSet) { if (bit <= 59) { ans |= ((int64_t) A[per[i]] ^ op) << bit; ++bit; } validity--; } else { op = A[per[i]]; modeSet = true; validity = 0; } } } cerr << "Out: " << ans << endl; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...