【bzoj1208】[HNOI2004]寵物收養所

傳送門:戳這裏看原題

解題思路

這道題其實是第二次寫了,聽了金牌爺XZH的STL安利大會,對於set這個閹割版的核武器重拾自信。
所以吧,我拿這道當年splay的一血……練手……-_-||
個人感覺,對STL的更熟練掌握,是建立在對C++的運行、編譯方式的深刻理解上的。
當年覺得自己splay寫的妙極,現在大力打臉。

代碼

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long

const int mod = 1000000;
const int INF = 2000000000;
int n, ans;
bool flag;
set<int> T;

int main() {
    scanf("%d", &n);
    T.insert(-INF);
    T.insert(INF);
    while(n--) {
        int tag, data;
        scanf("%d%d", &tag, &data);
        if (T.size() == 2) {
            flag = tag;
            T.insert(data);
        }
        else if (tag != flag) {
            int small = *--T.lower_bound(data);
            int big = *T.lower_bound(data);
            if (data - small <= big - data && small > -INF) {
                ans = (ans + data - small) % mod;
                T.erase(small);
            }
            else {
                ans = (ans + big - data) % mod;
                T.erase(big);
            }
        }
        else T.insert(data);
    }
    printf("%d\n", ans);
    return 0;
}

尾聲

雖然用set寫的很舒服,但當時這道題的確對我理解splay起了很大幫助
回憶向……繼續加油吧

End.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章