演算法: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 而他也給每個處在收養所的寵物乙個特點...