CSUOJ 1258 維護序列

2021-06-08 09:14:50 字數 1280 閱讀 6484

線段樹題目。此題的更新必須要更新到葉節點,否則的話,會出現錯誤。對於乙個int範圍內的數字,更新若干次(最多32次)後必然會變成0,那麼此時在更新就沒有意義了。那麼我們可以用lazy標記,當某個區間的數字全部變為0後,我們將這個區間做上標記。那麼這個區間就不可能在被更新,這樣就可以提高效率,減去不必要的更新。對於將乙個數字的二進位制位最低位1變成0,在做樹狀陣列題目的時候我們常用乙個lowbit()函式來獲取某個數字二進位制位最低位1,這裡我們也用這個來實現,我們先取出對應的最低位,然後在進行異或操作就可以了,也可以將取出的數字進行一次取反,然後在與原數字進行與操作。即:a&(~(a&(-a)))

#include #include #include using namespace std ;

#define maxn 10005

#define m(x , y) (x+y)>>1

#define l(x) x<<1

#define r(x) x<<1|1

struct treetree[maxn * 4] ;

int n ;

int m ;

inline void pushup(int c)

void build(int l ,int r , int c)

void insert(int v , int l , int c)

int m = m(tree[c].l , tree[c].r) ;

if(l <= m)

else

pushup(c) ;

}void update(int l , int r , int c)

}return ;

}int m = m(tree[c].l , tree[c].r) ;

if(l==tree[c].l && r == tree[c].r)

else if(m >= r)

else if(m < l)

else

pushup(c) ;

}void query(int &ans , int l , int r , int c)

if(tree[c].l == l && tree[c].r == r)

int m = m(tree[c].l , tree[c].r) ;

if(r <= m)

else if(l > m)

else

}int main()

for(int i = 1 ; i <= m ; i ++)

else}}

return 0 ;

}

CSU 1258 維護序列 線段樹

description 現在有乙個n個整數組成的序列,這n個整數的標號分別為1,2,n,對這個序列一共進行兩類操作 1 x y 表示將第x個和第y個 包括x y 整數之間的所有整數的二進位制的最低位的1變為0,如果某個整數的值為0,則不對這個整數做任何改變。2 x y 表示你需要回答第x個和第y個 ...

BZOJ 1798 維護序列

線段樹 這 d 道 q 題 s 告訴我說 你沒學過線段樹 嗯 這題要好好想想 qaq 來吧首先要明確的事情是 delta now 記錄的是已經對當前點做過的,但是還沒有對當前點的兒子做過的操作 嗯 我們就這樣 慢慢的退一下 嗯 標記是給兒子用的 嗯 是給兒子用的 奉獻精神 然後,對於這個題,我們可以...

BZOJ 1798, 維護序列

傳送門 維護乙個數列,要求支援區間加 區間乘以及查詢操作。很裸的線段樹,難點在於加法和乘法的操作順序。標記下傳時應先打乘法標記,再打加法標記,同時更新時還要用乘法標記維護加法標記。include typedef long long ll const int n 100005 int n,p,m,x,...