• 数轴染色(我个渣渣)


    #include<iostream>
    #include<cstdio>
    using namespace std;
    struct data
    {    int l,r,sum;

        bool tag;
    }tr[8500001];
    int n,m;
    void build(int k,int s,int t)
    {
        tr[k].l=s;
        tr[k].r=t;
        if(s==t)
        {
              tr[k].sum=1;
              return;
        }
    int mid=(s+t)>>1;
         build(k<<1,s,mid);//build(k<<1|1,mid+1,t);//任意一个偶数经过 k<<1|1 处理后就是加一
         build((k<<1)+1,mid+1,t);//必须加() 因为<<的运算级比较小 比 + - 还小
    //二进制 或 如 (5)0101或0001 (1) ——>0101
         tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
    }
    void update(int k,int s,int t)
    {
         if(tr[k].tag)
         {
              tr[k].sum=0;//清零,因为都被记成白点了啊。
              tr[k<<1].tag=tr[k<<1|1].tag=1;//左右子树的tag标记为白点
              return;
    }
          int l=tr[k].l,r=tr[k].r;
          if(s==l&&t==r)//s,t是左右
          {
                tr[k].tag=1;//标记为白点
                tr[k].sum=0;
                return;
          }
          int mid=(l+r)>>1;
             if(t<=mid)update(k<<1,s,t);//
            else if(s>mid)update(k<<1|1,s,t);
                  else
                  {
                       update(k<<1,s,mid);
                       update(k<<1|1,mid+1,t);
                  }
             tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
    }
    int main()
    {

         scanf("%d %d",&n,&m);

           build(1,1,n);
         for(int i=1;i<=m;i++)
         {
              int l,r;
              scanf("%d %d",&l,&r);
              update(1,l,r);
             printf("%d ",tr[1].sum);
        }
    return 0;
    }

  • 相关阅读:
    STL
    Python
    Swift学习笔记
    Swift学习笔记
    Cocos2d-x -- 如何让背景从上到下滚动
    Cocos2d-x -- 图片菜单按钮
    How to change in the Cocos2d-x project from landscape to portrait both in iOS and Android
    系统集成项目管理工程师和信息系统管理工程师的区别是什么?
    公积金取出来后悔了 公积金取出来好还是不取好?
    青岛公积金贷款额度最高多少?怎么算?
  • 原文地址:https://www.cnblogs.com/ling-0-ling/p/5470003.html
Copyright © 2020-2023  润新知