実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 274
問題概要
縦 マス、横
マスからなるマス目があり、上から
行目 、左から
列目のマスをマス
と呼ぶ。マス目には既に
個のコマが置かれており、
番目のコマはマス
に置かれている。
これから、すでに置かれているどのコマにも取られないように、いずれかの空マスに自分のコマを置くことを考える。マス に置かれているコマは、次のどちらかの条件を満たすコマを取ることができる。
- マス
に置かれている。
- マス
に置かれている。
- マス
に置かれている。
- マス
に置かれている。
- マス
に置かれている。
- マス
に置かれている。
- マス
に置かれている。
- マス
に置かれている。
このとき、自分のコマを置くことができるマスがいくつあるか求めよ。
制約
- 入力はすべて整数。
考察
B問題とほぼ同じ問題設定だが、 は最大
になるので、B問題の解法と同じ方針を取ると MLE や TLE となってしまう。
そこで、自分のコマを置くことができないマス (= 既に置かれているコマが取ることのできるマス) のみを記録しておき、その個数をマスの総数 から引くことを考える。
自分のコマが置けないマスは、set
などに格納しておくのがよいだろう。
コード
#include <bits/stdc++.h> using namespace std; using ll = long long; #define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++) // ======================================== // int main() { ll N, M; cin >> N >> M; set<pair<int, int>> attackable; rep(i, 0, M) { int a, b; cin >> a >> b; attackable.insert({a, b}); rep(j, 0, 8) { int nx = a + dx[j]; int ny = b + dy[j]; if (nx >= 1 && nx <= N && ny >= 1 && ny <= N) { attackable.insert({nx, ny}); } } } ll ans = N * N - attackable.size(); cout << ans << endl; }
実装時間: 10分