[loj2087][NOI2016]国王饮水记
前言
回歸OI,隨便找一道清真dp題寫寫吧
做完發現一點都不清真
題目相關
鏈接
題目大意
現在有nnn個數,每次可以取若干個數,將每個數賦成平均值,限制kkk次,問第一個數最大能變成多少
數據范圍
n≤1000,k≤109n\le1000,k\le10^9n≤1000,k≤109
另外,精度要求ppp位,3≤p≤30003\le p\le30003≤p≤3000
題解
設nnn個數為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?,這個數肯定不會被使用
這個很好證明,hih_ihi?與大于h1h_1h1?的數取平均只會讓那些數變小,不優,hih_ihi?與小于等于h1h_1h1?的數取平均不會讓他們變得大于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?)
- 使用完一個數后,這個數將不會再被使用
根據取平均的性質,再根據第一條可得
- 如果次數足夠多,那一定是從小到大一個個一次與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的數據范圍均可當作小于等于nnn
然后就是次數不夠多的情況,我們發現有些要合并
考慮dp
fi,jf_{i,j}fi,j?表示用了前iii個數,進行了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,因為在次數不夠的時候,并不一定所有數都要取
此處復雜度為O(n2kp)\mathcal O(n^2kp)O(n2kp)的,顯然不能通過
把∑\sum∑改成前綴和相減的形式
設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?}
調整
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?}
變成斜率的形式
當前點(i,si)(i,s_i)(i,si?)要找一個點(k?1,sk?fk)(k-1,s_k-f_k)(k?1,sk??fk?)使得他到我斜率最大
一個好想的方法是動態維護凸包,然后三分即可復雜度O(n2lognp)\mathcal O(n^2lognp)O(n2lognp)
事實上不需要三分,我們發現,如果新的斜率比上一個劣,是可以直接max上上一個的,由于每次詢問的橫坐標都增加了,如果更新了答案一定是在上次的決策右邊
如圖如果是當前2的情況,斜率是沒有上一次優的,如果是當前1的情況,決策一定是在右邊
所以此處有決策單調性,不需要三分
目前復雜度為O(n2p)\mathcal O(n^2p)O(n2p)
- 最優答案的轉移過程中的i?ki-ki?k是單調不增的
比如
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?
······根據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?
·····根據x>0x>0x>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(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
······根據2k≤n,n>02k\le n,n>02k≤n,n>0可得
至此證畢
- 最優答案的轉移過程中i?k>1i-k>1i?k>1的段數僅有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
這樣就只轉移14次
此處有會證明的教教我啊
最后復雜度的話就是O(nplognhΔ)\mathcal O(nplog\frac{nh}{\Delta})O(nplogΔnh?)
代碼
然后還要使用高精小數板子
代碼先鴿一會兒,很快就來
總結
體驗好差233
總結
以上是生活随笔為你收集整理的[loj2087][NOI2016]国王饮水记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZJOI2019赛季回顾
- 下一篇: 主定理(master theorem)学