AGC044E Pandom Pawn(期望+凸包)

最开始我们先旋转一下这张桌子,使得 A 1 = A n + 1 = max ⁡ { A i } A_1=A_{n+1}=\max\{A_i\} A1=An+1=max{Ai}

这是非常有效的,因为我们把环就变成链,只要到达了链的任意一端 1 / n + 1 1/n+1 1/n+1 就肯定会结束游戏。

定义 E i : E_i: Ei: i i i 开始游戏,运用最优策略,结束游戏的期望收益。

显然, E 1 = A 1 , E n + 1 = A n + 1 , ∀ 1 ≤ i ≤ n E i = max ⁡ ( A i , E i − 1 + E i + 1 2 − B i ) 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,1inEi=max(Ai,2Ei1+Ei+1Bi)


简化问题,假设没有这个 B i B_i Bi 存在。

i i i 看成 ( i , A i ) (i,A_i) (i,Ai) 放到二维平面内,则答案 E i E_i Ei 就是 i i i 为横坐标时在这些点维护出的凸壳上的纵坐标。

画画图就知道了。

维护凸壳以及求解答案是可以在线性时间内完成的。


考虑将当前复杂问题往简单问题上靠拢。

能否构造出一个新形式的 F i F_i Fi B i B_i Bi 抵消掉,即 F i = max ⁡ ( G i , F i − 1 + F i + 1 2 ) F_i=\max\Big(G_i,\frac{F_{i-1}+F_{i+1}}2\Big) Fi=max(Gi,2Fi1+Fi+1),再通过 F i F_i Fi 反推回 E i E_i Ei

E i − C i = max ⁡ ( A i − C i , E i − 1 + E i + 1 2 − C i − B i ) ⇕ E_i-C_i=\max\Big(A_i-C_i,\frac{E_{i-1}+E_{i+1}}2-C_i-B_i\Big)\\ \Updownarrow EiCi=max(AiCi,2Ei1+Ei+1CiBi) E i − C i = max ⁡ ( A i − C i , E i − 1 − C i − 1 + E i + 1 − C i + 1 2 + C i − 1 + C i + 1 2 − C i − B i ) 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) EiCi=max(AiCi,2Ei1Ci1+Ei+1Ci+1+2Ci1+Ci+1CiBi)

(因为 B i B_i Bi 是常量,前面的系数是不带 i i i 的任一次方的,所以我们构造的时候应该先考虑不出现带 i i i 系数的形式)

发现只要令 ∀ 1 ≤ i ≤ n C i − 1 + C i + 1 2 − C i − B i = 0 \forall_{1\le i\le n}\frac{C_{i-1}+C_{i+1}}2-C_i-B_i=0 1in2Ci1+Ci+1CiBi=0 就能达到目的。

⇒ C i − C i − 1 + 2 B i = C i + 1 − C i \Rightarrow C_i-C_{i-1}+2B_i=C_{i+1}-C_i CiCi1+2Bi=Ci+1Ci C 2 = C 1 = 0 C_2=C_1=0 C2=C1=0,这样 C C C 就递推出来了。

F i = E i − C i F_i=E_i-C_i Fi=EiCi,则 F i = max ⁡ ( A i − C i , F i − 1 + F i + 1 2 ) F_i=\max\Big(A_i-C_i,\frac{F_{i-1}+F_{i+1}}2\Big) Fi=max(AiCi,2Fi1+Fi+1),以 ( i , F i ) (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 line
        if 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB PAWN是基于全局灵敏度分析算法PAWN的MATLAB实现的工具。它可以用于评估模型中参数对输出的敏感性。PAWN方法考虑整个模型输出分布来描述输出的不确定性,并与Sobol方法进行比较。Sobol方法是一种基于方差的敏感性分析方法,而PAWN方法使用了更全面的输出分布信息。通过应用PAWN方法,可以对模型中的参数进行排序,以确定哪些参数对模型输出的影响最大。此外,PAWN还提供了评估和比较参数排序结果的相关演变、收敛性和计算成本等方面的指标。[1,3]<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PAWN Global Sensitivity Analysis algorithm:全局灵敏度分析算法PAWN的MATLAB实现-matlab开发](https://download.csdn.net/download/weixin_38734008/19196355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MATLAB全局敏感性分析(包括dynia、eet、fast、glue、pawn、rsa、vbsa方法)](https://download.csdn.net/download/qq_25262697/86952961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [优化算法——全局灵敏度分析算法(PAWN )(Matlab代码实现)](https://blog.csdn.net/weixin_46039719/article/details/126429368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值