题目链接
题意:
前去洛谷自行观看吧链接放上了:https://www.luogu.com.cn/problem/CF1535D
分析:
正向并不能看出来什么,反向的话就是构成了一颗线段树,直接维护这棵树的顶端既是结果.
ll n,m,ans[maxn];
char str[maxn],s[maxn];
void build(ll num,ll l,ll r){
if(l==r){
ans[num]=1;
return ;
}
ll mid=(l+r)/2;
build(num*2,l,mid);
build(num*2+1,mid+1,r);
if(s[num]=='0') ans[num]=ans[num*2+1];
else if(s[num]=='1') ans[num]=ans[num*2];
else if(s[num]=='?') ans[num] = ans[num*2]+ans[num*2+1];
}
void solve()
{
scanf("%lld%s",&n,str+1);
ll len=(1<<n);
for(int i=1;i<len;i++){
s[i]=str[len-i];
}
build(1,1,len);
scanf("%lld",&m);
for(int i=1;i<=m;i++){
ll x;
char ch[3];
//cin>>x>>ch;
scanf("%lld%s",&x,ch+1);
x=len-x;
s[x]=ch[1];
while(x){
if(s[x]=='0') ans[x]=ans[x*2+1];
else if(s[x]=='1') ans[x]=ans[x*2];
else ans[x]=ans[x*2]+ans[x*2+1];
x=x/2;
}
cout<<ans[1]<<endl;
}
}