平面上有巫妖和小精靈,樹木阻擋視線。巫妖有攻擊半徑和技能 CD。在半徑內且視線無阻擋的精靈可被秒殺。求最短時間消滅所有精靈。
T / CD + 1。dist(巫妖, 精靈) <= 半徑。struct Dinic {
// 標準 Dinic 實現:BFS 分層 + DFS 增廣
// 節點數:S=0, 巫妖 1..L, 精靈 L+1..L+R, T=L+R+1
};
bool check(int T) {
dinic.clear();
for (int i = 1; i <= L; i++) dinic.addEdge(S, i, T / cd[i] + 1);
for (int i = 1; i <= L; i++)
for (int j = 1; j <= R; j++)
if (canAttack[i][j]) dinic.addEdge(i, L+j, 1);
for (int j = 1; j <= R; j++) dinic.addEdge(L+j, T, 1);
return dinic.maxFlow() == R;
}
int main() {
// 讀入數據,預計算 canAttack 矩陣
int lo = 0, hi = 1e7, ans = -1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (check(mid)) { ans = mid; hi = mid - 1; }
else lo = mid + 1;
}
cout << ans << endl;
}
二分 log(1e7) ≈ 24 次。每次 Dinic 在節點數 ≤ 500,邊數 ≤ 250000 圖上極快。總體通過。