日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[loj2087][NOI2016]国王饮水记

發(fā)布時(shí)間:2024/4/11 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [loj2087][NOI2016]国王饮水记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

回歸OI,隨便找一道清真dp題寫(xiě)寫(xiě)吧
做完發(fā)現(xiàn)一點(diǎn)都不清真

題目相關(guān)

鏈接

題目大意

現(xiàn)在有nnn個(gè)數(shù),每次可以取若干個(gè)數(shù),將每個(gè)數(shù)賦成平均值,限制kkk次,問(wèn)第一個(gè)數(shù)最大能變成多少

數(shù)據(jù)范圍

n≤1000,k≤109n\le1000,k\le10^9n1000,k109
另外,精度要求ppp位,3≤p≤30003\le p\le30003p3000

題解

設(shè)nnn個(gè)數(shù)為h1,h2,h3???hnh_1,h_2,h_3···h_nh1?,h2?,h3????hn?

  • 對(duì)于?i∈[2,n]\forall i\in[2,n]?i[2,n]滿足hi≤h1h_i\le h_1hi?h1?,這個(gè)數(shù)肯定不會(huì)被使用

這個(gè)很好證明,hih_ihi?與大于h1h_1h1?的數(shù)取平均只會(huì)讓那些數(shù)變小,不優(yōu),hih_ihi?與小于等于h1h_1h1?的數(shù)取平均不會(huì)讓他們變得大于h1h_1h1?

  • 每次取平均一定是包含h1h_1h1?

由于上一條我們已知,取平均的一定比h1h_1h1?大,那就有
h1+h2+h322&lt;h1+h2+h33\frac{h_1+\frac{h_2+h_3}2}2&lt;\frac{h_1+h_2+h_3}32h1?+2h2?+h3???<3h1?+h2?+h3??
(因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">h1&lt;h2,h1&lt;h3h_1&lt;h_2,h_1&lt;h_3h1?<h2?,h1?<h3?

  • 使用完一個(gè)數(shù)后,這個(gè)數(shù)將不會(huì)再被使用

根據(jù)取平均的性質(zhì),再根據(jù)第一條可得

  • 如果次數(shù)足夠多,那一定是從小到大一個(gè)個(gè)一次與h1h_1h1?取平均的

h1+h22+h32&gt;h1+h2+h33\frac{\frac{h_1+h_2}2+h_3}2&gt;\frac{h_1+h_2+h_3}322h1?+h2??+h3??>3h1?+h2?+h3??
h1&lt;h2&lt;h3h_1&lt;h_2&lt;h_3h1?<h2?<h3?
所以大于nnnkkk都是沒(méi)用的,下文的kkk的數(shù)據(jù)范圍均可當(dāng)作小于等于nnn

然后就是次數(shù)不夠多的情況,我們發(fā)現(xiàn)有些要合并
考慮dp
fi,jf_{i,j}fi,j?表示用了前iii個(gè)數(shù),進(jìn)行了jjj次取合并的最大值
fi,j=max{max{(fk,j?1+∑l=k+1ihl)/(i?k+1)},fi?1,j}f_{i,j}=max\{max\{(f_{k,j-1}+\sum_{l=k+1}^ih_l)/(i-k+1)\},f_{i-1,j}\}fi,j?=max{max{(fk,j?1?+l=k+1i?hl?)/(i?k+1)},fi?1,j?}
不能忘記與fi?1,jf_{i-1,j}fi?1,j?取max,因?yàn)樵诖螖?shù)不夠的時(shí)候,并不一定所有數(shù)都要取
此處復(fù)雜度為O(n2kp)\mathcal O(n^2kp)O(n2kp)的,顯然不能通過(guò)
∑\sum改成前綴和相減的形式
設(shè)si=∑j=1ihjs_i=\sum_{j=1}^ih_jsi?=j=1i?hj?
fi,j=max{max{(fk,j?1+si?sk)/(i?k+1)},fi?1,j}f_{i,j}=max\{max\{(f_{k,j-1}+s_i-s_k)/(i-k+1)\},f_{i-1,j}\}fi,j?=max{max{(fk,j?1?+si??sk?)/(i?k+1)},fi?1,j?}
把j這一維提掉
newfi=max{max{(fk+si?sk)/(i?k+1)},newfi?1}newf_i=max\{max\{(f_k+s_i-s_k)/(i-k+1)\},newf_{i-1}\}newfi?=max{max{(fk?+si??sk?)/(i?k+1)},newfi?1?}
調(diào)整
newfi=max{max{(si?(sk?fk))/(i?(k?1))},newfi?1}newf_i=max\{max\{(s_i-(s_k-f_k))/(i-(k-1))\},newf_{i-1}\}newfi?=max{max{(si??(sk??fk?))/(i?(k?1))},newfi?1?}
變成斜率的形式
當(dāng)前點(diǎn)(i,si)(i,s_i)(i,si?)要找一個(gè)點(diǎn)(k?1,sk?fk)(k-1,s_k-f_k)(k?1,sk??fk?)使得他到我斜率最大
一個(gè)好想的方法是動(dòng)態(tài)維護(hù)凸包,然后三分即可復(fù)雜度O(n2lognp)\mathcal O(n^2lognp)O(n2lognp)
事實(shí)上不需要三分,我們發(fā)現(xiàn),如果新的斜率比上一個(gè)劣,是可以直接max上上一個(gè)的,由于每次詢問(wèn)的橫坐標(biāo)都增加了,如果更新了答案一定是在上次的決策右邊

