제출 #588552

#제출 시각아이디문제언어결과실행 시간메모리
588552MilosMilutinovic벽 칠하기 (APIO20_paint)C++14
0 / 100
1 ms468 KiB
/** * author: wxhtzdy * created: 03.07.2022 14:53:44 **/ #include <bits/stdc++.h> using namespace std; string to_string(string s) { return '"' + s + '"'; } string to_string(const char* s) { return to_string((string) s); } string to_string(bool b) { return (b ? "true" : "false"); } template <typename A, typename B> string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } template <typename A> string to_string(A v) { bool first = true; string res = "{"; for (const auto &x : v) { if (!first) { res += ", "; } first = false; res += to_string(x); } res += "}"; return res; } void debug_out() { cerr << endl; } template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << to_string(H); debug_out(T...); } #ifdef LOCAL #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) #else #define debug(...) 42 #endif const int inf = (int) 1e6; template <typename T> class fenwick { public: vector<T> fenw; int n; fenwick(int _n) : n(_n) { fenw.resize(n); } void modify(int x, T v) { while (x < n) { fenw[x] += v; x |= (x + 1); } } T get(int x) { T v{}; while (x >= 0) { v += fenw[x]; x = (x & (x + 1)) - 1; } return v; } }; struct node { int a = inf; // don't forget to set default value inline void operator += (node &other) { a = min(a, other.a); } }; int minimumInstructions(int n, int m, int k, vector<int> c, vector<int> a, vector<vector<int>> b) { vector<vector<int>> ids(k); for (int i = 0; i < m; i++) { for (int j = 0; j < a[i]; j++) { ids[b[i][j]].push_back(i); } } vector<int> len(m); vector<bool> is(n); for (int i = 0; i < n; i++) { vector<int> vec; for (int j : ids[c[i]]) { vec.push_back(len[(j - 1 + m) % m] + 1); } assert(!vec.empty()); if (i > 0) { for (int j : ids[c[i - 1]]) { len[j] = 0; } } for (int j = 0; j < (int) vec.size(); j++) { len[ids[c[i]][j]] = vec[j]; } is[i] = (*max_element(vec.begin(), vec.end()) >= m); } vector<int> dp(n, inf); fenwick<node> fenw(n); for (int i = m - 1; i < n; i++) { if (is[i]) { if (i == m - 1) { dp[i] = 1; } else { for (int j = i - m + 1; j <= i; j++) { dp[i] = min(dp[i], dp[j - 1] + 1); } } } fenw.modify(n - i + 1, {dp[i]}); } if (dp[n - 1] >= inf) { return -1; } else { return dp[n - 1]; } }
#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...