專題 線段樹和樹狀陣列(HDOJ)14 LCIS

2021-06-05 08:07:18 字數 1124 閱讀 1284

#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 的複雜度上進行查詢和修改。線段樹可以維護對乙個區間的查詢和修改,可以對區間進行分塊查詢,而樹狀陣列是線段樹的閹割版,經常用來區間查詢,但修改只能進行單點修改,經過改造之後可以區間修改,區...