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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AGC044E Pandom Pawn(期望+凸包)

發布時間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AGC044E Pandom Pawn(期望+凸包) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最開始我們先旋轉一下這張桌子,使得 A1=An+1=max?{Ai}A_1=A_{n+1}=\max\{A_i\}A1?=An+1?=max{Ai?}

這是非常有效的,因為我們把環就變成鏈,只要到達了鏈的任意一端 1/n+11/n+11/n+1 就肯定會結束游戲。

定義 Ei:E_i:Ei?:iii 開始游戲,運用最優策略,結束游戲的期望收益。

顯然,E1=A1,En+1=An+1,?1≤i≤nEi=max?(Ai,Ei?1+Ei+12?Bi)E_1=A_1,E_{n+1}=A_{n+1},\forall_{1\le i\le n}E_{i}=\max\Big(A_{i},\frac{E_{i-1}+E_{i+1}}2-B_i\Big)E1?=A1?,En+1?=An+1?,?1in?Ei?=max(Ai?,2Ei?1?+Ei+1???Bi?)。


簡化問題,假設沒有這個 BiB_iBi? 存在。

iii 看成 (i,Ai)(i,A_i)(i,Ai?) 放到二維平面內,則答案 EiE_iEi? 就是 iii 為橫坐標時在這些點維護出的凸殼上的縱坐標。

畫畫圖就知道了。

維護凸殼以及求解答案是可以在線性時間內完成的。


考慮將當前復雜問題往簡單問題上靠攏。

能否構造出一個新形式的 FiF_iFi?BiB_iBi? 抵消掉,即 Fi=max?(Gi,Fi?1+Fi+12)F_i=\max\Big(G_i,\frac{F_{i-1}+F_{i+1}}2\Big)Fi?=max(Gi?,2Fi?1?+Fi+1??),再通過 FiF_iFi? 反推回 EiE_iEi?

Ei?Ci=max?(Ai?Ci,Ei?1+Ei+12?Ci?Bi)?E_i-C_i=\max\Big(A_i-C_i,\frac{E_{i-1}+E_{i+1}}2-C_i-B_i\Big)\\ \UpdownarrowEi??Ci?=max(Ai??Ci?,2Ei?1?+Ei+1???Ci??Bi?)?Ei?Ci=max?(Ai?Ci,Ei?1?Ci?1+Ei+1?Ci+12+Ci?1+Ci+12?Ci?Bi)E_i-C_i=\max\Big(A_i-C_i,\frac{E_{i-1}-C_{i-1}+E_{i+1}-C_{i+1}}2+\frac{C_{i-1}+C_{i+1}}2-C_i-B_i\Big)Ei??Ci?=max(Ai??Ci?,2Ei?1??Ci?1?+Ei+1??Ci+1??+2Ci?1?+Ci+1???Ci??Bi?)

(因為 BiB_iBi? 是常量,前面的系數是不帶 iii 的任一次方的,所以我們構造的時候應該先考慮不出現帶 iii 系數的形式)

發現只要令 ?1≤i≤nCi?1+Ci+12?Ci?Bi=0\forall_{1\le i\le n}\frac{C_{i-1}+C_{i+1}}2-C_i-B_i=0?1in?2Ci?1?+Ci+1???Ci??Bi?=0 就能達到目的。

?Ci?Ci?1+2Bi=Ci+1?Ci\Rightarrow C_i-C_{i-1}+2B_i=C_{i+1}-C_i?Ci??Ci?1?+2Bi?=Ci+1??Ci?C2=C1=0C_2=C_1=0C2?=C1?=0,這樣 CCC 就遞推出來了。

Fi=Ei?CiF_i=E_i-C_iFi?=Ei??Ci?,則 Fi=max?(Ai?Ci,Fi?1+Fi+12)F_i=\max\Big(A_i-C_i,\frac{F_{i-1}+F_{i+1}}2\Big)Fi?=max(Ai??Ci?,2Fi?1?+Fi+1??),以 (i,Fi)(i,F_i)(i,Fi?) 構造凸殼即可線性求解。

先維護出凸殼,后再挨個求縱坐標。

#include <bits/stdc++.h> using namespace std; #define int long long #define double long double #define maxn 200005 int A[maxn], B[maxn], C[maxn], s[maxn]; double ans; int n;signed main() {scanf( "%lld", &n );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &A[i] );for( int i = 1;i <= n;i ++ ) scanf( "%lld", &B[i] );int id = max_element( A + 1, A + n + 1 ) - A;rotate( A + 1, A + id, A + n + 1 );rotate( B + 1, B + id, B + n + 1 );A[n + 1] = A[1], B[n + 1] = B[1];for( int i = 3;i <= n + 1;i ++ ) C[i] = ( B[i - 1] + C[i - 1] << 1 ) - C[i - 2];for( int i = 1;i <= n + 1;i ++ ) A[i] -= C[i];int top = 0;s[++ top] = 1;for( int i = 2;i <= n + 1;i ++ ) {while( top and (A[i] - A[s[top]]) * (s[top] - s[top - 1]) > (A[s[top]] - A[s[top - 1]]) * (i - s[top]) ) top --;/*( A[i]-A[s[top]] ) / ( i-s[top] ) k1 of new line( A[s[top]]-A[s[top-1]] ) / ( s[top]-s[top-1]) k1 of latest lineif k1>k2 throw k2*/s[++ top] = i;}double ans = 0;top = 0;for( int i = 1;i <= n;i ++ ) {if( s[top + 1] == i ) top ++;ans += (A[s[top + 1]] - A[s[top]]) * 1.0 / (s[top + 1] - s[top] ) * (i - s[top]) + A[s[top]];//將凸包上的一條邊抽變成從原點開始計算ans += C[i];}printf( "%.12Lf\n", ans / n );return 0; }

總結

以上是生活随笔為你收集整理的AGC044E Pandom Pawn(期望+凸包)的全部內容,希望文章能夠幫你解決所遇到的問題。

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