제출 #627710

#제출 시각아이디문제언어결과실행 시간메모리
627710MilosMilutinovicBroken Device (JOI17_broken_device)C++14
65 / 100
39 ms2416 KiB
#include "Annalib.h" #include <bits/stdc++.h> #define rep(i, n) for(int i = 0; i < (int)(n); i ++) #define rep1(i, n) for(int i = 1; i <= (int)(n); i ++) #define MP make_pair using namespace std; typedef long long LL; typedef pair<int, int> PII; vector<int> ord = {138,6,105,87,111,3,123,63,141,36,66,54,30,45,129,147,27,84,135,24,12,21,57,126,102,9,75,144,99,117,96,18,132,69,42,114,0,93,108,120,60,72,90,33,48,81,39,78,51,15}; bool broken[150]; void Anna(int N, long long X, int K, int P[]) { rep(i, 150) broken[i] = false; rep(i, K) broken[P[i]] = true; LL pw = 1; while(pw + pw <= X) pw *= 3; vector<int> bits; while(X > 0) { int cc = 0; while(X >= pw) cc ++, X -= pw; bits.push_back(cc); pw /= 3; } while(pw > 0) { bits.push_back(0); pw /= 3; } reverse(bits.begin(), bits.end()); while(bits.back() == 0) bits.pop_back(); int ptr = 0; for(int i : ord) { int sum = 0; if(!broken[i + 0]) sum ++; if(!broken[i + 1]) sum ++; if(!broken[i + 2]) sum ++; if(ptr >= (int) bits.size() || sum == 0) { Set(i + 0, 0); Set(i + 1, 0); Set(i + 2, 0); continue; } if(bits[ptr] == 0) { if(!broken[i + 0]) { Set(i + 0, 1); Set(i + 1, 0); Set(i + 2, 0); ptr ++; continue; } if(!broken[i + 1] && !broken[i + 2]) { Set(i + 0, 0); Set(i + 1, 1); Set(i + 2, 1); ptr ++; continue; } Set(i + 0, 0); Set(i + 1, 0); Set(i + 2, 0); continue; } if(bits[ptr] == 1) { if(!broken[i + 1]) { Set(i + 0, 0); Set(i + 1, 1); Set(i + 2, 0); ptr ++; continue; } if(!broken[i + 0] && !broken[i + 2]) { Set(i + 0, 1); Set(i + 1, 0); Set(i + 2, 1); ptr ++; continue; } Set(i + 0, 0); Set(i + 1, 0); Set(i + 2, 0); continue; } if(bits[ptr] == 2) { if(!broken[i + 2]) { Set(i + 0, 0); Set(i + 1, 0); Set(i + 2, 1); ptr ++; continue; } if(!broken[i + 0] && !broken[i + 1]) { Set(i + 0, 1); Set(i + 1, 1); Set(i + 2, 0); ptr ++; continue; } Set(i + 0, 0); Set(i + 1, 0); Set(i + 2, 0); continue; } ptr ++; } }
#include "Brunolib.h" #include <bits/stdc++.h> using namespace std; vector<int> ord = {138,6,105,87,111,3,123,63,141,36,66,54,30,45,129,147,27,84,135,24,12,21,57,126,102,9,75,144,99,117,96,18,132,69,42,114,0,93,108,120,60,72,90,33,48,81,39,78,51,15}; long long Bruno(int N, int A[]) { long long X = 0, pw = 1; for(int i : ord) { int sum = A[i] + A[i + 1] + A[i + 2]; for(int j = 0; j < 3; j++) { if(sum == 1 && A[i + j] == 1) { X += pw * j; pw *= 3; } if(sum == 2 && A[i + j] == 0) { X += pw * j; pw *= 3; } } } return X; }
#Verdict Execution timeMemoryGrader output
Fetching results...