D. Playoff Tournament
模拟题
链接
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
char str[N] ;
int tr[N] ;
int n ;
void pu_up(int u)
{
if(u == 1 ) return ;
int p = u >> 1 ;
if(str[n - p + 1 ] == '?') tr[p] = tr[p << 1 ] + tr[p << 1 | 1 ] ;
else if(str[n - p + 1 ] == '1') tr[p] = tr[p << 1 ] ;
else tr[p] = tr[p << 1 | 1 ];
pu_up(p) ;
}
int main()
{
cin>>n;
scanf("%s" , str + 1 ) ;
n = (1 << n )- 1 ;
for(int i = n ; i ; i -- )
{
if(i * 2 > n )
{
tr[i] = 1 + (str[n - i + 1 ] == '?');
}
else
{
if(str[n - i + 1 ] == '?')
{
tr[i] = tr[i << 1 ] +tr[i << 1 | 1 ] ;
}
else if(str[n - i + 1 ] == '1')
{
tr[i] = tr[i << 1 ];
}
else tr[i] = tr[i << 1 | 1 ];
}
}
int p ;
cin>>p;
while(p -- )
{
int f ;
char k ;
cin>>f>>k;
f = n - f + 1 ;
str[n - f + 1 ] = k ;
if(f *2 > n )
{
tr[f] = 1 + (k == '?');
}
else
{
if(str[n - f + 1 ] == '?')
{
tr[f] = tr[f << 1 ] +tr[f << 1 | 1 ] ;
}
else if(str[n - f + 1 ] == '1')
{
tr[f] = tr[f << 1 ];
}
else tr[f] = tr[f << 1 | 1 ];
}
pu_up(f);
cout<<tr[1]<<endl;
}
}