Submission #387140

#TimeUsernameProblemLanguageResultExecution timeMemory
387140milleniumEeeePainting Walls (APIO20_paint)C++17
28 / 100
1531 ms2796 KiB
#include <bits/stdc++.h> #include "paint.h" //#include "grader.cpp" #define chkmin(a, b) a = min(a, b) #define chkmax(a, b) a = max(a, b) #define all(s) s.begin(), s.end() #define szof(s) (int)s.size() using namespace std; const int MAXN = (int)1e5 + 5; const int INF = 1e9 + 7; int exist[MAXN]; int dp[MAXN]; int pref[MAXN]; struct Segment_Tree { vector <int> tree; vector <int> lazy; Segment_Tree (int n) { tree.resize(n * 4, INF); lazy.resize(n * 4, INF); } void push(int v, int tl, int tr) { if (lazy[v] == INF) { return; } if (tl != tr) { chkmin(lazy[v + v], lazy[v]); chkmin(lazy[v + v + 1], lazy[v]); } chkmin(tree[v], lazy[v]); lazy[v] = INF; } void upd(int l, int r, int val, int v, int tl, int tr) { push(v, tl, tr); if (l > tr || tl > r) { return; } if (l <= tl && tr <= r) { lazy[v] = val; push(v, tl, tr); return; } int mid = (tl + tr) >> 1; upd(l, r, val, v + v, tl, mid); upd(l, r, val, v + v + 1, mid + 1, tr); tree[v] = min(tree[v + v], tree[v + v + 1]); } int get(int l, int r, int v, int tl, int tr) { push(v, tl, tr); if (l > tr || tl > r) { return INF; } if (l <= tl && tr <= r) { return tree[v]; } int mid = (tl + tr) >> 1; return min(get(l, r, v + v, tl, mid), get(l, r, v + v + 1, mid + 1, tr)); } }; int minimumInstructions(int N, int M, int K, vector<int> C, vector<int> A, vector<vector<int>> B) { memset(exist, -1, sizeof(exist)); for (int i = 0; i < M; i++) { sort(all(B[i])); for (int el : B[i]) { exist[el] = i; } } for (int i = 0; i < N; i++) { if (exist[C[i]] == -1) { return -1; } } auto nxt = [&](int p) { if (p + 1 < M) { return p + 1; } else { return 0; } }; auto can = [&](int l, int r) { for (int x = 0; x < M; x++) { bool ok = 1; int step = 0; int pos = x; while (1) { ok &= (binary_search(all(B[pos]), C[l + step])); step++; pos = nxt(pos); if (step == M) { break; } } if (ok) { return true; } } return false; }; fill(dp, dp + MAXN, INF); Segment_Tree T(N); if (can(0, M - 1)) { T.upd(0, M - 1, 1, 1, 0, N - 1); } for (int i = M; i < N; i++) { if (can(i - M + 1, i)) { int best = T.get(i - M, i - 1, 1, 0, N - 1); T.upd(i - M + 1, i, best + 1, 1, 0, N - 1); } } if (T.get(N - 1, N - 1, 1, 0, N - 1) < INF) { return T.get(N - 1, N - 1, 1, 0, N - 1); } else { return -1; } } /* 5 3 10 0 2 1 4 3 2 0 4 2 3 2 1 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...