Submission #761165

#TimeUsernameProblemLanguageResultExecution timeMemory
761165AndreiPainting Walls (APIO20_paint)C++17
100 / 100
574 ms253020 KiB
#include <bits/stdc++.h> #include "paint.h" using namespace std; vector <vector <int>> likers; vector <int> pos; vector <vector <int>> spreadLeft; deque <int> dq; vector <int> dp; /** 8 3 5 3 3 1 3 4 4 2 2 3 0 1 2 2 2 3 2 3 4 */ int minimumInstructions(int N,int M,int K,vector <int> C,vector <int> A,vector <vector <int>> B) { likers.resize(K); for(int i=0; i<M; i++) for(auto it:B[i]) likers[it].push_back(i); pos.resize(M); for(int i=0; i<M; i++) pos[i]=-1; dp.resize(N); spreadLeft.resize(N); for(int i=0; i<N; i++) { spreadLeft[i].resize(likers[C[i]].size()); int maxim; if(i>0) { maxim=0; for(int j=0; j<(int)likers[C[i]].size(); j++) { int pj=pos[(likers[C[i]][j]-1+M)%M]; if(pj==-1) spreadLeft[i][j]=1; else spreadLeft[i][j]=spreadLeft[i-1][pj]+1; maxim=max(maxim,spreadLeft[i][j]); } } else { maxim=1; for(int j=0; j<(int)likers[C[i]].size(); j++) spreadLeft[i][j]=1; } if(i>0) { for(int j=0; j<(int)likers[C[i-1]].size(); j++) pos[likers[C[i-1]][j]]=-1; } for(int j=0; j<(int)likers[C[i]].size(); j++) pos[likers[C[i]][j]]=j; if(i<M-1) dp[i]=N+1; else if(i==M-1) { if(maxim<M) return -1; dp[i]=1; } else { while(!dq.empty() && dq.front()<i-M) dq.pop_front(); if(maxim>=M) dp[i]=min(N+1,dp[dq.front()]+1); else dp[i]=N+1; } while(!dq.empty() && dp[dq.back()]>=dp[i]) dq.pop_back(); dq.push_back(i); } if(dp[N-1]==N+1) return -1; 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...