1. 程式人生 > 其它 >Codeforces Round #765 (Div. 2)

Codeforces Round #765 (Div. 2)

Codeforces Round #765 (Div. 2)

寫完ABC,又罰座了....

D. Binary Spiders

先看這個題,題意很簡單,給你一堆數,讓你選出一個集合,使得這個集合內任意兩個數異或的值都大於等於k,最後問這個集合的最大數量以及一個構造方案。
我們考慮大於k有哪些情況,由於和位運算有關係,我們肯定要從二進位制的角度去解析。我們先把k換成二進位制位,我們找到它的1的最高位,那麼如果一個數x要大於k的話,可以分為以下兩種簡單情況
1.x的1的最高位大於k的1的最高位。
2.x的1的最高位等於k的1的最高位。之後去掉最高位,再做比較。
我們先考慮第一種情況,要求這個集合內,任意兩個數異或起來都是大於等於k的。第一種情況也可以換一種情況表述:將x向右移m位,m為k的1的最高位,x仍>0.也就是說,任意兩個數向右移m位後,異或起來仍大於0,考慮什麼情況下,兩個數異或起來等於0,也就是相等的情況。那麼思路就有了,我們可以把所有的數按照向右移m位後的值進行分類,不同類之間,異或起來一定大於0,則意味著情況1成立,他們互不干擾。那麼同一類裡面,最多能選多少個呢?考慮三個數,他們是同一類的,a,b,c,假如他們都可以被選中的話,那麼在m位上他們必定ab=1,a

c=1,b^c=1.那麼他們中一定有兩個數在m位上異或起來等於0,小於k,這說明同一類中最多選2個。至於能不能選,這就要看這一類中最大的異或值了。這是個經典問題,建個0/1 tire樹即可。
總的來說這個題真挺好的。