洛谷P2286 寵物收養場 Treap

2021-09-25 17:03:12 字數 1782 閱讀 3906

一家寵物收養場會陸續到來一些收養人和寵物。每個收養人個寵物都有乙個權值k

kk。如果某個時刻收養人多於寵物,那麼新進來乙個寵物就會選擇權值與自己最接近的收養人,若有兩個收養人的權值分別-為k+a

,k−a

k+a,k-a

k+a,k−

a,那麼寵物將選擇權值小的收養人。

當收養人少於寵物時,收養人就會選擇與自己權值最接近的寵物。

保證任意收養人和寵物的權值不同。定義一次收養的代價為abs

(k1−

k2

)abs(k_1-k_2)

abs(k1

​−k2

​),即收養人和寵物的權值差。求代價和。

顯然任意時刻寵物和收養人至少有乙個是沒有的。如果兩者的數量均大於0,那麼必然可以不停配對,直到一方數量為0。

所以我們維護兩棵平衡樹,每一棵維護寵物/

//收養人的權值。

如果此時進來乙隻寵物,此時收養人數量大於0,那麼就在收養人的平衡樹中查詢該寵物的權值的前驅後繼,然後判斷一下和誰配對即可。

如果收養人此時為0,那麼就在寵物的平衡樹中插入該權值即可。

新增乙個收養人的處理方法也是類似的。這樣就可以很輕鬆的解決這道題。

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int mod=

1000000

,inf=

2e9,n=

100010

;int n,opt,k,root[3]

,ans;

struct treenode

;struct treap

void

update

(int x)

void

build

(int x)

void

zig(

int&x)

void

zag(

int&x)

void

insert

(int

&x,int val)

if(val.val)

else

update

(x);

}void

del(

int&x,

int val)

else x=0;

return;}

if(val.val)

del(t[x]

.lc,val)

;else

del(t[x]

.rc,val)

;update

(x);

}int

pre(

int x,

int val)

intnext

(int x,

int val)

}treap1,treap2;

intmain()

else

}else treap2.

insert

(root[2]

,k);

}else

else

}else treap1.

insert

(root[1]

,k);}}

printf

("%d\n"

,ans)

;return0;

}

洛谷P2286寵物收養場 改

include define abs a,b a b?a b b a define mod 1000000 define mxn 80000 5 intread while c 0 c 9 return x w int ans struct nodenode mxn root,recycle mxn...

洛谷P2286 HNOI2004 寵物收養場

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

洛谷P2286 HNOI2004 寵物收養場

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