Submission #564570

#TimeUsernameProblemLanguageResultExecution timeMemory
564570DanShadersBroken Device 2 (JOI22_device2)C++17
96 / 100
72 ms2996 KiB
//bs:sanitizers,flags:grader.cpp #include "Anna.h" #include "Bruno.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; namespace x = __gnu_pbds; template <typename T> using ordered_set = x::tree<T, x::null_type, less<T>, x::rb_tree_tag, x::tree_order_statistics_node_update>; template <typename T> using normal_queue = priority_queue<T, vector<T>, greater<>>; #define all(x) begin(x), end(x) #define sz(x) ((int) (x).size()) #define x first #define y second using ll = long long; using ld = long double; const int LEN = 145; bool inited = false; ll dp[LEN + 1]; int Declare() { if (inited) { return LEN; } inited = true; dp[1] = 1; for (int i = 3; i <= LEN; ++i) { dp[i] = dp[i - 2] + dp[i - 3]; } return LEN; } pair<vector<int>, vector<int>> Anna(ll n) { bool parity = n & 1; n /= 2; int len = 0; while (n >= dp[len]) { n -= dp[len]; ++len; } vector<int> u; while (len > 1) { if (n >= dp[len - 2]) { u.push_back(1); n -= dp[len - 2]; len -= 3; } else { u.push_back(0); len -= 2; } } // for (int x : u) { // cout << x << " "; // } // cout << endl; vector<int> s = {1}; for (int i : u) { if (i) { s.push_back(s.back() ^ 1); } s.push_back(s.back()); s.push_back(s.back()); } vector<int> t = {!parity}; while (sz(t) != sz(s)) { t.push_back(t.back() ^ 1); } // for (int x : s) { // cout << x << " "; // } // cout << endl; // for (int x : t) { // cout << x << " "; // } // cout << endl; if (parity) { for (int &u : s) { u ^= 1; } } return {s, t}; } vector<pair<int, int>> path; #define TRY(x) do { if (x) { return true; }} while (false); int n; bool recover(const vector<int> &a, int i, int tlen, int cnt) { if (i == sz(a)) { return tlen == n && !cnt; } if (tlen > n) { return false; } if (a[i] != (tlen & 1)) { TRY(recover(a, i + 1, tlen + 1, cnt)); } if (cnt) { if (path.back().x != a[i]) { return false; } TRY(recover(a, i + 1, tlen, cnt - 1)); } else { int prv = 1; if (sz(path)) { prv = path.back().x; } path.push_back({a[i], a[i] != prv}); TRY(recover(a, i + 1, tlen, a[i] == prv ? 1 : 2)); path.pop_back(); } return false; } ll Bruno(vector<int> a) { int parity = !a[0]; if (parity) { for (int &x : a) { x ^= 1; } } Declare(); n = sz(a) / 2; path.clear(); // for (int x : a) { // cout << x << " "; // } // cout << endl; if (!recover(a, 1, 0, 0)) { path.push_back({1, -1}); assert(recover(a, 0, 0, 1)); path.erase(path.begin()); } // for (auto [_, x] : path) { // cout << x << " "; // } // cout << endl; ll ans = 0; for (int i = 0; i < n; ++i) { ans += dp[i]; } for (int i = 0; n > 1; ++i) { if (path[i].y) { ans += dp[n - 2]; n -= 3; } else { n -= 2; } } return ans * 2 + parity; }
//bs:sanitizers,flags:grader.cpp #include "Anna.h" #include "Bruno.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; namespace x = __gnu_pbds; template <typename T> using ordered_set = x::tree<T, x::null_type, less<T>, x::rb_tree_tag, x::tree_order_statistics_node_update>; template <typename T> using normal_queue = priority_queue<T, vector<T>, greater<>>; #define all(x) begin(x), end(x) #define sz(x) ((int) (x).size()) #define x first #define y second using ll = long long; using ld = long double; const int LEN = 145; bool inited = false; ll dp[LEN + 1]; int Declare() { if (inited) { return LEN; } inited = true; dp[1] = 1; for (int i = 3; i <= LEN; ++i) { dp[i] = dp[i - 2] + dp[i - 3]; } return LEN; } pair<vector<int>, vector<int>> Anna(ll n) { bool parity = n & 1; n /= 2; int len = 0; while (n >= dp[len]) { n -= dp[len]; ++len; } vector<int> u; while (len > 1) { if (n >= dp[len - 2]) { u.push_back(1); n -= dp[len - 2]; len -= 3; } else { u.push_back(0); len -= 2; } } // for (int x : u) { // cout << x << " "; // } // cout << endl; vector<int> s = {1}; for (int i : u) { if (i) { s.push_back(s.back() ^ 1); } s.push_back(s.back()); s.push_back(s.back()); } vector<int> t = {!parity}; while (sz(t) != sz(s)) { t.push_back(t.back() ^ 1); } // for (int x : s) { // cout << x << " "; // } // cout << endl; // for (int x : t) { // cout << x << " "; // } // cout << endl; if (parity) { for (int &u : s) { u ^= 1; } } return {s, t}; } vector<pair<int, int>> path; #define TRY(x) do { if (x) { return true; }} while (false); int n; bool recover(const vector<int> &a, int i, int tlen, int cnt) { if (i == sz(a)) { return tlen == n && !cnt; } if (tlen > n) { return false; } if (a[i] != (tlen & 1)) { TRY(recover(a, i + 1, tlen + 1, cnt)); } if (cnt) { if (path.back().x != a[i]) { return false; } TRY(recover(a, i + 1, tlen, cnt - 1)); } else { int prv = 1; if (sz(path)) { prv = path.back().x; } path.push_back({a[i], a[i] != prv}); TRY(recover(a, i + 1, tlen, a[i] == prv ? 1 : 2)); path.pop_back(); } return false; } ll Bruno(vector<int> a) { int parity = !a[0]; if (parity) { for (int &x : a) { x ^= 1; } } Declare(); n = sz(a) / 2; path.clear(); // for (int x : a) { // cout << x << " "; // } // cout << endl; if (!recover(a, 1, 0, 0)) { path.push_back({1, -1}); assert(recover(a, 0, 0, 1)); path.erase(path.begin()); } // for (auto [_, x] : path) { // cout << x << " "; // } // cout << endl; ll ans = 0; for (int i = 0; i < n; ++i) { ans += dp[i]; } for (int i = 0; n > 1; ++i) { if (path[i].y) { ans += dp[n - 2]; n -= 3; } else { n -= 2; } } return ans * 2 + parity; }
#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...