CF995D Game

Solution

我们考虑在第 \(i\) 步时,如果此时是 \(Allen\) ,他会将 \(x_s=t\) ( \(0\leq s\leq n,0\leq t\leq 1\) ),此时的 \(v_{s,t}\) 为最大,那么 \(v_{v,1-t}\) 就是最小的,也就是 \(Bessie\) 所做的。

我们递归可以知道,每一步会有两种不同的情况,那么到最后的时候, \(2^n\) 种情况应该都会出现。

所以 \(f=\dfrac {sum}{2^n}\) ,当某个 \(z\) 的值换成 \(g\) 时, \(f'=\dfrac {sum-c_z+g}{2^n}\)

代码

#include<bits/stdc++.h>
#define ll long long

using namespace std;
const ll N=1<<18;
ll a[N],sum,n,r,z,g;

int main(){
    cin>>n>>r;
    for(int i=0;i<=(1<<n)-1;i++){
        cin>>a[i];
        sum+=a[i];
    }
    printf("%.6lf\n",1.0*sum/(1<<n));
    for(int i=1,x,y;i<=r;i++){
        cin>>x>>y;
        sum-=a[x];sum+=a[x]=y;
        printf("%.6lf\n",1.0*sum/(1<<n));
    }
    return 0;
}
posted @ 2020-10-06 10:15  jasony_sam  阅读(135)  评论(0编辑  收藏  举报