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;
    }
  • 相关阅读:
    Dask教程
    python程序—利用socket监控端口
    python程序—封装案例
    python程序—士兵出击
    Python三大神器:装饰器,迭代器,生成器
    python程序—名片管理系统
    python程序—系统检测
    python程序—用户登录
    (七)javac编译
    Unity系统消息广播
  • 原文地址:https://www.cnblogs.com/EvilEC/p/6856660.html
Copyright © 2011-2022 走看看