Submission #1181163

#TimeUsernameProblemLanguageResultExecution timeMemory
1181163jbarejaRope (JOI17_rope)C++20
15 / 100
423 ms1736 KiB
#include <bits/stdc++.h>

using namespace std;

int N; // liczba węzłów
int M; // liczba kolorów

vector<int> C;
vector<int> ans;
vector<int> cnt_color;

bool check(vector<int>& vec) {
	vector<pair<int,int>> intervals;
	int last = 0;
	for (int i=2; i<=N+1; i++) if (vec[i] != vec[i-1]) {
		intervals.push_back({ (i-1) - (last+1) + 1, vec[i-1] });
		last = i-1;
	}
	for (int i=1; i<intervals.size()-1; i++) if (intervals[i].first % 2 != 0) return false;
	return true;
}

int cost(int mask, int a, int b) {
	vector<int> vec = {0};
	int ans = 0;
	for (int i=1; i<=N; i++) {
		if (mask % 2) vec.push_back(a);
		else vec.push_back(b);
		mask /= 2;
		if (C[i] != vec[i]) ans++;
	}
	if (!check(vec)) return -1;
	return ans;
}

void cnt(int a, int b) {
	for (int mask=0; mask<(1<<N); mask++) {
		int temp = cost(mask, a, b);
		if (temp == -1) continue;
		ans[a] = min(ans[a], temp);
		ans[b] = min(ans[b], temp);
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	cin >> N >> M;
	C.assign(N+2, 0);
	ans.assign(M+1, 0);
	cnt_color.assign(M+1, 0);

	for (int i=1; i<=N; i++) {
		cin >> C[i];
		cnt_color[C[i]]++;
	}

	for (int i=1; i<=M; i++) {
		ans[i] = N - cnt_color[i];
	}

	for (int i=1; i<=M-1; i++) for (int j=i+1; j<=M; j++) cnt(i,j);

	for (int i=1; i<=M; i++) cout << ans[i] << '\n';
}
#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...