程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> ZOJ 1610

ZOJ 1610

編輯:C++入門知識

線段樹。線段覆蓋。成段更新。lazy標記處理。

下面是AC代碼:
[cpp]
#include<cstdio> 
#include<cstring> 
#include<algorithm> 
using namespace std; 
const int maxn = 10000; 
struct node{ 
    int l,r; 
    int color; 
}T[maxn<<2]; 
void build (int id,int l,int r){ 
     T[id].l=l;T[id].r=r;T[id].color=-1; 
     if(l==r)  return ; 
     int m=(l+r)>>1; 
     build(id<<1,l,m);  build(id<<1|1,m+1,r); 

int ans[maxn]; 
int res[maxn]; 
void update(int id,int l,int r,int color){ 
      if(T[id].l==l&&T[id].r==r){   T[id].color=color; return ; } 
      if(T[id].color!=-1){ 
            T[id<<1].color=T[id<<1|1].color=T[id].color; 
            T[id].color = -1; 
      } 
      int m=(T[id].l+T[id].r)>>1; 
      if(m>=r){ 
          update(id<<1,l,r,color); 
      } 
      else if(m<l){ 
          update((id<<1)|1,l,r,color); 
      } 
      else{ 
            update(id<<1,l,m,color); 
            update((id<<1)|1,m+1,r,color); 
      } 

void query(int id,int l,int r){ 
    if(T[id].l==T[id].r){ 
         ans[l]=T[id].color; 
         return ; 
    } 
    int m=(l+r)>>1; 
    if(T[id].color!=-1){ 
        T[id<<1].color=T[id<<1|1].color=T[id].color; 
        T[id].color = -1; 
    } 
    query(id<<1,l,m); 
    query(id<<1|1,m+1,r); 

int main(){ 
    int n,l,r,color; 
    while(scanf("%d",&n)!=EOF){ 
        memset(ans,0,sizeof(ans)); 
        memset(res,0,sizeof(res)); 
         build(1,1,8001); 
         for(int i=0;i<n;i++){ 
              scanf("%d%d%d",&l,&r,&color); 
              if(l>r) swap(l,r); 
              l++; 
            //  r++; 
              update(1,l,r,color); 
         } 
         query(1,1,8001); 
         ans[0]=-1; 
         for(int i=1;i<=8001;i++){ 
             if(ans[i]!=-1&&ans[i]!=ans[i-1]){ 
                res[ ans[i] ]++; 
             } 
         } 
 
         for(int i=0;i<=8001;i++){ 
             if(res[i]>0) 
               printf("%d %d\n",i,res[i]); 
         } 
         puts(""); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved