2020多校聯考 手套

2022-03-17 00:58:03 字數 996 閱讀 5172

有兩個可重集 \(a\) 和 \(b\),每個集合裡有若干元素,每種元素有若干個。可以選擇從 \(a\) 集中等概率隨機選 \(x\) 個到 \(c 集\),從 \(b\) 中等概率隨機選擇 \(y\) 個到 \(d\),使得一定會使 \(c\) 和 \(d\) 有交。最小化 \(x+y\),在 \(x+y\) 相等時最小化 \(x\)。

因為要使得一定有交,所以考慮選了一定數目後,沒有交的最壞情況。最壞情況顯然是對於每種元素,其中乙個集合中的該元素取完了,而另乙個集合中的該元素乙個都沒有取到。而每種選擇情況都會構成乙個點 \((x,y)\),那麼顯然對所有 \(x'且 \(y' 的選擇方案 \((x',y')\) 一定都不能構成合法方案,因為 \((x,y)\) 最壞。

考慮 \((x+1,y+1)\),因為 \((x,y)\) 最壞,再加入乙個元素後,一定可以構成一組合法方案。所以只需要統計邊界上的點,從而更新出合法的點的座標即可。

顯然棕色點比紅色點優(\(x+y\) 小),所以用兩個邊界上的點更新乙個合法的點。對於一組非法點 \((x_,y_)\) 和 \((x_i,y_i)\) ,可以構造出乙個合法點 \((x_+1,y_i+1)\)

#include#includeusing namespace std;

#define n 21

struct node

int ans=(1<<30)+(1<<29)+(1<<28)+((114514-114513)<<27),x,y;

for(int i=2;i<=top;i++)

printf("%d\n%d",x,y);}/*

40 7 1 6

1 5 0 6

*/

2020多校聯考 樹

沒有定根就非常的離譜,後來告訴根直接就是 1 先考慮鏈上怎麼做,顯然維護乙個單調棧,求出第乙個比當前數大的位置,然後倍增即可。再放在樹上怎麼做?依舊維護單調棧,但這次不能暴力地彈掉棧頂元素了,因為這樣的複雜度是假的。因為單調棧有單調性,所以直接在單調棧內二分出單調棧彈得不能再彈的位置,然後修改 to...

2020多校聯考 簡單題

確實是簡單題。邊權和最小顯然是最小生成樹。對於一條非樹邊,加到樹裡面一定會構成乙個環,那麼環上的樹邊的邊權就一定不能超過這條非樹邊。所以對最小生成樹進行重鏈剖分,對於一條非樹邊 u i,v i 對鏈 u i to v i 進行 modify 維護乙個最小值。而對於一條非樹邊要想成為樹邊,就至少需要把...

2020多校聯考 簡單題

2020.11.23 題目只要求求出 c 的值,它就提示我們 c 和 a b 的值沒有太大關係。照著這個思路我們把 a b 合併一下,搞成二元組。對 a b leq c a b,c to 2 a b c a b 對 a b c a b,c to a b c,2c 我們發現 ab 始終可以並在一起,乾...