| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1309625 | namhh | 벽 칠하기 (APIO20_paint) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 1e5+5;
int cur[N],dp[N],check[N];
vector<int>pos[N],t;
int minimumInstructions(int n, int m, int k, vector<int>c, vector<int>a, vector<vector<int>>b){
for(int i = 0; i < m; i++){
for(int j = 0; j < a[i]; j++) pos[b[i][j]].push_back(i);
}
for(int i = 0; i < n; i++){
vector<pii>dm;
for(int col: pos[c[i]]){
int loj = (col+m-1) % m;
dm.push_back({col,cur[loj]+1});
}
if(i) for(int col: pos[c[i-1]]) cur[col] = 0;
for(auto[x,y]: dm){
if(y >= m) check[i-m+1] = 1;
cur[x] = y;
}
}
dp[0] = 0;
for(int i = 1; i <= n; i++) dp[i] = 1e9;
deque<int>dq;
dq.push(0);
for(int i = 1; i <= n; i++){
if(dq.size() && dq.front() == i-m-1) dq.pop_front();
if(dq.size()) dp[i] = dp[dq.front()]+1;
if(check[i]){
while(dq.size() && dp[dq.back()] > dp[i]) dq.pop_back();
dq.push_back(i);
}
}
if(dp[n] >= 1e9) return -1;
return dp[n];
}
