【题目链接】

【思路要点】

  • 很不错的脑洞题。
  • 附上官方题解。
    【LOJ2323】「清华集训 2017」小 Y 和地铁
    【LOJ2323】「清华集训 2017」小 Y 和地铁
  • 时间复杂度 O(T2N2)O(T*2^{\frac{N}{2}})

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 105;
const int INF = 1e9;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); } 
template <typename T> void read(T &x) {
	x = 0; int f = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
template <typename T> void write(T x) {
	if (x < 0) x = -x, putchar('-');
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {
	write(x);
	puts("");
}
int n, ans, a[MAXN], b[MAXN], last[MAXN];
int cntup, up[MAXN], cntdown, down[MAXN];
void work(int pos, int sum) {
	if (sum >= ans) return;
	if (pos > n) {
		ans = sum;
		return;
	}
	if (a[pos] == 0) work(pos + 1, sum);
	else {
		int cnt = 0, cmt = 0;
		for (int i = 1; i <= cntup; i++) {
			cnt += pos <= up[i] && a[pos] >= up[i];
			cmt += a[pos] <= up[i];
		}
		for (int i = 1; i <= cntdown; i++)
			cmt += pos <= down[i];
		up[++cntup] = a[pos];
		work(pos + 1, sum + min(cnt, cmt));
		cntup--, cnt = 0, cmt = 0;
		for (int i = 1; i <= cntdown; i++) {
			cnt += pos <= down[i] && a[pos] >= down[i];
			cmt += a[pos] <= down[i];
		}
		for (int i = 1; i <= cntup; i++)
			cmt += pos <= up[i];
		down[++cntdown] = a[pos];
		work(pos + 1, sum + min(cnt, cmt));
		cntdown--;
	}
}
int main() {
	int T; read(T);
	while (T--) {
		read(n);
		memset(last, 0, sizeof(last));
		ans = INF;
		for (int i = 1; i <= n; i++) {
			read(b[i]), a[i] = 0;
			a[last[b[i]]] = i;
			last[b[i]] = i;
		}
		work(1, 0);
		printf("%d\n", ans);
	}
	return 0;
}

相关文章:

  • 2021-06-24
  • 2021-12-13
  • 2021-10-04
  • 2022-12-23
  • 2021-08-11
  • 2021-08-31
  • 2022-02-05
  • 2021-08-22
猜你喜欢
  • 2022-12-23
  • 2021-07-15
  • 2021-11-02
  • 2021-09-12
  • 2022-12-23
  • 2021-09-01
  • 2022-01-02
相关资源
相似解决方案