全部文章

Author:admin / Posted in:2018年03月19日 / Category:全部文章 / Views:164

上次题解——食物链-NWUACM程序爱好者联盟

思路
分析:由于只有三种动物,所以只要知道两个动物a,b与另一个动物c的关系,就能够推出a与b的关系。因此,杨肸子并查集将能够互相确定关系的动物分在一个集合,par[x]表示x与par[x]的关系能够确定李恩惠,relation[x]表示x与par[x]的关系:0表示同类,1表示par[x]吃x,2表示x吃par[x]。然后在进行路径压缩和合并时及时更新动物x与par[x]的关系即可豹头王传说。在路径压缩更新关系的过程中:假设当前动物为x,y表示路径压缩前能与x确定关系的动物,z表示路径压缩后能与x确定关系的动物,relation(a, b)表示a与b的关系,则有:① relation(x, y) = 0, relation(y, z) = 0 → relation(x, z) = 0② relation(x姬如千泷 , y) = 0一等世子妃 , relation(y, z) = 1 → relation(x, z) = 1③ relation(x杨逸嘉 , y) = 0, relation(y, z) = 2 → relation(x, z) = 2④ relation(x, y) = 1, relation(y, z) = 0 → relation(x倔强吉他谱 , z) = 1⑤ relation(x, y) = 1, relation(y, z) = 1 → relation(x, z) = 2⑥ relation(x任鱼网 , y) = 1, relation(y, z) = 2 → relation(x, z) = 0⑦ relation(x宿雨犹眠 , y) = 2, relation(y, z) = 0 → relation(x, z) = 2⑧ relation(x, y) = 2, relation(y密山信息网, z) = 1 → relation(x, z) = 0⑨ relation(x, y) = 2, relation(y, z) = 2 → relation(x, z) = 1经过观察就能发现:relation(x, z) = (relation(x, y) + relation(y, z)) % 3判断假话的过程(合并集合)中:假设当前话给定了x与y的关系为d∈{0, 1},px = getPar(x), py = getPar(y)只有px == py时,才能判断当前这句话是否为假话,否则必为真话,需要合并集合若px == py,则有:(1) d == 0时,当且仅当 relation(x, px) == relation(y, py)时,当前这句话才为真话(2) d == 1时,当且仅当 x 吃 y时,当前这句话才为真话,观察①~⑨可以发现情况有: (a) relation(x, px) = 0, relation(y, py) = 1 (b) relation(x, px) = 1, relation(y情义两心知, py) = 2 (c) relation(x, px) = 2, relation(y, py) = 0经过观察就能用以下表达式综合(1)(2)的判断:(relation(y, py) - relation(x, px) + 3) % 3 != d时才为假话若px != py,则当前话为真话,需要合并集合,艾诗此时知道relation(x, px), relation(y, py), relation(x, y),观察①~⑨可以推出relation(px, py) = (relation(x, px) - relation(y, py) + d + 3) % 3【注意】多组输出会WA,只用一组输入就好
快,点击阅读原文查看源代码,一起涨姿势~