線段樹
描述請你維護乙個線段樹
支援一下操作
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....