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);
}
标签:Educational,Rated,--,Codeforces,else,int,pos
From: https://www.cnblogs.com/ycllz/p/16843800.html