如圖如果是當(dāng)前2的情況,斜率是沒(méi)有上一次優(yōu)的,如果是當(dāng)前1的情況,決策一定是在右邊
所以此處有決策單調(diào)性,不需要三分
目前復(fù)雜度為O(n2p)\mathcal O(n^2p)O(n2p)

  • 最優(yōu)答案的轉(zhuǎn)移過(guò)程中的i?ki-ki?k是單調(diào)不增的

比如
x+x12+x2+x33&lt;x+x1+x23+x32\frac{\frac{x+x_1}{2}+x_2+x_3}{3}&lt;\frac{\frac{x+x_1+x_2}{3}+x_3}{2}32x+x1??+x2?+x3??<23x+x1?+x2??+x3??
(x&lt;x1&lt;x2&lt;x3)(x&lt;x_1&lt;x_2&lt;x_3)(x<x1?<x2?<x3?)
一般化:
x+x1+???+xk?1k+xk+???+xnn?k+2&lt;x+x1+???+xkk+1+xk+1+???+xnn?k+1\frac{\frac{x+x_1+···+x_{k-1}}{k}+x_k+···+x_n}{n-k+2}&lt;\frac{\frac{x+x_1+···+x_k}{k+1}+x_{k+1}+···+x_n}{n-k+1}n?k+2kx+x1?+???+xk?1??+xk?+???+xn??<n?k+1k+1x+x1?+???+xk??+xk+1?+???+xn??
(x&lt;x1&lt;x2&lt;x3???&lt;xn,k&lt;n?k+1)(x&lt;x_1&lt;x_2&lt;x_3···&lt;x_n,k&lt;n-k+1)(x<x1?<x2?<x3????<xn?,k<n?k+1)
證明:
先由條件得到2k≤n2k\le n2kn
全部通分
(n?k+1)(x+x1+???+xk?1+k(xk+???+xn))&lt;(n?k+2)(x+x1+???+xk+(k+1)(xk+1+???+xn))(n-k+1)(x+x_1+···+x_{k-1}+k(x_k+···+x_n))&lt;(n-k+2)(x+x_1+···+x_k+(k+1)(x_{k+1}+···+x_n))(n?k+1)(x+x1?+???+xk?1?+k(xk?+???+xn?))<(n?k+2)(x+x1?+???+xk?+(k+1)(xk+1?+???+xn?))
移項(xiàng)(+式子美化)
0&lt;x+∑i=1k?1xi+(n?k+2?(n?k+1)k)xk+((n?k+2)(k+1)?(n?k+1)k)(∑i=k+1nxi)0&lt;x+\sum_{i=1}^{k-1}x_i+(n-k+2-(n-k+1)k)x_k+((n-k+2)(k+1)-(n-k+1)k)\left(\sum_{i=k+1}^nx_i\right)0<x+i=1k?1?xi?+(n?k+2?(n?k+1)k)xk?+((n?k+2)(k+1)?(n?k+1)k)(i=k+1n?xi?)
0&lt;x+∑i=1k?1xi+(n?2k+2?nk+kk)xk+(n+2)(∑i=k+1nxi)0&lt;x+\sum_{i=1}^{k-1}x_i+(n-2k+2-nk+kk)x_k+(n+2)\left(\sum_{i=k+1}^nx_i\right)0<x+i=1k?1?xi?+(n?2k+2?nk+kk)xk?+(n+2)(i=k+1n?xi?)
x+∑i=1k?1xi+(n?2k+2?nk+kk)xk+(n+2)(∑i=k+1nxi)&gt;x+∑i=1k?1xi+(n?2k+2?nk+kk)xk+(n+2)(n?k)xkx+\sum_{i=1}^{k-1}x_i+(n-2k+2-nk+kk)x_k+(n+2)\left(\sum_{i=k+1}^nx_i\right)&gt;x+\sum_{i=1}^{k-1}x_i+(n-2k+2-nk+kk)x_k+(n+2)(n-k)x_kx+i=1k?1?xi?+(n?2k+2?nk+kk)xk?+(n+2)(i=k+1n?xi?)>x+i=1k?1?xi?+(n?2k+2?nk+kk)xk?+(n+2)(n?k)xk?
······根據(jù)xk&lt;xk+1&lt;???&lt;xnx_k&lt;x_{k+1}&lt;···&lt;x_nxk?<xk+1?<???<xn?
x+∑i=1k?1xi+(n?2k+2?nk+kk)xk+(n+2)(n?k)xk&gt;(n?2k+2?nk+kk)xk+(n+2)(n?k)xkx+\sum_{i=1}^{k-1}x_i+(n-2k+2-nk+kk)x_k+(n+2)(n-k)x_k&gt;(n-2k+2-nk+kk)x_k+(n+2)(n-k)x_kx+i=1k?1?xi?+(n?2k+2?nk+kk)xk?+(n+2)(n?k)xk?>(n?2k+2?nk+kk)xk?+(n+2)(n?k)xk?
·····根據(jù)x&gt;0x&gt;0x>0減去一些正數(shù)會(huì)變小
(n?2k+2?nk+kk)xk+(n+2)(n?k)xk=(nn?2k+2n?nk+n?2k+2?nk+kk)xk=(n(n?k)?k(n?k)+2n?4k+n+2)&gt;0(n-2k+2-nk+kk)x_k+(n+2)(n-k)x_k=(nn-2k+2n-nk+n-2k+2-nk+kk)x_k=(n(n-k)-k(n-k)+2n-4k+n+2)&gt;0(n?2k+2?nk+kk)xk?+(n+2)(n?k)xk?=(nn?2k+2n?nk+n?2k+2?nk+kk)xk?=(n(n?k)?k(n?k)+2n?4k+n+2)>0
······根據(jù)2k≤n,n&gt;02k\le n,n&gt;02kn,n>0可得
至此證畢

  • 最優(yōu)答案的轉(zhuǎn)移過(guò)程中i?k&gt;1i-k&gt;1i?k>1的段數(shù)僅有O(lognhΔ)\mathcal O(log\frac{nh}{\Delta})O(logΔnh?)個(gè),Δ=mini{hi?hi?1}\Delta=min_i\{h_i-h_{i-1}\}Δ=mini?{hi??hi?1?}
    這個(gè)地方看了講稿也不懂了(看了很久都沒(méi)弄懂)


    貼個(gè)講稿的link
    這樣就只轉(zhuǎn)移14次
    此處有會(huì)證明的教教我啊
    最后復(fù)雜度的話就是O(nplognhΔ)\mathcal O(nplog\frac{nh}{\Delta})O(nplogΔnh?)

代碼

然后還要使用高精小數(shù)板子

代碼先鴿一會(huì)兒,很快就來(lái)

總結(jié)

體驗(yàn)好差233

總結(jié)

以上是生活随笔為你收集整理的[loj2087][NOI2016]国王饮水记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。