zoukankan      html  css  js  c++  java
  • 数轴染色(我个渣渣)

    #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;
    }

  • 相关阅读:
    【HDU6609】Find the answer【线段树】
    【HDU6602】Longest Subarray【线段树+分治】
    PCIe
    NVMe Windows 支持情况
    PCIe/NVMe Soft Protocol Analyzer
    I am coming..
    hibernate自动建表技术_采用数据库反向生成技术
    struts2的执行流程
    oracle中scott用户下四个基本表SQL语句练习
    SQL语句中的having和where的区别
  • 原文地址:https://www.cnblogs.com/ling-0-ling/p/5470003.html
Copyright © 2011-2022 走看看