線段樹(單點更新)

2021-06-19 10:33:55 字數 3292 閱讀 7468

1. hdu 1166 敵兵布陣

單點更新,區間求和,最裸的線段樹

#include #include #include using namespace std;

#define maxn 50010

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

struct treetree[maxn<<2];

void pushup(int rt)

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

int m=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}void update(int pos,int val,int rt)

int m=(l+r)>>1;

if(pos<=m) update(pos,val,rt<<1);

else update(pos,val,rt<<1|1);

pushup(rt);

}int query(int x,int y,int rt)

int m=(l+r)>>1;

int ans=0;

if(y<=m) ans+=query(x,y,rt<<1);

else if(mhdu 1754 i hate it

單點更新,區間求最值,裸線段樹

#include #include #include #include #include using namespace std;

#define maxn 200010

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define inf 1<<31

struct treetree[maxn<<2];

void pushup(int rt)

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

int m=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}void update(int pos,int var,int rt)

int m=(l+r)>>1;

if(pos<=m) update(pos,var,rt<<1);

else update(pos,var,rt<<1|1);

pushup(rt);

}int query(int x,int y,int rt)

int m=(l+r)>>1;

int ans=-inf;

if(x<=m) ans=max(ans,query(x,min(m,y),rt<<1));

if(m3. hdu 1394 minimum inversion number

求滾動之後,逆序對最少的對數,建乙個節點值為0的線段樹,每次插進去乙個數之後,更新比他大的節點全部加1

#include #include #include #include #include using namespace std;

#define maxn 5050

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

struct treetree[maxn];

int num[maxn];

void pushup(int rt)

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

void update(int pos,int rt)

int query(int x,int y,int rt)

int ans=0;

int m=(l+r)>>1;

if(y<=m) ans+=query(x,y,rt<<1);

else if(m

4. hdu 2795 billboard

廣告牌,每層至多放總寬為w的廣告,每次放的時候優先考慮最上面最左邊的位置,問每次放的位置的排數,不能放輸出-1

線段樹初始值維護乙個最大值,對於當前節點,能放就放然後節點值減小val,並更新到父親節點。

#include #include #include #include #include using namespace std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define maxn 200010

struct treetree[maxn<<2];

int h,w,n;

void pushup(int rt)

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

int m=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}int query(int val,int rt)

int main()

}return 0;

}

5. cf 197div2 d. xenia and bit operations

題意:求一排數字的位運算的結果,建好樹之後從下往上,異或和或交替運算。

思路:距離葉子節點距離為奇數的節點操作為異或更新,距離為偶數的為或操作更新。

#include #include #include #include #include using namespace std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define maxn (1<<17)

struct treetree[(maxn<<2)+1];

void pushup(int rt)

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

int m=(l+r)>>1;

build(lson);

build(rson);

pushup(rt);

}void update(int pos,int val,int rt)

int m=(l+r)>>1;

if(pos<=m) update(pos,val,rt<<1);

else update(pos,val,rt<<1|1);

pushup(rt);

}int main(){

int n,m;

while(scanf("%d%d",&n,&m)!=eof){

build(1,(1<

線段樹單點更新

hdu 1166 單點更新,求區間和 第一次寫線段樹,照著大神的抄了一遍 include include include define max 50100 define mid l r 1 define lson l,m,rt 1 define rson m 1,r,rt 1 1 using nam...

線段樹單點更新

g 梔子花開 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice fzu 1921 description 這是乙個梔子花開的季節,也是乙個離別的季節,四年一千多個日日夜夜,那校園...

線段樹單點更新 求和

第一行乙個整數t,表示有t組資料。每組資料第一行乙個正整數n n 50000 表示敵人有n個工兵營地,接下來有n個正整數,第i個正整數ai代表第i個工兵營地里開始時有ai個人 1 ai 50 接下來每行有一條命令,命令有4種形式 1 add i j,i和j為正整數,表示第i個營地增加j個人 j不超過...