Educational Codeforces Round 110 (Rated for Div. 2) D

D. Playoff Tournament

观察完题 发现没改变一个 只会修改自己及以上的权值
所以我们直接暴力qlogn
但是这个题恶心的就是他那个是倒着给的
我们要reverse一遍
注意这时候因为反了一遍 左右子树也会反

#include <bits/stdc++.h>
using namespace std;
const int N = (1<<18)+10;
const int M = 998244353;
const int mod = 1e9+7;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
string s;
int n,a[N];
void dfs(int pos){
    if(pos==0)return;
    if(s[pos]=='?')a[pos]=a[pos<<1|1]+a[pos<<1];
    else if(s[pos]=='1')a[pos]=a[pos<<1];
    else a[pos]=a[pos<<1|1];
    dfs(pos>>1);
}
void solve(){
    cin>>n>>s;std::reverse(s.begin(), s.end());s=")"+s;
    n=(1<<n)-1;
    for(int i=n;i>=1;i--){
        if((i<<1)>n){
            (s[i]=='?')?a[i]=2:a[i]=1;
        }else{
            if(s[i]=='?')a[i]=a[i<<1]+a[i<<1|1];
            else if(s[i]=='1')a[i]=a[i<<1];
            else a[i]=a[i<<1|1];
        }
    }
    int q;cin>>q;
    while(q--){
        int pos;char x;cin>>pos>>x;
        pos=n-pos+1;
        if((pos<<1)>n){
            if(x=='?')a[pos]=2;
            else a[pos]=1;
        }else{
            if(x=='?')a[pos]=a[pos<<1|1]+a[pos<<1];
            else if(x=='1')a[pos]=a[pos<<1];
            else a[pos]=a[pos<<1|1];
        }
        dfs(pos>>1);
        s[pos]=x;
        cout<<a[1]<<endl;
    }
}
signed main(){
    fast
    int t;t=1;//cin>>t;
    while(t--) {
        solve();
    }
    return ~~(0^_^0);
}
posted @ 2022-10-31 11:47  ycllz  阅读(37)  评论(0)    收藏  举报