1. 程式人生 > >BZOJ1208 [HNOI2004]寵物收養所

BZOJ1208 [HNOI2004]寵物收養所

reg long long dig != c++ git bound pla char

題意

最近,阿Q開了一間寵物收養所。收養所提供兩種服務:收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,阿Q根據領養者的要求通過他自己發明的一個特殊的公式,得出該領養者希望領養的寵物的特點值a(a是一個正整數,a<2^31),而他也給每個處在收養所的寵物一個特點值。這樣他就能夠很方便的處理整個領養寵物的過程了,寵物收養所總是會有兩種情況發生:被遺棄的寵物過多或者是想要收養寵物的人太多,而寵物太少。 1. 被遺棄的寵物過多時,假若到來一個領養者,這個領養者希望領養的寵物的特點值為a,那麽它將會領養一只目前未被領養的寵物中特點值最接近a的一只寵物。(任何兩只寵物的特點值都不可能是相同的,任何兩個領養者的希望領養寵物的特點值也不可能是一樣的)如果有兩只滿足要求的寵物,即存在兩只寵物他們的特點值分別為a-b和a+b,那麽領養者將會領養特點值為a-b的那只寵物。 2. 收養寵物的人過多,假若到來一只被收養的寵物,那麽哪個領養者能夠領養它呢?能夠領養它的領養者,是那個希望被領養寵物的特點值最接近該寵物特點值的領養者,如果該寵物的特點值為a,存在兩個領養者他們希望領養寵物的特點值分別為a-b和a+b,那麽特點值為a-b的那個領養者將成功領養該寵物。 一個領養者領養了一個特點值為a的寵物,而它本身希望領養的寵物的特點值為b,那麽這個領養者的不滿意程度為abs(a-b)。【任務描述】你得到了一年當中,領養者和被收養寵物到來收養所的情況,希望你計算所有收養了寵物的領養者的不滿意程度的總和。這一年初始時,收養所裏面既沒有寵物,也沒有領養者。

\(n \leq 80000\)

分析

STL的set和lower_bound考查。

時間復雜度\(O(n \log n)\)

代碼

回到2004年,我就可以打四十行AC省選題了。

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read()
{
    rg T data=0;
    rg int w=1;
    rg char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch=='-')
            w=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        data=data*10+ch-'0';
        ch=getchar();
    }
    return data*w;
}
template<class T>il T read(rg T&x)
{
    return x=read<T>();
}
using namespace std;
typedef long long ll;
co int INF=0x7fffffff;

co int mod=1e6;
int ans,t;
set<int>T;
typedef set<int>::iterator it;

void query(int x)
{
    it l=--T.lower_bound(x),r=T.lower_bound(x);
    if(x-*l<=*r-x&&*l!=-INF)
    {
        ans+=x-*l;
        T.erase(l);
    }
    else
    {
        ans+=*r-x;
        T.erase(r);
    }
    ans%=mod;
}

int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    T.insert(INF);
    T.insert(-INF);
    int n;
    read(n);
    while(n--)
    {
        int a,b;
        read(a),read(b);
        if(T.size()==2)
        {
            t=a;
            T.insert(b);
        }
        else if(a==t)
            T.insert(b);
        else
            query(b);
    }
    printf("%d\n",ans);
    return 0;
}

BZOJ1208 [HNOI2004]寵物收養所