wikioi 1285 寵物收養所

2021-09-06 13:41:14 字數 1809 閱讀 8390

演算法:splay

剛開始看到這題,就注意到特徵abs了,並且資料n<=80000顯然不能暴力,只能用nlgn的做法,綜合起來,似乎只有乙個答案:splay。

將每次插入的點splay到樹根,然後找到它的前驅和後繼,再取它的絕對值即可,我們記作_abs。那麼答案就為sum,其中i為領養的人的數量,可以看為寵物的數量。

要注意的:

領養者將會領養特點值為a-b的那只寵物特點值為a-b的那個領養者將成功領養該寵物告訴我們要取前驅。

同一時間呆在收養所中的,要麼全是寵物,要麼全是領養者,這些寵物和領養者的個數不會超過10000個。 告訴我們要建兩棵splay樹來存剩下的人。

操作人的和操作動物的幾乎一樣。

*************************=14.06.13*************************=

原來寫的splay的bug太多,已換成陣列= = ps:14.07.26又換成指標。。。。>_<

詳細看另一篇splay文章,

******************************===很久以前******************************

下面放上**

#include using namespace std;

#define f(rt) rt-> pa

#define k(rt) rt-> key

#define ch(rt, d) rt-> ch[d]

#define c(rt, d) (k(rt) > d ? 0 : 1)

#define new(d) new splay(d)

#define pre(rt) f(rt) = ch(rt, 0) = ch(rt, 1) = null

int n, ans, who;

struct splay

};typedef splay* tree;

tree null = new splay, root[2] = ;

void rot(tree& rt, int d)

void splay(tree nod, tree& rt)

else

} }rt = nod;

}tree maxmin(tree rt, int d)

tree ps(tree rt, int d)

tree search(tree& rt, int d)

void insert(tree& rt, int d)

void del(tree& rt)

delete rt;

f(t) = null;

rt = t;

}void init(int key, int d)

who = d^1;

insert(root[who], key);

tree succ = ps(root[who], 0), pred = ps(root[who], 1);

int l = 0, r = 0;

if(succ != null) l = k(root[who]) - k(succ);

if(pred != null) r = k(pred) - k(root[who]);

del(root[who]);

if(succ != null && (pred == null || l <= r))

else if(pred != null && (succ == null || r < l))

}int main()

codeVS 1285 寵物收養所

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解題目描述 description 最近,阿q開了一間寵物收養所。收養所提供兩種服務 收養被主人遺棄的寵物和讓新的主人領養這些寵物。每個領養者都希望領養到自己滿意的寵物,阿q根據領養者的要求通過他自己發明的乙個特殊的公...

HNOI2004寵物收養所

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

Treap BZOJ 1208 寵物收養所

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