Submission #1163349

#TimeUsernameProblemLanguageResultExecution timeMemory
1163349choochooPainting Walls (APIO20_paint)C++20
51 / 100
415 ms589824 KiB
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ve vector
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define pii pair<int,int>
#define pll pair<ll,ll>

int n, m;

int ans(int i, ve<int>& arr) {
	if (i >= n) return 0;
	if (i - arr[i] >= m) return INT_MIN;
	return ans(arr[i]+m, arr) + 1;
}

int minimumInstructions(int N, int M, int K, std::vector<int> C, std::vector<int> A, std::vector<std::vector<int>> B) {
	ve<ve<int>> dp(N, ve<int>(M));
	ve<ve<bool>> valid(M, ve<bool>(K));
	ve<bool> seg(N);
	ve<int> best(N);
	n = N; m = M;
	for (int i=0; i<M; i++) {
		for (auto j:B[i]) {
			valid[i][j] = true;
		}
	}
	
	for (int j=0; j<M; j++) {
		if (valid[j][C[N-1]]) {dp[N-1][j] = 1;}
		else {dp[N-1][j] = -1;}
	}
	for (int i=N-2; i>=0; i--) {
		for (int j=0; j<M; j++) {
			if (valid[j][C[i]]) {
				if (dp[i+1][(j+1)%M] != -1) {
					dp[i][j] = dp[i+1][(j+1)%M] + 1;
				}
				else {dp[i][j] = 1;}
			} else {dp[i][j] = -1;}
		}
	}

	for (int i=0; i<N; i++) {
		for (int j=0; j<M; j++) {
			if (dp[i][j] >= M) {
				seg[i] = true;
				break;
			}
		}
		if (i == 0 && !seg[i]) {return -1;}
		if (seg[i]) {best[i] = i;}
		else {best[i] = best[i-1];}
	}
	
	int hi = ans(0, best);
	if (hi <= 0) return -1;
	return hi;
}
#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...