Satyam and Counting§
暴力加分类讨论就行。
for (auto it : {0, 1}) { }对于枚举纵坐标时,我觉得这个写法比较优雅。
#include <iostream> #include <vector> #define int long long void solve() { int n; std::cin >> n; std::vector<std::vector<int>> a(n + 3, std::vector<int>(2, 0)); for (int i = 0; i < n; i++) { int x, y; std::cin >> x >> y; x++; a[x][y] = 1; } auto c = a; for (int i = 1; i <= n + 1; i++) { c[i][0] += c[i - 1][0]; c[i][1] += c[i - 1][1]; } int cnt = 0; for (int i = 1; i <= n + 1; i++) { for (auto it : {0, 1}) { if (a[i][it]) { if (a[i - 1][it ^ 1] && a[i + 1][it ^ 1]) { cnt++; } if (a[i][it ^ 1]) { cnt += c[n + 1][it ^ 1] - c[i][it ^ 1]; cnt += c[i - 1][it ^ 1] - c[0][it ^ 1]; } } } } std::cout << cnt << '\n'; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t; std::cin >> t; while (t--) { solve(); } return 0; }