[loj2087][NOI2016]国王饮水记
前言
回歸OI,隨便找一道清真dp題寫寫吧
做完發(fā)現(xiàn)一點都不清真
題目相關(guān)
鏈接
題目大意
現(xiàn)在有nnn個數(shù),每次可以取若干個數(shù),將每個數(shù)賦成平均值,限制kkk次,問第一個數(shù)最大能變成多少
數(shù)據(jù)范圍
n≤1000,k≤109n\le1000,k\le10^9n≤1000,k≤109
另外,精度要求ppp位,3≤p≤30003\le p\le30003≤p≤3000
題解
設(shè)nnn個數(shù)為h1,h2,h3???hnh_1,h_2,h_3···h_nh1?,h2?,h3????hn?
- 對于?i∈[2,n]\forall i\in[2,n]?i∈[2,n]滿足hi≤h1h_i\le h_1hi?≤h1?,這個數(shù)肯定不會被使用
這個很好證明,hih_ihi?與大于h1h_1h1?的數(shù)取平均只會讓那些數(shù)變小,不優(yōu),hih_ihi?與小于等于h1h_1h1?的數(shù)取平均不會讓他們變得大于h1h_1h1?
- 每次取平均一定是包含h1h_1h1?的
由于上一條我們已知,取平均的一定比h1h_1h1?大,那就有
h1+h2+h322<h1+h2+h33\frac{h_1+\frac{h_2+h_3}2}2<\frac{h_1+h_2+h_3}32h1?+2h2?+h3???<3h1?+h2?+h3??
(因為h1<h2,h1<h3h_1<h_2,h_1<h_3h1?<h2?,h1?<h3?)
- 使用完一個數(shù)后,這個數(shù)將不會再被使用
根據(jù)取平均的性質(zhì),再根據(jù)第一條可得
- 如果次數(shù)足夠多,那一定是從小到大一個個一次與h1h_1h1?取平均的
h1+h22+h32>h1+h2+h33\frac{\frac{h_1+h_2}2+h_3}2>\frac{h_1+h_2+h_3}322h1?+h2??+h3??>3h1?+h2?+h3??
(h1<h2<h3h_1<h_2<h_3h1?<h2?<h3?)
所以大于nnn的kkk都是沒用的,下文的kkk的數(shù)據(jù)范圍均可當(dāng)作小于等于nnn
然后就是次數(shù)不夠多的情況,我們發(fā)現(xiàn)有些要合并
考慮dp
fi,jf_{i,j}fi,j?表示用了前iii個數(shù),進行了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+1∑i?hl?)/(i?k+1)},fi?1,j?}
不能忘記與fi?1,jf_{i-1,j}fi?1,j?取max,因為在次數(shù)不夠的時候,并不一定所有數(shù)都要取
此處復(fù)雜度為O(n2kp)\mathcal O(n^2kp)O(n2kp)的,顯然不能通過
把∑\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)前點(i,si)(i,s_i)(i,si?)要找一個點(k?1,sk?fk)(k-1,s_k-f_k)(k?1,sk??fk?)使得他到我斜率最大
一個好想的方法是動態(tài)維護凸包,然后三分即可復(fù)雜度O(n2lognp)\mathcal O(n^2lognp)O(n2lognp)
事實上不需要三分,我們發(fā)現(xiàn),如果新的斜率比上一個劣,是可以直接max上上一個的,由于每次詢問的橫坐標都增加了,如果更新了答案一定是在上次的決策右邊
如圖如果是當(dāng)前2的情況,斜率是沒有上一次優(yōu)的,如果是當(dāng)前1的情況,決策一定是在右邊
所以此處有決策單調(diào)性,不需要三分
目前復(fù)雜度為O(n2p)\mathcal O(n^2p)O(n2p)
- 最優(yōu)答案的轉(zhuǎn)移過程中的i?ki-ki?k是單調(diào)不增的
比如
x+x12+x2+x33<x+x1+x23+x32\frac{\frac{x+x_1}{2}+x_2+x_3}{3}<\frac{\frac{x+x_1+x_2}{3}+x_3}{2}32x+x1??+x2?+x3??<23x+x1?+x2??+x3??
(x<x1<x2<x3)(x<x_1<x_2<x_3)(x<x1?<x2?<x3?)
一般化:
x+x1+???+xk?1k+xk+???+xnn?k+2<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}<\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<x1<x2<x3???<xn,k<n?k+1)(x<x_1<x_2<x_3···<x_n,k<n-k+1)(x<x1?<x2?<x3????<xn?,k<n?k+1)
證明:
先由條件得到2k≤n2k\le n2k≤n
全部通分
(n?k+1)(x+x1+???+xk?1+k(xk+???+xn))<(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))<(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?))
移項(+式子美化)
0<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<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=1∑k?1?xi?+(n?k+2?(n?k+1)k)xk?+((n?k+2)(k+1)?(n?k+1)k)(i=k+1∑n?xi?)
0<x+∑i=1k?1xi+(n?2k+2?nk+kk)xk+(n+2)(∑i=k+1nxi)0<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=1∑k?1?xi?+(n?2k+2?nk+kk)xk?+(n+2)(i=k+1∑n?xi?)
x+∑i=1k?1xi+(n?2k+2?nk+kk)xk+(n+2)(∑i=k+1nxi)>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)>x+\sum_{i=1}^{k-1}x_i+(n-2k+2-nk+kk)x_k+(n+2)(n-k)x_kx+i=1∑k?1?xi?+(n?2k+2?nk+kk)xk?+(n+2)(i=k+1∑n?xi?)>x+i=1∑k?1?xi?+(n?2k+2?nk+kk)xk?+(n+2)(n?k)xk?
······根據(jù)xk<xk+1<???<xnx_k<x_{k+1}<···<x_nxk?<xk+1?<???<xn?
x+∑i=1k?1xi+(n?2k+2?nk+kk)xk+(n+2)(n?k)xk>(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>(n-2k+2-nk+kk)x_k+(n+2)(n-k)x_kx+i=1∑k?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>0x>0x>0減去一些正數(shù)會變小
(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(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)>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>02k\le n,n>02k≤n,n>0可得
至此證畢
- 最優(yōu)答案的轉(zhuǎn)移過程中i?k>1i-k>1i?k>1的段數(shù)僅有O(lognhΔ)\mathcal O(log\frac{nh}{\Delta})O(logΔnh?)個,Δ=mini{hi?hi?1}\Delta=min_i\{h_i-h_{i-1}\}Δ=mini?{hi??hi?1?}
這個地方看了講稿也不懂了(看了很久都沒弄懂)
貼個講稿的link
這樣就只轉(zhuǎn)移14次
此處有會證明的教教我啊
最后復(fù)雜度的話就是O(nplognhΔ)\mathcal O(nplog\frac{nh}{\Delta})O(nplogΔnh?)
代碼
然后還要使用高精小數(shù)板子
代碼先鴿一會兒,很快就來
總結(jié)
體驗好差233
總結(jié)
以上是生活随笔為你收集整理的[loj2087][NOI2016]国王饮水记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZJOI2019赛季回顾
- 下一篇: 主定理(master theorem)学