답안 #387133

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
387133 2021-04-08T03:28:09 Z milleniumEeee 벽 칠하기 (APIO20_paint) C++17
컴파일 오류
0 ms 0 KB
#include <bits/stdc++.h>
#include "paint.h"
#include "grader.cpp"
#define chkmin(a, b) a = min(a, b)
#define chkmax(a, b) a = max(a, b)
using namespace std;

const int MAXN = (int)1e5 + 5;
const int INF = 1e9 + 7;

int pos[MAXN];
int dp[MAXN];
int pref[MAXN];

struct Segment_Tree {
	vector <int> tree;
	vector <int> lazy;
	Segment_Tree (int n) {
		tree.resize(n * 4, INF);
		lazy.resize(n * 4, INF);
	}
	void push(int v, int tl, int tr) {
		if (lazy[v] == INF) {
			return;
		}
		if (tl != tr) {
			chkmin(lazy[v + v], lazy[v]);
			chkmin(lazy[v + v + 1], lazy[v]);
		}
		chkmin(tree[v], lazy[v]);
		lazy[v] = INF;
	}
	void upd(int l, int r, int val, int v, int tl, int tr) {
		push(v, tl, tr);
		if (l > tr || tl > r) {
			return;
		}
		if (l <= tl && tr <= r) {
			lazy[v] = val;
			push(v, tl, tr);
			return;
		}
		int mid = (tl + tr) >> 1;
		upd(l, r, val, v + v, tl, mid);
		upd(l, r, val, v + v + 1, mid + 1, tr);
	}
	int get(int l, int r, int v, int tl, int tr) {
		push(v, tl, tr);
		if (l > tr || tl > r) {
			return INF;
		}
		if (l <= tl && tr <= r) {
			return tree[v];
		}
		int mid = (tl + tr) >> 1;
		return min(get(l, r, v + v, tl, mid), get(l, r, v + v + 1, mid + 1, tr));
	}
};

int minimumInstructions(int N, int M, int K, vector<int> C, vector<int> A, vector<vector<int>> B) {
	memset(pos, -1, sizeof(pos));
	for (int i = 0; i < M; i++) {
		for (int el : B[i]) {
			pos[el] = i;
		}
	}
	for (int i = 0; i < N; i++) {
		if (pos[C[i]] == -1) {
			return -1;
		}
	}
	auto nxt = [&](int p) {
		if (p + 1 < M) {
			return p + 1;
		} else {
			return 0;
		}
	};
	for (int i = 0; i + 1 < N; i++) {
		int before = (i > 0 ? pref[i - 1] : 0);
		pref[i] = before + (pos[C[i + 1]] == nxt(pos[C[i]]));
	}
	auto get = [&](int l, int r) {
		return pref[r - 1] - pref[l - 1];
	};
	auto can = [&](int l, int r) {
		if (r - l + 1 == M && get(l, r) == M - 1) {
			return true;
		} else {
			return false;
		}
	};
	fill(dp, dp + MAXN, INF);
	Segment_Tree T(N);
	if (can(0, M - 1)) {
		T.upd(0, M - 1, 1, 1, 0, N - 1);
	}
	for (int i = M; i < N; i++) {
		if (can(i - M + 1, i)) {
			int best = T.get(i - M, i - 1, 1, 0, N - 1);
			T.upd(i - M + 1, i, best + 1, 1, 0, N - 1);
		}
	}
	if (T.get(N - 1, N - 1, 1, 0, N - 1) < INF) {
		return T.get(N - 1, N - 1, 1, 0, N - 1);
	} else {
		return -1;
	}
}

/*
5 3 10
0 2 1 4 3
2 0 4
2 3 2
1 1
*/

Compilation message

paint.cpp: In function 'int minimumInstructions(int, int, int, std::vector<int>, std::vector<int>, std::vector<std::vector<int> >)':
paint.cpp:84:34: warning: array subscript -1 is below array bounds of 'int [100005]' [-Warray-bounds]
   84 |   return pref[r - 1] - pref[l - 1];
      |                        ~~~~~~~~~~^
/tmp/ccr2F4k6.o: In function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'
/tmp/cciuudpv.o:paint.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status