luogu P6187 [NOI Online 提高組]最小環

\(k=0\)請自行特判

對於一個\(k\),我們給所有\(i\)連邊\((i,(i+k-1)\bmod n+1)\),這樣就會形成\(\gcd(n,k)\)個環,每個環長度爲\(\frac{n}{\gcd(n,k)}\),那麼我們就是要把數放在環上,使得所有相鄰兩個數的乘積的和最大.這裏有兩個結論:

  • 對於一個環,把環內的數從大到小排序,然後依次放入,放的時候要使得放過的數是連續的一段,並且接下來放進來的數要放在連續段更大的端點旁邊

一般的,考慮一個亂序的環,然後通過交換一些數的位置增量模擬上述過程.後面有\(a\ge b\ge c\ge d\),\(b\ge e\),且\(a,b,c\)三數的大小排名相鄰.假設我們現在已經放好了段\([a...b]\),接下來一個要放的數爲\(c\),相當於有\(\cdots e,c,\cdots d,a,\cdots b,\cdots\)(這裏可能會出現\(d,e\)就是\(b\)\(c\)的情況,但是不影響證明),那麼我們把\([c,d]\)段整體翻轉,可以發現答案的變化量爲\(ac+de-ad-ce=a(c-d)+e(d-c)=(a-e)(c-d)\),因爲\(a\ge e,c\ge d\),所以可以推出答案變化量不小於\(0\).那麼這樣一直做到不能做就可以得到最優解

  • 把數從小到大排序,那麼前\(\frac{n}{\gcd(n,k)}\)個數會放在一個環內,接下來\(\frac{n}{\gcd(n,k)}\)個數會放在一個環內...依此類推

否則,我們每次找到兩個環,記最小值更小的環爲\(A\)環,另外一個爲\(B\)環,然後假設滿足\(A\)環的前\(x\)大的數\(\ge\ B\)環前\(x\)小的數,那麼現在把這些數分別換到另一個環裏.我們先把兩個環的元素按照環內排序的方法排序,然後對應要換的\(x\)個數在兩個環上都是連續一段,且換到另一個環上後會變成\(A\)環最大的\(x\)個或是\(B\)環最小的\(x\)個.那麼考慮再答案的變化量,設\(A\)環上被換出的段爲\([a...b]\),在環上的情況爲\(\cdots c,a\cdots b,d\cdots\),設\(B\)環上被換出的段爲\([e...f]\),在環上的情況爲\(\cdots g,e\cdots f,h\cdots\),這裏顯然有\(a\ge e,b\ge f,c\le g,d\le h\),那麼寫出交換後答案變化量\(ag+bh+ec+fd-ac-bd-eg-fh=a(g-c)+b(h-d)+e(c-g)+f(d-h)=(a-e)(g-c)+(b-f)(h-d)\),同樣的這個變化量\(\ge 0\).一直這樣做可以發現答案一定不減,做到做不了就是最優解了

所以確定了一個\(k\),可以按照上述方法去放,就是\(O(n)\)的.由於可以\(\gcd(n,k)\)數量只有\(O(d(n))\)中,所以處理出每種\(\gcd(n,k)\)的答案即可,複雜度\(O(nd(n))\),可以通過

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