BZOJ1208 [HNOI2004]寵物收養所
題意
最近,阿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]寵物收養所