Solution
我们考虑在第 (i) 步时,如果此时是 (Allen) ,他会将 (x_s=t) ( (0leq sleq n,0leq tleq 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
",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
",1.0*sum/(1<<n));
}
return 0;
}