Submission #609043

#TimeUsernameProblemLanguageResultExecution timeMemory
609043jophyyjhPainting Squares (IOI20_squares)C++14
0 / 100
3 ms760 KiB
/** * I'm a bit disappointed. Since only k <= 10 can AC, i think the only solution would * be to use De Brujin Sequence. k = 10 is already the minimum since it's the * smallest positive int satisfying 2^k + k - 1 >= n. (I was looking for sth original * when I started this problem.) * * K: log_2(n) (as long as 2^k + k - 1 >= n) * Implementation 1 (Solves [S1-3], [S5], [S6]) */ #include <bits/stdc++.h> #include "squares.h" typedef std::vector<int> vec; const int K = 10; std::vector<vec> graph; vec path; void find_path(int k) { while (!graph[k].empty()) { int j = graph[k][graph[k].size() - 1]; graph[k].pop_back(); find_path(j); } path.push_back(k); } vec de_brujin(int k) { path.clear(); int n = 1 << (k - 1); graph.assign(n, vec()); for (int i = 0; i < n; i++) { int j = (i << 1) & ((1 << (k - 1)) - 1); graph[i].push_back(j); graph[i].push_back(j | 1); } find_path(0); std::reverse(path.begin(), path.end()); vec seq; for (int first = path[0]; first > 0; first >>= 1) seq.push_back(first & 1); std::reverse(seq.begin(), seq.end()); for (int i = 1; i < int(path.size()); i++) seq.push_back(path[i] & 1); return seq; } vec seq; vec paint(int n) { seq = de_brujin(K); while (int(seq.size()) > n) seq.pop_back(); seq.push_back(K); return seq; } int find_location(int n, vec c) { assert(int(c.size()) == K); int out_of_bound = 0; for (int i = K - 1; i >= 0 && c[i] == -1; i--) out_of_bound++; if (out_of_bound > 0) return n - (K - out_of_bound); for (int start = 0; start + K - 1 < n; start++) { bool equal = true; for (int i = 0; i < K && equal; i++) equal &= (seq[start + i] == c[i]); if (equal) return start; } return -1; // error }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...