제출 #1317444

#제출 시각아이디문제언어결과실행 시간메모리
1317444comet0Group Photo (JOI21_ho_t3)C++20
12 / 100
300 ms123448 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	int n;
	cin >> n;
	vector<int> a(n);
	for (auto &x : a) cin >> x;

	vector<int> p(n);
	for (int i = 0; i < n; i++) p[a[i] - 1] = i;

	vector<unsigned int> m(n, 0);
	vector<vector<char>> o(n, vector<char>(n, 0));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i == j) continue;
			if (p[j] > p[i]) m[i] |= (1u << j);
			int x = i + 1, y = j + 1;
			if (x < y + 2) o[i][j] = 1;
		}
	}

	const int F = (1u << n);
	const int I = 1e9;
	vector<vector<int>> d(F, vector<int>(n, I));
	for (int i = 0; i < n; i++) d[1u << i][i] = 0;

	for (int s = 1; s < F; s++) {
		for (int l = 0; l < n; l++) {
			if (!(s & (1u << l))) continue;
			int c = d[s][l];
			if (c == I) continue;
			for (int t = 0; t < n; t++) {
				if (s & (1u << t)) continue;
				if (!o[l][t]) continue;
				int a = __builtin_popcount(s & m[t]);
				int ns = s | (1u << t);
				d[ns][t] = min(d[ns][t], c + a);
			}
		}
	}

	int r = I;
	for (int l = 0; l < n; l++) r = min(r, d[F - 1][l]);
	cout << r;
}
#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...