Submission #1175640

#TimeUsernameProblemLanguageResultExecution timeMemory
1175640Zero_OPAncient Machine (JOI21_ancient_machine)C++20
0 / 100
5 ms584 KiB
#include "Anna.h" #include <bits/stdc++.h> using namespace std; #define FOR(i, l, r) for(int i = (l); i < (r); ++i) #define ROF(i, r, l) for(int i = (r)-1; i >= (l); --i) #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) #define sz(v) (int)v.size() #define pb push_back #define eb emplace_back #define compact(v) v.erase(unique(all(v)), end(v)) #define mp make_pair #define mt make_tuple #define ff first #define ss second #define dbg(x) "[" #x " = " << (x) << "]" template<typename T> bool minimize(T& a, const T& b){ if(a > b) return a = b, true; return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; using db = double; using ld = long double; using ull = unsigned long long; using pi = pair<int, int>; using pl = pair<ll, ll>; using vi = vector<int>; using vl = vector<ll>; using vd = vector<db>; using vc = vector<char>; using vb = vector<bool>; /* [fib[T+2] = 1293530146158671551] [T = 90] [bits = 62] [cost = 67832] */ void Anna(int N, std::vector<char> S) { int f = -1; FOR(i, 0, N){ if(S[i] == 'X'){ f = i; break; } } if(f == -1){ Send(0); return; } //special case int nf = f; while(nf + 1 < N && S[nf + 1] == 'Z') ++nf; vb target(N); target[f] = true; FOR(i, nf+1, N){ if(S[i] == 'Z'){ target[i] = true; while(i + 1 < N && S[i+1] == 'Z') ++i; } } vl fib(100); fib[0] = 1, fib[1] = 2, fib[2] = 3; FOR(i, 3, 91) fib[i] = fib[i-2] + fib[i-1]; //check again if there is a 11 FOR(i, 1, N){ if(target[i-1] && target[i]){ cout << "Failed Transmittion\n"; return; } } // cout << "Anna Send : \n"; // FOR(i, 0, N) cout << target[i] << ' '; cout << '\n'; for(int l = 0; l < N; l += 90){ int r = min(N, l + 90); ll sum = 0; FOR(i, l, r){ if(target[i]) sum += fib[i - l]; } // cout << "send : " << dbg(sum) << '\n'; assert(sum < (1LL << 62)); FOR(i, 0, 62){ Send(sum >> i & 1); } ll re = 0; FOR(i, 0, 62){ if(sum >> i & 1) re += (1LL << i); // cout << re << '\n'; } assert(re == sum); // cout << '\n'; } if(nf != f){ FOR(i, 0, 17) Send(nf >> i & 1); } else{ FOR(i, 0, 17) Send(1); //assume that if nf > N <=> no Z next to the first X from the right } }
#include "Bruno.h" #include <bits/stdc++.h> using namespace std; #define FOR(i, l, r) for(int i = (l); i < (r); ++i) #define ROF(i, r, l) for(int i = (r)-1; i >= (l); --i) #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) #define sz(v) (int)v.size() #define pb push_back #define eb emplace_back #define compact(v) v.erase(unique(all(v)), end(v)) #define mp make_pair #define mt make_tuple #define ff first #define ss second #define dbg(x) "[" #x " = " << (x) << "]" template<typename T> bool minimize(T& a, const T& b){ if(a > b) return a = b, true; return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; using db = double; using ld = long double; using ull = unsigned long long; using pi = pair<int, int>; using pl = pair<ll, ll>; using vi = vector<int>; using vl = vector<ll>; using vd = vector<db>; using vc = vector<char>; using vb = vector<bool>; /* [fib[T+2] = 1293530146158671551] [T = 90] [bits = 62] [cost = 67832] */ mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); void Bruno(int N, int L, std::vector<int> A) { if(L == 1){ FOR(i, 0, N){ Remove(i); } return; } vb target(N); vl fib(100); fib[0] = 1, fib[1] = 2, fib[2] = 3; FOR(i, 3, 91) fib[i] = fib[i-1] + fib[i-2]; int nBlocks = L / 62; FOR(i, 0, nBlocks){ int l = i * 62, r = (i+1) * 62; int lo = i * 90; ll sum = 0; FOR(i, l, r){ if(A[i]) { sum += (1LL << (i - l)); // cout << dbg(sum) << '\n'; } } // cout << '\n'; // cout << "receive: " << dbg(sum) << '\n'; for(int i = 90; i >= 0; --i){ if(sum >= fib[i]){ sum -= fib[i]; target[i + lo] = true; } } } // cout << "Bruno Receive : \n"; // FOR(i, 0, N) cout << target[i] << ' '; cout << '\n'; int tmp = nBlocks * 62, pos = 0; FOR(i, 0, 17){ if(A[i + tmp]) pos |= (1 << i); } int fst = -1, lst = -1; FOR(i, 0, N){ if(target[i] && fst == -1){ fst = i; } if(target[i]) lst = i; } vi perm; FOR(i, 0, fst) perm.pb(i); ROF(i, N, lst+1) perm.pb(i); int old = -1; if(pos < N){ //exist special case old = fst; fst = pos; FOR(i, old+1, fst+1) perm.pb(i); } int last = fst; // cout << lst << '\n'; FOR(i, fst+1, lst+1){ // cout << dbg(i) << dbg(target[i]) << '\n'; if(target[i]){ // cout << last+1 << ' ' << i-1 << '\n'; ROF(j, i, last+1) perm.pb(j); perm.pb(i); last = i; } } if(old != -1) perm.pb(old); else perm.pb(fst); // cout << sz(perm) << '\n'; // for(auto it : perm) cout << it << ' '; cout << '\n'; // assert(sz(perm) == N); for(auto it : perm) Remove(it); } // g++ -o grader grader.cpp Anna.cpp Bruno.cpp // if ($?) { g++ -o grader grader.cpp Anna.cpp Bruno.cpp } ; if ($?) { .\grader }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...