Submission #1186264

#TimeUsernameProblemLanguageResultExecution timeMemory
1186264KK_1729Painting Walls (APIO20_paint)C++20
100 / 100
847 ms408636 KiB
#include "paint.h" #include <vector> #include <bits/stdc++.h> using namespace std; #define pb push_back int min(int x, int y){ if (x < y) return x; return y; } struct Segtree{ vector<int> tree; int N; Segtree(int n){ while (__builtin_popcount(n) != 1) n++; this->N = n; tree.resize(2*N+10, 1e9); } void update(int v, int tl, int tr, int pos, int x){ // if (pos < tl || pos > tr) return; if (tl == tr && tl == pos){ tree[v] = x; return; } int mid = (tl+tr)/2; if (pos <= mid) update(2*v, tl, mid, pos, x); else update(2*v+1, mid+1, tr, pos, x); tree[v] = min(tree[v*2], tree[v*2+1]); } int query(int v, int tl, int tr, int l, int r){ if (l > tr || r < tl) return 1e9; if (l <= tl && r >= tr) return tree[v]; int mid = (tl+tr)/2; return min(query(v*2, tl, mid, l, r), query(v*2+1, mid+1, tr, l, r)); } void u(int pos, int x){ update(1, 0, N-1, pos, x); } int q(int l, int r){ return query(1, 0, N-1, l, r); } }; void printVector(vector<int> a){ for (auto x: a) cout << x << " "; cout << endl; } int minimumInstructions( int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) { vector<vector<int>> colour(K+5); for (int i = 0; i < N; ++i){ colour[C[i]].pb(i); } vector<vector<int>> o(N); vector<int> f(K+5); for (int i = 0; i < M; i++){ for (auto x: B[i]){ f[x]++; for (auto item: colour[x]){ o[item].pb(i); } } } vector<int> dp1(M, -1), dp2(M, -1); for (auto x: o[N-1]) dp2[x] = N-1; vector<int> P(N+5); if (M == 1){ if (f[C[N-1]] > 0) P[N-1] = 1; } // vector<int> there(M); // for (auto x: o[N-1]) there[] for (int i = N-2; i >= 0; i--){ for (auto x: o[i]){ if (dp2[(x+1)%M] >= 0) dp1[x] = dp2[(x+1)%M]; else dp1[x] = i; if (dp1[x] - i >= M-1) P[i] = 1; } swap(dp1, dp2); for (auto x: o[i+1]) dp1[x] = -1; } int ans = 0; vector<int> dp(N+5, 1e9); Segtree seg(N+1); seg.u(N, 0); for (int i = N-1; i >= 0; i--){ if (N-i >= M){ // cout << i << endl; if (P[i] == 1){ int o = 1e9; dp[i] = 1+seg.q(i+1, i+M); seg.u(i, dp[i]); } } } // printVector(P); // printVector(dp); if (dp[0] < 1e9) return dp[0]; return -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...