# AGC032-B Balanced Neighbors
## 問題情報
https://atcoder.jp/contests/agc032/tasks/agc032_b
diff: 1259
## 解法
$N$が偶数の時は
$(1, N), (2, N - 1), (3, N - 2), \dots$とペアを作り、この順にペアを円環につなげる。
- こうすることで、$S = 2(N + 1)$で構築できる
$N$が奇数の時は
$(N), (1, N - 1), (2, N - 2), \dots$として同様に円環につなげることでできる。
- $S = 2N$
## 提出コード
```cpp=
void Main() {
i32 N; input(N);
std::vector<std::vector<u32>> sets;
if (N & 1) {
sets.push_back(std::vector<u32>{});
sets.back().push_back(N);
N--;
}
for (i32 i{1} ; i < N ; i++) {
sets.push_back(std::vector<u32>{});
sets.back().push_back(i);
sets.back().push_back(N);
N--;
}
std::vector<std::pair<u32, u32>> E;
for (u32 i{} ; i < sets.size() ; i++) {
std::vector<u32> now{sets[i]}, nxt{sets[(i + 1) % sets.size()]};
for (auto v : now) for (auto v2 : nxt) {
E.emplace_back(v, v2);
}
}
for (auto& e : E) if (e.first > e.second) std::swap(e.first, e.second);
std::sort(E.begin(), E.end());
E.erase(std::unique(E.begin(), E.end()), E.end());
out(E.size());
for (auto [u, v] : E) out(u, v);
}
```
## 反省会
かかった時間: 27分
今回は、急に天から解法が降ってきたので、本番で同じように閃きがでるとは思えない。うーーーん