设为首页 加入收藏

TOP

POJ2528线段树基础
2015-07-20 17:51:04 来源: 作者: 【 】 浏览:2
Tags:POJ2528 线段 基础

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

问了瓜神,原来应该用离散化来做这题,具体见注释

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
          #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                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
               
                

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 2182 Lost Cows(牛排序,线.. 下一篇HDU 1754 I Hate It (线段树单点..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ 语言社区-CSDN社 (2025-12-24 17:48:24)
·CSDN问答专区社区-CS (2025-12-24 17:48:22)
·C++中`a = b = c`与` (2025-12-24 17:48:19)
·C语言结构体怎么直接 (2025-12-24 17:19:44)
·为什么指针作为c语言 (2025-12-24 17:19:41)