2018 08 18 線段樹(線段樹)

2021-08-24 23:24:58 字數 1188 閱讀 1541

線段樹

描述請你維護乙個線段樹

支援一下操作

a x l r 區間 and x

o x l r區間 or x

x x l r 區間 xor x

s l r 區間求和

輸入乙個數 t表示資料組數 乙個數n表示初始序列長 m表示查詢 隨後n個整數 接下來m次詢問 如上

輸出所以s次詢問的答案

樣例輸入

14 1

1 2 4 7

s 0 2

樣例輸出7提示

為防止min-max剪枝 n=1e6 m=1e5 ai<15 t<=3

線段樹經典題。

第一眼還以為是與或的翻版,仔細看了看這東西不能用類似的做法跑過去233。。。

然後就驚奇的發現了ai<15這個條件,這暗示了我把每個數拆成4個二進位制位,這樣三個修改相當於區間覆蓋跟區間01序列翻轉了,這顯然是可做的啊。

**:

#include#define n 1000005

#define lc (p<<1)

#define rc (p<<1|1)

#define mid (t[p][op].l+t[p][op].r>>1)

using namespace std;

inline int read()

int t_t,n,m,a[n];

struct nodet[n<<2][4];

inline void pushup(int p,int op)

inline void pushnow(int p,int op,int k)

}inline void pushdown(int p,int op)

inline void build(int p,int l,int r,int op)

build(lc,l,mid,op),build(rc,mid+1,r,op),pushup(p,op);

}inline void update(int p,int ql,int qr,int op,int k)

inline int query(int p,int ql,int qr,int op)

int main()

if(s[0]=='a')

}if(s[0]=='o')

if(s[0]=='x')

} }return 0;

}

初識線段樹(線段樹總結)

線段樹的最基本的操作 1 建樹 void construct int left,int right 上述 利用二分的方法,建立一棵葉子節點為 i,i 1 的線段樹 特點是每棵樹的根,一定包含於子樹的線段。2 插入一段線段 void insert int index,int c,int d 解釋 當要...

線段樹 線段樹練習五

description 一行n個方格,開始每個格仔裡的數都是0。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數可能達到100...

3306 樹 線段樹

3306 樹 首先dfs整顆樹將樹轉換線性結構,前兩個操作比較簡單,然後主要是對於操作三,有三種情況 1.x rt,那麼我們直接求出整顆樹中的最小值就是答案 2.x在原樹中為rt的祖先節點,那麼我們首先求出從x到rt路徑上的x的第乙個節點y,那麼答案就是除了以y為根的子樹的其他所有節點的最小值 3....