Codeforces Round #213 (Div. 1) ABCD

題目鏈接

代碼鏈接

A:

考慮對於矩形(x,y,z,t):sum = sigma( sigma( si * sj ) ) x<=i<=y, z<=j<=t,調整得: sum = sigma ( si )* sigma ( sj ) x<=i<=y, z<=j<=t。預處理出和爲x的 [z,t]區間數量,枚舉 [ x,y ],統計和爲 a/Sum[x,y] 的[z,t]對的數量即可。注意判 Sum[x,y]爲0以及 a/Sum[x,y] 超過數組容量的情況。

B:

容易知道能獲得的最大價值,把不可能拿到的物品都去掉,不會求的去面壁。。首先知道對於任意的交換,一定要使手上的價值增大,否則交換是浪費時間。由於每次交換的都是一個集合,是不是可以考慮這樣的貪心:我將所有的物品相互組合變成揹包,然後通過交換揹包來使當前的手上價值變大,直到拿到所有物品爲止。但是由於無法記錄揹包中有哪些物品,因此我們不得不考慮兩個黑箱揹包交換的合法性:

情形1: 若不存在物品p同時存在A揹包和B揹包中,則A與B的交換合法。

情形2: 若存在物品p同時存在A和B中,對於物品p來說等價於沒有參與交換,相當於是揹包A-p 和揹包B-p的合法交換。

由此可以得到結論: 將手上的所有物品與任意一個具有更大價值的黑箱揹包交換沒有問題。而顯然通過每次換取儘可能多的價值,能夠降低拿到總價值sum的時間。

則解決方案就是:對所有可拿到物品揹包一次,獲取所有的揹包容量,然後從0揹包開始,每次花一天時間換取儘量大的揹包,直到拿到全部物品爲止。

C:

詭異的構造題,莫名其妙AC了。做法:從小質數放起,對於當前的質數,用它與之前的數儘可能多的相乘產生新的數,因此新產生的數大部分都是之前素數的倍數(存在小部分當前素數的冪次),因此只要從新的序列從後往前數k個,若能滿足最後一種素數,則也能滿足之前的所有素數。

D:

至少有一半的數包含ghd這個約數,因此序列中隨機一個數包含ghd約數的概率是1/2,因此隨機x次就可以有(1-2^(-x))的正確率。可以在O(d^2)的時間裏求出對於數ai的ghd:篩出ai的所有約數,然後掃一遍數組把cnt[gcd(ai,aj)] ++ ,然後就可以O(d^2)得出多少個數包含指定約數。

E:

待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章