社区讨论

AC(但没过样例)代码求调

P11215 【MX-J8-T3】水星湖参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m2lu1d40
此快照首次捕获于
2024/10/23 20:10
去年
此快照最后确认于
2025/11/04 16:25
4 个月前
查看原帖
RT

样例输入 #1

CPP
5 6 2 1 1
2 1 3 3
3 5 5 6
1 1 5

样例输出 #1

CPP
10
但是下面这份代码却会输出 9,思路和这篇题解相似。
CPP
#include <iostream>
#include <queue>
#define elif else if
#define dx(i) ("/001"[i] - 48)
#define dy(i) ("01/0"[i] - 48)
using namespace std;
const int N = 3e3 + 7;
struct TUPLE {
	int Time, x, y;
	TUPLE(int a, int b, int c): Time(a), x(b), y(c) {}
};
deque<TUPLE> q1, q2, q3;
int n, m, q, r, k, ans;
unsigned char mp[N][N];

#define A q1.size()
#define B q2.size()
#define C q3.size()
pair<int, TUPLE> GetMission() {
	pair<int, TUPLE> ret = {0, TUPLE(2147483647, 2147483647, 2147483647)};
	if (A && q1.front().Time < ret.second.Time) ret = {1, q1.front()};
	if (B && q2.front().Time < ret.second.Time) ret = {2, q2.front()};
	if (C && q3.front().Time < ret.second.Time) ret = {3, q3.front()};
	if (ret.first == 1) q1.pop_front();
	elif (ret.first == 2) q2.pop_front();
	elif (ret.first == 3) q3.pop_front();
	return ret;
}
#define outside(x, y) ((x) < 1 || (x) > n || (y) < 1 || (y) > n)
bool valid(int x, int y) {
	if (outside(x, y) || mp[x][y]) return 0;
	for (int i = 0; i < 4; ++ i) {
		const int X = x + dx(i), Y = y + dy(i);
		if (mp[X][Y] == 1) return 1; // Outside
	} return 0;
}
bool die(int x, int y) {
	for (int i = 0; i < 4; ++ i) {
		const int X = x + dx(i), Y = y + dy(i);
		if (mp[X][Y]) return 0; // Outside
	} return 1;
}
main() {
	ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> m >> q >> r >> k;
	for (int i = 1, a, b, c, d; i <= q; ++ i) {
		cin >> a >> b >> c >> d;
		for (int x = a; x <= c; ++ x)
			for (int y = b; y <= d; ++ y)
				mp[x][y] = 1;
	}
	for (int i = 1, a, b, c; i <= r; ++ i)
		cin >> a >> b >> c, q1.emplace_back(a, b, c);
	for (;;) {
		pair<int, TUPLE> M = GetMission();
#define t (M.second.Time)
#define x (M.second.x)
#define y (M.second.y)
		if (!M.first) break;
		elif (M.first == 1)
			q2.emplace_back(t, x, y),
			q3.emplace_back(t + k, x, y),
			mp[x][y] = 2;
		elif (M.first == 2)
			for (int i = 0; i < 4; ++ i) {
				const int X = x + dx(i), Y = y + dy(i);
				if (valid(X, Y))
					q2.emplace_back(t + 1, X, Y),
					q3.emplace_back(t + k + 1, X, Y),
					mp[X][Y] = 2;
			}
		elif (M.first == 3)
			if (die(x, y))
				mp[x][y] = 0;
	}
	for (int i = 1; i <= n; ++ i)
		for (int j = 1; j <= m; ++ j)
			ans += (mp[i][j] == 2);
	cout << ans;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...