靈活利用基本的STL,便可完成解題。html
這題首先很明顯的思路是:「標記數組」,可是咱們知道數組的下標必須是非負整數,而這裏的座標是可能存在負數的!因而不能用數組,而要採用其餘的策略!ios
再看到數據的範圍,須要標記的座標達到了10^9,這個規模用通常的容器也沒法存放!因此咱們採用map(有序映射表)或者unordered_map(無序哈希表),去映射出《點-存在與否》的關係。算法
那麼究竟是採用有序映射仍是哈希映射呢?數組
有序map是基於紅黑樹這個數據結構實現的,常數較大,查找和插入時間是 O ( l o g n ) O(logn) O(logn),而哈希表在查找的時候更快,只有 O ( 1 ) O(1) O(1),如此一來彷彿是哈希表更佳!markdown
可是,這裏的點只有不超過1000個,所以紅黑樹在空間上額外佔用的開銷不算什麼!並且這裏不光是查找比維護數據結構的操做更多,可是因爲點的數量很少,因此無序map和有序map均可以使用!數據結構
#include <iostream> #include <algorithm> #include <map> using namespace std; const int maxn = 1005; const int dir[][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; const int sco[][2] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}}; typedef long long ll; map<pair<ll, ll>, bool> mp; int res[5]; bool isValid(const pair<ll, ll>& point) { for(int i = 0;i < 4;++i) { int dx = dir[i][0], dy = dir[i][1]; if(mp.find(make_pair(point.first + dx, point.second + dy)) == mp.end()) { return false; } } return true; } int getScores(const pair<ll, ll>& point) { int ret = 0; for(int i = 0;i < 4;++i) { int sx = sco[i][0], sy = sco[i][1]; if(mp.find(make_pair(point.first + sx, point.second + sy)) != mp.end()) { ret++; } } return ret; } int main() { int n; ll x, y; cin >> n; for(int i = 0;i < n;++i) { cin >> x >> y; mp[make_pair(x, y)] = true; } for(auto subMap : mp) { if(isValid(subMap.first)) { res[getScores(subMap.first)]++; } } for(int i = 0;i <= 4;++i) { cout << res[i] << endl; } return 0; }