Codeforces Round #590 (Div. 3)

Posted dongdong25800

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #590 (Div. 3)相关的知识,希望对你有一定的参考价值。

 

 

D

线段树染色问题简化版

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

const int maxn=1e5+10;
char s[maxn];
int a[maxn];

struct note

    int left,right,sum,lazy;
    void up(int val)
    
        sum=1<<(val-1);
        lazy=val;
    
 tree[maxn*4];
void pushup(int id)

    tree[id].sum=tree[id<<1].sum|tree[id<<1|1].sum;

void pushdown(int id)

    if(tree[id].lazy)
    
        tree[id<<1].up(tree[id].lazy);
        tree[id<<1|1].up(tree[id].lazy);
        tree[id].lazy=0;
    


void build(int id,int l,int r)

    tree[id].left=l;
    tree[id].right=r;
    if(l==r)
        tree[id].sum=1<<(a[l]-1);
    else
    
        int mid=(l+r)/2;
        build(id<<1,l,mid);
        build(id<<1|1,mid+1,r);
        pushup(id);
    

int query(int id,int l,int r)

    if(l<=tree[id].left&&tree[id].right<=r)
        return tree[id].sum;
    pushdown(id);
    int mid=(tree[id].left+tree[id].right)/2;
    int ans=0;
    if(l<=mid) ans|=query(id<<1,l,r);
    if(r>mid) ans|=query(id<<1|1,l,r);
    return ans;


void update(int id,int l,int r,int val)

    if(l<=tree[id].left&&tree[id].right<=r)
    
        tree[id].up(val);
        return;
    
    pushdown(id);
    int mid=(tree[id].left+tree[id].right)/2;
    if(l<=mid) update(id<<1,l,r,val);
    if(r>mid) update(id<<1|1,l,r,val);
    pushup(id);


int main()

    scanf("%s",s+1);
    int n;
    scanf("%d",&n);
    int len=strlen(s+1);
    for(int i=1; i<=len; i++)
        a[i]=s[i]-a+1;
    build(1,1,len);
    for(int i=1; i<=n; i++)
    
        int op;
        scanf("%d",&op);
        if(op==1)
        
            int pos;
            char val;
            scanf("%d %c",&pos,&val);
            update(1,pos,pos,val-a+1);
        
        else
        
            int l,r;
            scanf("%d%d",&l,&r);
            int sum=query(1,l,r);
            int ans=0;
            while(sum>0)
            
                if(sum&1) ans++;
                sum=sum>>1;
            
            printf("%d\n",ans);
        
    

 

以上是关于Codeforces Round #590 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #590 (Div. 3)

Codeforces Round #590 (Div. 3) C. Pipes

Codeforces Round #590 (Div. 3)

Codeforces Round #590 (Div. 3)

CodeForces Round #590 (Div 3)

Codeforces Round #590 (Div. 3)