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;
}