zoukankan      html  css  js  c++  java
  • 线段树POJ

    题意就是给你一段区间让你涂颜色,或者一段区间让你求颜色个数

    对于每一种颜色,将其用二进制状态来记录,合并的时候用 | 运算即可

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N=100010;
    
    struct node
    {
        int l,r;
        int color;
        int flag;
    } seg[N<<2];
    void build(int rt,int L,int R)
    {
        seg[rt].color=1;
        seg[rt].l=L;
        seg[rt].r=R;
        seg[rt].flag=1;
        if(seg[rt].l==seg[rt].r)
        {
            return;
        }
        int mid=(L+R)/2;
        build(rt*2,L,mid);
        build(rt*2+1,mid+1,R);
    }
    
    void pushup(int rt)
    {
        seg[rt].color=seg[rt*2].color | seg[2*rt+1].color;
    }
    void pushdown(int rt)
    {
        seg[rt*2].color=seg[rt].color;
        seg[rt*2].flag=1;
        seg[rt*2+1].color=seg[rt].color;
        seg[rt*2+1].flag=1;
        seg[rt].flag=0;
    }
    void update(int rt,int L,int R,int color)
    {
        if(seg[rt].r<L||seg[rt].l>R)
        {
            return;
        }
        if(seg[rt].l>=L&&seg[rt].r<=R)
        {
            seg[rt].color=color;
            seg[rt].flag=1;
            return;
        }
        if(seg[rt].color==color)
            return;
        if(seg[rt].flag)
            pushdown(rt);
        update(rt*2,L,R,color);
        update(rt*2+1,L,R,color);
        pushup(rt);
    }
    int sum;
    void query(int rt,int L,int R)
    {
        if(seg[rt].r<L||seg[rt].l>R)
        {
            return;
        }
        if(seg[rt].l>=L&&seg[rt].r<=R)
        {
            sum|=seg[rt].color;
            return;
        }
        if(seg[rt].flag)
        {
            sum|=seg[rt].color;
            return;
        }
        query(rt*2,L,R);
        query(rt*2+1,L,R);
    }
    
    int solve()
    {
        int ans=0;
        while(sum)
        {
            if(sum&1)
                ans++;
            sum>>=1;
        }
        return ans;
    }
    
    
    int main()
    {
    
        int L,T,O,a,b,c;
        char op[4];
        while(~scanf("%d%d%d",&L,&T,&O))
        {
            build(1,1,L);
            while(O--)
            {
                scanf("%s",op);
                if(op[0]=='C')
                {
                    scanf("%d%d%d",&a,&b,&c);
                    if(a>b)swap(a,b);
                    update(1,a,b,1<<(c-1));
                }
                else
                {
                    scanf("%d%d",&a,&b);
                    if(a>b)swap(a,b);
                    sum=0;
                    query(1,a,b);
                    printf("%d
    ",solve());
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    JavaScript借助xpath操纵xml数据(一)
    JavaScript借助xpath操纵xml数据(二)
    保留域——$$Return
    ExtJS中get、getDom、getCmp、getBody、getDoc使用 javascript
    关于编辑器编码保存为utf8问题
    query 用法
    简历模版(抛砖引玉)总觉得自己简历做得不够好的朋友请进来
    sql 查询慢的48个原因分析
    Word 实用技巧整理
    JAVA文件操作大全
  • 原文地址:https://www.cnblogs.com/Json-Five/p/9823186.html
Copyright © 2011-2022 走看看