zoukankan      html  css  js  c++  java
  • 专项训练之线段树

    洛谷 P1047 校门外的树

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define N 40000
    struct node{int le,ri,s;}t[N];
    bool vis[N];
    void build(int le,int ri,int k)
    {
        int mid=(le+ri)>>1;
        t[k].le=le,t[k].ri=ri,t[k].s=0;
        if(le==ri){t[k].s=1;return ;}
        build(le,mid,k*2);build(mid+1,ri,k*2+1);
        t[k].s=t[2*k].s+t[2*k+1].s;    
    }
    void update(int le,int ri,int k)
    {
        int mid=(t[k].le+t[k].ri)>>1;
        if(t[k].le==t[k].ri){t[k].s--;vis[k]=1;return;}
        if(ri<=mid&&!vis[2*k])update(le,ri,2*k);
        else if(le>mid&&!vis[2*k+1])update(le,ri,2*k+1);
             else
             {
                 if(!vis[2*k]&&le<=mid)update(le,mid,2*k);
                 if(!vis[2*k+1]&&ri>mid)update(mid+1,ri,2*k+1);
             }
        t[k].s=t[2*k].s+t[2*k+1].s;
        if(t[k].s==0)vis[k]=1;
    }
    int n,m,le,ri;
    int main()
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        build(0,n,1);//是从0开始的
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&le,&ri);
            update(le,ri,1);
        }
        printf("%d
    ",t[1].s);
        return 0;
    }

    codevs 1191 数轴染色

    #include<cstdio>
    #include<cstring>
    #define N 800000
    struct node{int le,ri,s;}t[N];
    bool vis[N];
    void build(int le,int ri,int k)
    {
        int mid=(le+ri)>>1;
        t[k].le=le,t[k].ri=ri,t[k].s=0;
        if(le==ri){t[k].s=1;return;}
        build(le,mid,k*2);build(mid+1,ri,k*2+1);
        t[k].s=t[2*k].s+t[2*k+1].s;
    }
    void update(int le,int ri,int k)
    {
        int mid=(t[k].le+t[k].ri)>>1;
        if(t[k].le==t[k].ri){t[k].s--;vis[k]=1;return;}
        if(ri<=mid&&!vis[2*k])update(le,ri,2*k);
        else if(le>mid&&!vis[2*k+1])update(le,ri,2*k+1);
             else
             {
                 if(!vis[2*k]&&le<=mid)update(le,mid,2*k);
                 if(!vis[2*k+1]&&ri>mid)update(mid+1,ri,2*k+1);
             }
        t[k].s=t[2*k].s+t[2*k+1].s;
        if(t[k].s==0)vis[k]=1;
    }
    int n,m,le,ri;
    int main()
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        build(1,n,1);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&le,&ri);
            update(le,ri,1);
            printf("%d
    ",t[1].s);
        }
        return 0;
    }
  • 相关阅读:
    《计算机网络 自顶向下方法》 第1章 计算机网络和因特网
    记一次代码优化
    不要刻意寻求局部最优解
    Eclipse Jetty插件安装
    Jetty的工作原理
    log4g 使用教程
    有用资料的网址
    Java 编程 订单、支付、退款、发货、退货等编号主动生成类
    Spring框架
    Eclipse常用快捷键大全1
  • 原文地址:https://www.cnblogs.com/EvilEC/p/6856660.html
Copyright © 2011-2022 走看看