社区讨论
AC(但没过样例)代码求调
P11215 【MX-J8-T3】水星湖参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m2lu1d40
- 此快照首次捕获于
- 2024/10/23 20:10 去年
- 此快照最后确认于
- 2025/11/04 16:25 4 个月前
RT
样例输入 #1
CPP5 6 2 1 1
2 1 3 3
3 5 5 6
1 1 5
样例输出 #1
CPP10
但是下面这份代码却会输出 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 条回复,欢迎继续交流。
正在加载回复...