0%

2025-ICPC-Asia-Taiwan-Online-台湾网络赛-E. Explosive Slabstones Rearrangement(首先转化为知道值,判定可行性问题)(所有不需要推动者的推箱子问题,都是连通块问题)

题目大意

巴巴拉有一个花园。这个花园可以表示为一个n×mn \times m的网格。她在花园里放置了kk块石板,这样她每天可以享受从一块石板跳到另一块石板。这些石板的索引从11kk。每块石板完全占据花园中的某个单元格,并且没有两块石板放置在同一个单元格上。

然而,一个邪恶的人,巴巴拉,打算放置一个特殊设备,它将占据花园中的一个矩形区域。如果任何石板与设备重叠,它将爆炸并摧毁整个花园!

为了避免爆炸,巴巴拉想通过在花园内移动石板来重新排列石板。在重新排列石板期间,石板应保持不重叠。花费的能量等于所有已移动的石板中最大的索引。现在,巴巴拉想知道重新排列石板所需的最小能量,这样她就可以为“其他目的”节省能量。

例如,假设设备将放置在蓝色矩形区域。然后,巴巴拉可以按以下方式重新排列石板。请注意,在整个过程中,石板不会重叠,不仅在重新排列之后。所有已移动的石板的索引最多为44,因此花费的能量为44

image

思路讲解

判定 E 是否可行(check(E))

  1. 如果矩形里存在编号 > E 的石板:它动不了,又在矩形里 ⇒ 直接不可行。

  2. 在整张网格上,把所有“编号 > E 的石板格子”删掉(当墙),对剩余格子做 BFS/DFS 求连通块。

  3. 对每个连通块 CC 统计:

  • t(C)t(C):这个块里 编号 <= E 的石板数量(可移动棋子数)

  • s(C)s(C):这个块里 不在矩形内 的格子数量(最终可安置容量)
    必须满足对所有块:t(C)s(C)t(C) \le s(C)
    否则该连通块里有“多出来的棋子”无论怎么挪也得有人留在矩形里 ⇒ 不可行。

  1. 单调性:E 越大,你能动的石板越多(墙越少),只会更容易可行 ⇒ 可以对 E 在 [0,k][0,k] 二分最小可行值

对于一连通块,这个合法,其实就是在炸弹区的石块数量炸弹区外空白数量在炸弹区的石块数量≤炸弹区外空白数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
auto bfs=[&](ll threshold,ll x,ll y) -> bool  {
queue<pair<ll,ll>> q;
vis[x][y]=tim;
q.push({x,y});
ll block_in_cnt=0,space_cnt=0;
while (!q.empty()) {
auto [px,py]=q.front();
q.pop();
if (is_in(px,py)) {
if (maze[px][py]>0) {
block_in_cnt++;
}
}else {
if (maze[px][py]==0) {
space_cnt++;
}
}
for (int i=0;i<4;++i) {
ll tox=px+dx[i],toy=py+dy[i];
if (is_valid(threshold,tox,toy)) {
vis[tox][toy]=tim;
q.push({tox,toy});
}
}
}
if (space_cnt>=block_in_cnt) {
return true;
}
return false;
};

AC代码

AC
https://codeforces.com/gym/106084/submission/361123071

心路历程(WA,TLE,MLE……)