CCF CSP認證:2019-12-第二題:回收站選址

2019-12-第二題:回收站選址

題目連接:回收站選址

題目描述:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

算法設計與分析

靈活利用基本的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均可以使用!數據結構

個人AC程序

#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;
}

在這裏插入圖片描述

相關文章
相關標籤/搜索