Submission #1216207

#TimeUsernameProblemLanguageResultExecution timeMemory
1216207mychecksedadPainting Walls (APIO20_paint)C++20
63 / 100
1596 ms13556 KiB
#include "paint.h" #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30; int sz, T[N]; void build(int n){ sz=n; for(int i = 0; i <= 2*sz+2; ++i) T[i] = 0; } void add(int v, int x){ ++v; v += sz; T[v] += x; for(v >>= 1; v; v >>= 1) T[v] = max(T[v<<1], T[v<<1|1]); } int minimumInstructions(int n, int m, int k, std::vector<int> CC, std::vector<int> A, std::vector<std::vector<int>> B) { vector<vi> COL(k); for(int i = 0; i < m; ++i){ for(int j = 0; j < A[i]; ++j) COL[B[i][j]].pb(i); } int C = m; // int D = m; build(C); for(int j = 0; j + 1 < m; ++j){ for(int pos: COL[CC[j]]) add((j-pos+C)%C, 1); } vector<bool> ok(n); for(int i = 0; i <= n - m; ++i){ for(int pos: COL[CC[i + m - 1]]) add((i+m-1-pos+C)%C, 1); // cerr << T[1] << ' '; if(T[1] == m){ ok[i] = 1; } for(int pos: COL[CC[i]]) add((i-pos+C)%C, -1); } if(ok[0] == 0 || ok[n-m] == 0) return -1; vector<pii> P; P.pb({0, 1}); int last = 0; for(int i = 1; i <= n-m; ++i){ if(ok[i]) last = i; if(last <= i - m) return -1; if(ok[i]){ int pos = lower_bound(all(P), pii{i - m, -1}) - P.begin(); P.pb({i, P[pos].ss + 1}); } // cerr << dp[i] << ' '; } return P.back().ss; }
#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...