這道題當時沒有做出來,狀態不會保存。原來可已用二進制保存狀態,做的題太少,暴漏的問題太多了;這麼簡單的東西,,,,,也不會保存
這道題就是每一次維護區間的和,也就是把它的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