Submission #1169212

#TimeUsernameProblemLanguageResultExecution timeMemory
1169212aentrenusPainting Squares (IOI20_squares)C++20
45 / 100
30 ms420 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; using ull = unsigned long long; using vi = vector<int>; using vl = vector<ll>; using vb = vector<bool>; using pii = pair<int, int>; using pll = pair<ll, ll>; using str = string; #define all(a) a.begin(), a.end() #define print(a) for (auto elem:a) cout<<elem<<' '; cout<<'\n' #define segprep(b) resize(1<<((int)ceil(log2(b.size()))+1)) #define FOR(a) for (int _ = 0; _ < a; _++) const int k = 69, sect_size = 27; vi paint(int n) { vi labels(n+1, 0); labels.back() = k; int sect_cnt = n/sect_size; for (int section = 0; section < sect_cnt; section++){ int sect_start = 27*section; for (int i = sect_start+6; i < sect_start+6+7; i++){ labels.at(i) = 1; } // 7 bitow bialych for (int i = sect_start+6+7+7; i < sect_start+6+7+7+7; i++){ labels.at(i) = 1; } for (int i = 0; i < 6; i++){ labels.at(sect_start+i) = (bool)(section&(1<<i)); } } fill(labels.begin()+sect_size*sect_cnt, labels.end()-1, 1); return labels; } int find_location(int n, vi c) { // assert((int)c.size() == k); ////////////////////// if (find(all(c), -1) != c.end()){ return n-(find(all(c), -1)-c.begin()); } int seven_zeros_start; bool found; for (int i = 0; i < k-7; i++){ found = true; for (int j = i; j < i+7; j++){ if (c.at(j) != 0){ found = false; break; } } if (found){ seven_zeros_start = i; break; } } int ind_num_start = seven_zeros_start+14; int section = 0; for (int i = 0; i < 6; i++){ if (c.at(i+ind_num_start)){ section += 1<<i; } } int real_num_start = section*27; return real_num_start-ind_num_start; } /* static int max_k = 0; static int r, n, k_, q, x; static std::vector<int> labels, c, answers; int main() { assert(scanf("%d", &r) == 1); for (int tc = 0; tc < r; tc++) { assert(scanf("%d%d", &n, &q) == 2); labels = paint(n); if ((int)labels.size() != n + 1) { printf("Number of labels not equal to %d\n", n + 1); exit(0); } for (int i = 0; i < n; i++) { if (labels[i] != 0 && labels[i] != 1) { printf("Label not 0 or 1\n"); exit(0); } } k_ = labels[n]; if (k_ < 0 || k_ > 1000) { printf("Label not in range 0 to 1000\n"); exit(0); } if (k > max_k) { max_k = k_; } for (int i = 0; i < q; i++) { assert(scanf("%d", &x) == 1); c.clear(); for (int j = x; j < x + k_; j++) { if (j >= n) { c.push_back(-1); } else { c.push_back(labels[j]); } } answers.push_back(find_location(n, c)); } } printf("%d\n", max_k); for (int ans : answers) { printf("%d\n", ans); } exit(0); } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...