哇這題是真的喵,hr智商太高辣
這題的難點就是看了題解之後怎麼證明題解裡的結論...
結論①:深度大於logm的點肯定能達到最大值
證明:顯然乙個西瓜的屬性裡0數量一半1數量一半我們取到的1數量最少,所以我們最多logm個點就可以把所有屬性取到1
結論②:未達到最大值的點相鄰兩個肯定價值不同
證明:易證,取反即可
結論③:有n個西瓜,記s[i]為擁有的屬性i的集合,當s取遍所有可能的2^n種集合的時候達不到最大值
證明:顯然所有的集合裡必有乙個全0的集合,我們至少需要把這個集合裡的乙個0變成1。把第一列的取反,讓全0集合出現第乙個1,但是必定存在有乙個集合只有第一列是1,其他列是0的情況,那麼又出現了乙個全0集合,那麼又需要把第二列取反,以此類推我們將會把所有列取反一次,但是所有的集合裡必定有乙個全1的集合,我們每一列都取反了一次之後,全1集合變成全0集合了,所以肯定取不到最大值。
我們(其實是hr)可以發現!對列取反的操作實際上是交換集合位置的操作!(orz hr!
因為我們有2^n個集合,所以必定不可能把全0集合消去,所以必定取不到最大值!
結論④:有n個西瓜,記s[i]為擁有的屬性i的集合,當s[i]沒有取遍所有可能的2^n種集合的時候肯定可以達到最大值
證明:借用我們證明結論③時所發現的,我們少了某乙個集合,那麼只要把全0集合交換成那個缺少的集合即可
可能有點抽象,所以我們具體分析一下。如果缺少的是全0集合,那麼直接就可以取到最大值了。如果缺少的不是全0集合,我們就把缺少的集合為1的那幾列取反,相當於將全0集合與缺少的集合交換,缺少的集合必定有1,而且不存在除了缺少的集合之外存在乙個只有取反的那幾列是1其他是0的集合,於是就可以取到最大值。
本質:對列取反的操作實際上是交換集合位置的操作
想明白了這個之後,就可以非常輕鬆的證明並理解這些結論了
SRM605題解(T3除外)
t1 題目大意 給定n個物品,每個物品有兩個屬性a i 和b i 選擇一些物品使得c d最大化,其中c為所選物品中a i 的不同的數字個數,d為所選物品中b i 的總和。主要思路 由於a i 比較小,所以可以對不同的a i 進行一次dp,f i 代表從所有a i i的物品中選擇乙個子集使得權值和最大...
SRM606題解(除T3外)
t1 題目大意 兩個人玩遊戲,第乙個人猜數字,第二個人回答和正確數字相差多少。進行n次後,問正確數字是多少。主要思路 模擬!include include include include includeusing namespace std void swap int a,int b int abs...
汕頭市隊賽 SRM16 T2
描述 貓和老鼠,看過吧?貓來了,老鼠要躲進洞裡。在一條數軸上,一共有n個洞,位置分別在xi,能容納vi只老鼠。一共有m只老鼠位置分別在xi,要躲進洞裡,問所有老鼠跑進洞裡的距離總和最小是多少。輸入格式 兩個用空格隔開的整數m和n。這一行m個數字分別表示老鼠的位置 接下來n行每行兩個數字分別表示洞的位...