HNOI2004寵物收養所

2021-06-14 06:20:07 字數 2259 閱讀 9829

time limit: 10 sec  

memory limit: 162 mb

submit: 2796  

solved: 995 [

submit][

status][

discuss]

最近,阿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,n<=80000,表示一年當中來到收養所的寵物和領養者的總數。接下來的n行,按到來時間的先後順序描述了一年當中來到收養所的寵物和領養者的情況。每行有兩個正整數a, b,其中a=0表示寵物,a=1表示領養者,b表示寵物的特點值或是領養者希望領養寵物的特點值。(同一時間呆在收養所中的,要麼全是寵物,要麼全是領養者,這些寵物和領養者的個數不會超過10000個)

僅有乙個正整數,表示一年當中所有收養了寵物的領養者的不滿意程度的總和mod 1000000以後的結果。

50 2

0 41 3

1 21 5

3(abs(3-2) + abs(2-4)=3,最後乙個領養者沒有寵物可以領養)

解法:sbt。需要用到sbt中的插入、刪除、查詢。

在sbt樹中,要麼全是寵物,要麼全是人,可以用乙個flag標記記錄sbt樹中是人還是寵物。

每讀入一次a、b:

①若a==flag,就向sbt樹中插入節點,至於maintain與旋轉操作,就只有靠自己去悟了;

②若a!=flag,就在樹中查詢b的前驅與後繼,所謂前驅,即sbt樹中,<=b的最大值,後繼則與之相反,最優值必定為前驅與後繼中的乙個,暫且把最優值記為點p[x](p記錄每個點的特點值)。知道x後,不滿意程度也就知道了,然後累加起來即可。至於刪除點x的操作,則是找到p[x]在sbt樹中的前驅結點k,將x號點的值賦值為k號節點的值,然後直接刪除k號點即可(將k號點的父親指向k的標記清零即可)。

在下面的**中的delete(),就是用p【x】的前驅節點的值賦給x節點,並把k號點的父親指向k的標記清零,來實現刪除的,不太懂的,可以自己去模擬一下。若不理解,也可以按照上面說的,單獨去找到x的前驅結點k,再將k節點的值賦給x節點,然後再對k進行刪除(將k號點的父親指向k的標記清零)。

**:#include#include#include#define maxn (10000+10)

#define mod 1000000

using namespace std;

int n,root,flag,ans,num,pre,succ;

int s[maxn],l[maxn],r[maxn],p[maxn];

void init()

inline int getin()

inline void right_rotate(int &t)

inline void left_rotate(int &t)

void maintain(int &t,bool flag)

void insert(int &t,int w)

s[t]++;

if(w=p[t])pre=t,getpre(r[t],b);

else getpre(l[t],b);

}void getsucc(int t,int b)

int del (int &t,int w)

else

if(w

HNOI 2004 寵物收養所

題目鏈結 演算法 建兩棵平衡樹維護領養者和寵物的特點值,這兩棵平衡樹支援 插入刪除,查詢前驅和後繼 筆者的平衡樹選用的是treap,當然,splay,set等資料結構也是可以完成這個任務的 includeusing namespace std define maxn 80010typedef lon...

HNOI2004 寵物收養所

description 最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,阿q根據領養者的要求通過他自己發明的乙個特殊的公式,得出該領養者希望領養的寵物的特點值a a是乙個正整數,a 2 31 而他也給每個處在收養所...

HNOI2004 寵物收養所 Splay

題目 題意 time limit 10 sec memory limit 162 mb submit 6221 solved 2413 submit status discuss 最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自...