D. Playoff Tournament
Posted thusloop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Playoff Tournament相关的知识,希望对你有一定的参考价值。
D. Playoff Tournament
Example
inputCopy
3
0110?11
6
5 1
6 ?
7 ?
1 ?
5 ?
1 1
outputCopy
1
2
3
3
5
4
线段树nlogn
遇到 ? 该节点的值为左子树加右子树
遇到 1 该节点的值为右子树
遇到 0 该节点的值为左子树
#include<bits/stdc++.h>
#define int long long
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=(1<<18)+100;
int a[maxn];
char s[maxn];
map<int,int>mp,mp2;//映射:最后一场比赛对应线段树节点1 最后两场对应 2 3 以此类推
struct node
{
int l,r,sum;
char op;
} t[maxn*4];
void build(int l,int r,int k)
{
t[k].l=l;
t[k].r=r;
t[k].op=s[mp2[k]];
if(l==r)
{
t[k].sum=1;
return ;
}
int mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
if(t[k].op=='?')t[k].sum=t[k<<1|1].sum+t[k<<1].sum;
if(t[k].op=='1')t[k].sum=t[k<<1|1].sum;
if(t[k].op=='0')t[k].sum=t[k<<1].sum;
}
signed main()
{
IOS
int k,q;
cin>>k;;
cin>>(s+1);
cin>>q;
int n=(1<<k)-1;
int cnt=1;
int num=0;
int sm=1;
while(sm!=n)
{
for(int i=n-sm+1; i<=n-sm+1+cnt-1; i++)
{
mp[i]=++num;
mp2[num]=i;
}
cnt=cnt*2;
sm+=cnt;
}
for(int i=n-sm+1; i<=n-sm+1+cnt-1; i++)
{
mp[i]=++num;
mp2[num]=i;
}
build(1,n+1,1);
//for(int i=1;i<=7;i++)cout<<t[i].sum<<" ";
//for(int i=8;i<=15;i++)cout<<t[i].sum<<" ";
while(q--)
{
int id;
string str;
cin>>id>>str;
s[id]=str[0];
t[mp[id]].op=str[0];
int p=mp[id];
while(p!=1)
{
if(t[p].op=='?')t[p].sum=t[p<<1|1].sum+t[p<<1].sum;
if(t[p].op=='1')t[p].sum=t[p<<1|1].sum;
if(t[p].op=='0')t[p].sum=t[p<<1].sum;
p=p>>1;
}
if(t[p].op=='?')t[p].sum=t[p<<1|1].sum+t[p<<1].sum;
if(t[p].op=='1')t[p].sum=t[p<<1|1].sum;
if(t[p].op=='0')t[p].sum=t[p<<1].sum;
cout<<t[1].sum<<"\\n";
}
}
以上是关于D. Playoff Tournament的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 110 (Rated for Div. 2) D. Playoff Tournament
Educational Codeforces Round 110 (Rated for Div. 2) D. Playoff Tournament (线段树,模拟)
Educational Codeforces Round 110 (Rated for Div. 2)- D.Playoff Tournament -建树维护