zoukankan      html  css  js  c++  java
  • POJ2528线段树基础

    開始就直接用延迟标记搞了下。最后发现内存肯定会爆了。数据太大了。

    问了瓜神,原来应该用离散化来做这题,详细见凝视

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <map>
    #include <cstdlib>
    #include <list>
    #include <set>
    #include <queue>
    #include <stack>
    using namespace std;
    #define INF 0xfffffff
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define maxn 444444
    int col[maxn<<2];
    int l[maxn],r[maxn];
    int q[maxn],q1[maxn],vis[maxn],hash[maxn];
    void pushdown(int rt)
    {
        if(col[rt])
        {
            col[rt<<1]=col[rt<<1|1]=col[rt];
            col[rt]=0;
        }
    }
    void build(int l,int r,int rt)
    {
        col[rt]=0;
        if(l==r) return ;
        int m=(l+r)>>1;
        build(lson);
        build(rson);
    }
    void update(int L,int R,int cha,int l,int r,int rt)
    {
        if(L<=l&&R>=r)
        {
            col[rt]=cha;
            return ;
        }
        pushdown(rt);
        int m=(l+r)>>1;
        if(L<=m) update(L,R,cha,lson);
        if(R>m) update(L,R,cha,rson);
    }
    void query(int l,int r,int rt)
    {
        if(col[rt])//假设某张海报存在。将这张海报标记一下
        {
            hash[col[rt]]=1;
            return ;
        }
        int m=(l+r)>>1;
        query(lson);
        query(rson);
    }
    int bsearch(int key,int *a,int len)//二分查找
    {
        int l=0,r=len-1;
        while(l<=len)
        {
            int m=(l+r)>>1;
            if(a[m]==key) return m+1;
            else if(a[m]>key) r=m-1;
            else l=m+1;
        }
    }
    int main()
    {
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            memset(vis,0,sizeof(vis));
            memset(hash,0,sizeof(hash));
            scanf("%d",&n);
            int ans=0,ans1=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d",&l[i],&r[i]);
                q[ans++]=l[i];q[ans++]=r[i];
            }
            sort(q,q+ans);
            for(int i=0;i<ans-1;i++)
            {
                if(q[i]==q[i+1]) vis[i+1]=1;
            }
            for(int i=0;i<ans;i++)//将原来浪费的空间又一次利用,减少树的大小
            {
                if(!vis[i]) q1[ans1++]=q[i];
            }
            for(int i=1;i<=n;i++)//找到如今树中各点的位置
            {
                l[i]=bsearch(l[i],q1,ans1);
                r[i]=bsearch(r[i],q1,ans1);
            }
            build(1,ans1,1);//建树
            for(int i=1;i<=n;i++)
            {
                update(l[i],r[i],i,1,ans1,1);
            }
            query(1,ans1,1);
            int tot=0;
            for(int i=1;i<=n;i++)//统计海报的张数
            {
                if(hash[i]) tot++;
            }
            printf("%d
    ",tot);
        }
        return 0;
    }
    


  • 相关阅读:
    C++的Socket的使用源码
    一些程序技术简介
    VMware安装步骤既常见问题
    操作系统和环境准备
    第一章-硬件组成
    python之面向对象
    指向方法之委托(一)
    Django之URL控制器(路由层)
    python之字符编码(四)
    python之字符编码(三)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5213111.html
Copyright © 2011-2022 走看看