hdu 5023 (线段树 )

2015-01-26 23:12:42 · 作者: · 浏览: 11

这道题当时没有做出来,状态不会保存。原来可已用二进制保存状态,做的题太少,暴漏的问题太多了;这么简单的东西,,,,,也不会保存

这道题就是每一次维护区间的和,也就是把它的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