日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[loj2087][NOI2016]国王饮水记

發布時間:2024/4/11 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [loj2087][NOI2016]国王饮水记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

回歸OI,隨便找一道清真dp題寫寫吧
做完發現一點都不清真

題目相關

鏈接

題目大意

現在有nnn個數,每次可以取若干個數,將每個數賦成平均值,限制kkk次,問第一個數最大能變成多少

數據范圍

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

題解

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&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??
(因為h1&lt;h2,h1&lt;h3h_1&lt;h_2,h_1&lt;h_3h1?<h2?,h1?<h3?

  • 使用完一個數后,這個數將不會再被使用

根據取平均的性質,再根據第一條可得

  • 如果次數足夠多,那一定是從小到大一個個一次與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都是沒用的,下文的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+1i?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&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?))
移項(+式子美化)
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?
······根據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?
·····根據x&gt;0x&gt;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)&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
······根據2k≤n,n&gt;02k\le n,n&gt;02kn,n>0可得
至此證畢

  • 最優答案的轉移過程中i?k&gt;1i-k&gt;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]国王饮水记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。