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;
    }
  • 相关阅读:
    博弈入门
    悼念512汶川大地震遇难同胞——老人是真饿了 hdu 2187
    数塔 简单的 动态规划
    ~~~~~~~~~~~析构函数~~~~~~~~
    构造函数的重载
    利用 构造函数 实现数据成员的 初始化
    类和对象
    函数 的 重载 和 函数 模版
    nexus Maven私服的相关配置
    docker-compose bug
  • 原文地址:https://www.cnblogs.com/EvilEC/p/6856660.html
Copyright © 2011-2022 走看看