【CF878D】Magic Breeding
題意:有k個物品,每個物品有n項屬性值,第i個人的第j個屬性值為aij,有q個操作:
1 x y 用x和y合成一個新的物品,新物品的編號是++k,新物品的每項屬性值為x和y的對應項的屬性值中的較大值。
2 x y 用x和y合成一個新的物品,新物品的編號是++k,新物品的每項屬性值為x和y的對應項的屬性值中的較小值。
3 x y 詢問x物品的屬性y的值。
n,q<=100000,k<=12,aij<=10^9
題解:神題,很容易讓人想到排序那道題,不過這題更為復雜。
先考慮一個簡單的版本,如果aij=0或1,那么只有$2^k$中本質不同的屬性值。我們可以理解為第S(可以看成一個二進制狀態)個屬性的意義是:只有S中的物品該項屬性值為1。每次操作我們可以暴力維護,也可以使用bitset優化,復雜度$O({q2^k\over 32})$。
但如果aij在10^9里呢?我們試圖枚舉答案aiy。我們將所有該項屬性值>=aiy的看成1,其余的看成0,那么維護方法就和上面說的一樣了。如果最終的答案是1,說明答案>=aiy。
最終復雜度$O({q2^k\over 32}+qk^2)$。