一家寵物收養場會陸續到來一些收養人和寵物。每個收養人個寵物都有乙個權值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 而他也給每個處在收養場的寵物乙個特點值。這樣他就能夠...