QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#761102#3040. ContainerqLWA 2ms8668kbC++142.1kb2024-11-18 20:55:482024-11-18 20:55:49

Judging History

你现在查看的是最新测评结果

  • [2024-11-18 20:55:49]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:8668kb
  • [2024-11-18 20:55:48]
  • 提交

answer

/*
 * @Author: qL
 * @Date: 2024-11-18 20:01:15
 * @LastEditTime: 2024-11-18 20:51:49
 * @Problem: 机器 machine
 * @Link: https://www.fzoi.top/contest/524/problem/9615
 * @Solution: Official
 */
#include <cstdio>
#include <vector>
#include <algorithm>
#define _(func) __builtin_##func
using i32 = int;
constexpr i32 N = 1000;
i32 n, c;
char s[N + 3], t[N + 3];
i32 end[N + 1], le;
i32 a[N + 1], b[N + 1], la, lb;
i32 f[N + 1][N + 1], p[N + 1][N + 1];
i32 calc(i32 d) noexcept { return d / 2 * (c + 4) + (d & 1) * (c + 3); }
std::vector<std::pair<i32, i32>> ans, sub[2];
void make(i32 x, i32 y) noexcept {
	if (!x && !y) return;
	if (p[x][y] <= 1)
		sub[end[x + y] <= a[x]].emplace_back(a[x], end[x + y]), make(x - 1, y);
	else
		sub[end[x + y] <= b[y]].emplace_back(b[y], end[x + y]), make(x, y - 1);
}
signed main() noexcept {
	scanf("%d%d%s%s", &n, &c, s + 1, t + 1);
	for (i32 i = 1; i <= n; ++i)
		if (s[i] == 'B') end[++le] = i;
	for (i32 i = 1; i <= n; ++i)
		if (t[i] == 'B') (i & 1 ? a : b)[++(i & 1 ? la : lb)] = i;
	_(memset)(f, 0x3f, sizeof(f)), f[0][0] = 0;
	for (i32 i = 0; i <= la; ++i)
		for (i32 j = 0; j <= lb; ++j) {
			if (i != la) {
				i32 v = f[i][j] + calc(std::abs(end[i + j + 1] - a[i + 1]));
				for (i32 k = 1; k <= j; ++k) v += b[k] > a[i + 1];
				if (f[i + 1][j] > v) f[i + 1][j] = v, p[i + 1][j] = 1;
			}
			if (j != lb) {
				i32 v = f[i][j] + calc(std::abs(end[i + j + 1] - b[j + 1]));
				for (i32 k = 1; k <= i; ++k) v += a[k] > b[j + 1];
				if (f[i][j + 1] > v) f[i][j + 1] = v, p[i][j + 1] = 2;
			}
		}
	make(la, lb);
	std::sort(sub[0].begin(), sub[0].end());
	std::sort(sub[1].begin(), sub[1].end());
	std::reverse(sub[1].begin(), sub[1].end());
	for (auto [r, l] : sub[1]) {
		while (r - l >= 2) ans.emplace_back(l, l + 2), ++ ++l;
		if (l != r) ans.emplace_back(l, r);
	}
	for (auto [l, r] : sub[0]) {
		while (r - l >= 2) ans.emplace_back(r - 2, r), -- --r;
		if (l != r) ans.emplace_back(l, r);
	}
	printf("%zu\n", ans.size());
	for (auto [l, r] : ans) printf("%d %d\n", l, r);
	return 0;
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 8668kb

input:

5 2
11221
21112

output:

0

result:

wrong answer invalid plan.