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

hdu 5023 (線段樹 )

編輯:C++入門知識

hdu 5023 (線段樹 )


這道題當時沒有做出來,狀態不會保存。原來可已用二進制保存狀態,做的題太少,暴漏的問題太多了;這麼簡單的東西,,,,,也不會保存

這道題就是每一次維護區間的和,也就是把它的30種顏色用二進制保存下來。也就1<<30 可以用long long 保存下來

#include 
#include 
#include 
using namespace std;
#define maxx  1111111
#define lson L,m,rt<<1
#define rson m+1,R,rt<<1|1
typedef long long ll;
int cnt;
ll add[maxx<<2];
int ans[50];
ll sum[maxx<<2];
int n,m;

void pushup(int rt){
   sum[rt]=sum[rt<<1]|sum[rt<<1|1];
}

void pushdown(int rt){
     if(add[rt]){
         add[rt<<1]=add[rt];
         add[rt<<1|1]=add[rt];
         sum[rt<<1]=add[rt];
         sum[rt<<1|1]=add[rt];
         add[rt]=0;
     }
}

void build(int L,int R,int rt){
     add[rt]=0;
     if(L==R){
        sum[rt]=2;(顏色2相當於1<<1,那麼顏色1就1<<0)
        return ;
     }
     int m=(L+R)>>1;
     build(lson);
     build(rson);
     pushup(rt);
}

void update(int l,int r,int  c,int L,int R,int rt){
     if(l<=L&&R<=r){
        add[rt]=1<<(c-1);
        sum[rt]=1<<(c-1);
        return ;
     }
     pushdown(rt);
     int m=(L+R)>>1;
     if(l<=m) update(l,r,c,lson);
     if(m=R){
       return sum[rt];
      }
      pushdown(rt);
      int m=(L+R)>>1;
      if(l<=m) ret|=query(l,r,lson);
      if(m

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