#include#includeusing namespace std;
#define lrt (rt<<1)
#define rrt (rt<<1|1)
#define mid ((l+r)>>1)
#define lson l,mid,lrt
#define rson mid+1,r,rrt
#define llen mid-l+1
#define rlen r-mid
const int maxn=100010;
struct segtree
void pushup(int l,int r,int rt)
if(lsum[lrt]==llen) lsum[rt]+=lsum[rrt];
if(rsum[rrt]==rlen) rsum[rt]+=rsum[lrt];
sum[rt]=max(sum[lrt],sum[rrt],rsum[lrt]+lsum[rrt]);
}void build(int l,int r,int rt)
build(lson);
build(rson);
pushup(l,r,rt);
}void update(int k,int v,int l,int r,int rt)
if(k<=mid) update(k,v,lson);
else update(k,v,rson);
pushup(l,r,rt);
}int query(int s,int t,int l,int r,int rt)
{if(s<=l&&t>=r) return sum[rt];
if(t<=mid) return query(s,t,lson);
if(s> mid) return query(s,t,rson);
int a=query(s,mid,lson);
int b=query(mid+1,t,rson);
int m=min(rsum[lrt],mid+1-s);
int n=min(lsum[rrt],t-mid);
m=arr[mid]>t;
while(t--)
{cin>>n>>m;
for(int i=0;i
樹狀陣列和線段樹
主要解決兩個問題 其他問題可以轉化 更新某一點的值 求區間值 時間按複雜度 logn 原陣列a 1 a 2 a n 寫成樹狀陣列c c x x lowbit x x 左開右閉 筆記 主要 const int n int tr n int lowbit int x void add int x,int...
線段樹和樹狀陣列
引入1 有n個數 n 50000 個數,m m 50000 次詢問。每次詢問區間l到r的數的和。要求輸出每一次詢問的結果.分析 1.用字首和問題進行求解 再開乙個陣列 暫且記為b n 設n個數所組成的陣列為a n b i 用來記錄從a 1 到a i 的所有數字的和 即 b 1 a 1 b 2 b 1...
線段樹和樹狀陣列
線段樹 segment tree 和樹狀陣列是兩種常用的資料結構。他們用來維護乙個區間內的操作,可以在 logn 的複雜度上進行查詢和修改。線段樹可以維護對乙個區間的查詢和修改,可以對區間進行分塊查詢,而樹狀陣列是線段樹的閹割版,經常用來區間查詢,但修改只能進行單點修改,經過改造之後可以區間修改,區...