Submission #1159077

#TimeUsernameProblemLanguageResultExecution timeMemory
1159077Zero_OPPainting Walls (APIO20_paint)C++20
63 / 100
1600 ms294260 KiB
#include <bits/stdc++.h> #ifndef LOCAL #include "paint.h" #endif using namespace std; #define FOR(i, l, r) for(int i = (l); i < (r); ++i) #define ROF(i, r, l) for(int i = (r) - 1; i >= (l); --i) #define mp make_pair #define mt make_tuple #define ff first #define ss second #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) #define sz(v) (int)v.size() #define compact(v) v.erase(unique(all(v)), end(v)) #define pb push_back #define eb emplace_back #define dbg(x) "[" #x " = " << (x) << "]" #define readFile(task) freopen(task, "r", stdin) #define writeFile(task) freopen(task, "w", stdout) template<typename T> bool minimize(T& a, const T& b){ if(a > b) return a = b, true; return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; using db = double; using ull = unsigned long long; using ld = long double; using pi = pair<int, int>; using pl = pair<ll, ll>; using pd = pair<db, db>; using vi = vector<int>; using vl = vector<ll>; using vd = vector<db>; using vb = vector<bool>; using vpi = vector<pi>; using vpl = vector<pl>; using vvi = vector<vi>; using vvl = vector<vl>; int minimumInstructions(int N, int M, int K, vi C, vi A, vvi B){ vi can(N); vvi have(K); FOR(i, 0, M){ sort(all(B[i])); compact(B[i]); A[i] = sz(B[i]); for(auto c : B[i]) have[c].pb(i); } vector<vpi> dps(N); auto evaluate = [&](int i, int x) -> int{ auto it = lower_bound(all(dps[i]), mp(x, 0)); if(it == dps[i].end() || it->ff != x) return 0; return it->ss; }; FOR(i, 0, N){ for(auto pos : have[C[i]]){ int f = (i > 0 ? evaluate(i-1, pos-1) : 0) + 1; dps[i].eb(pos, f); int g = (i > 0 ? evaluate(i-1, pos+M-1) : 0) + 1; dps[i].eb(pos+M, g); if(f >= M) can[i-M+1] = 1; if(g >= M) can[i-M+1] = 1; } sort(all(dps[i])); } int cnt = 0; int need = 0, longest = -100; FOR(i, 0, N){ if(can[i]) maximize(longest, i + M - 1); if(i == need){ if(longest < i) return -1; ++cnt; need = longest+1; } } return cnt; } #ifdef LOCAL void setIO(){ // ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL readFile("task.inp"); // writeFile("task.out"); #endif // LOCAL } int main(){ setIO(); int N, M, K; cin >> N >> M >> K; vi C(N); FOR(i, 0, N) cin >> C[i]; vi A(M); vector<vi> B(M); FOR(i, 0, M){ cin >> A[i]; B[i].resize(A[i]); FOR(j, 0, A[i]){ cin >> B[i][j]; } } cout << minimumInstructions(N, M, K, C, A, B) << '\n'; return 0; } #endif
#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...