線段樹專題

2021-10-02 11:37:52 字數 3314 閱讀 8591

敵兵布陣:單點更新,區間求和查詢

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

5e4+5;

struct nodet[maxn*4]

;int a[maxn]

,nsum;

void

build

(int x,

int y,

int num)

}//定義區間求和查詢函式

void

query

(int x,

int y,

int num)}}

//定義節點更新函式add

void

add(

int x,

int val,

int num)

if(x >

(t[num]

.a+t[num]

.b)/2)

add(x, val, num*2+

1);else

add(x, val, num*2)

;}intmain()

elseif(

!strcmp

(ss,

"sub"))

elseif(

!strcmp

(ss,

"query"))

}}return0;

}

i hate it:單點更新,區間最值查詢
//time limit exceeded-待改正

#include

#include

#include

#include

#define mem(a,b) memset(a, b, sizeof(a))

#define max(a, b) a>b?a:b;

using

namespace std;

const

int maxn =

2e5+5;

struct nodet[maxn*2]

;int a[maxn]

;int

build

(int x,

int y,

int num)

int mid =

(x+y)

>>1;

int a =

build

(x, mid, num<<1)

;int b =

build

(mid+

1, y,

(num<<1)

|1);

return t[num]

.maxn =

max(a, b);}

intupdate

(int x,

int val,

int num)

//if(x < t[num].a || x > t[num].b) return t[num].maxn;

int mid =

(t[num]

.a + t[num]

.b)/2;

int a, b;

if(x <= mid)

a = t[num<<1]

.maxn;

b =update

(x, val, num*2+

1);return t[num]

.maxn =

max(a, b);}

intquery

(int x,

int y,

int num)

}int

main()

else

if(ch ==

'u')}}

return0;

}

a ****** problem with integers 區間更新,區間求和,懶惰標記。
//陣列-模板。

#include

#include

#include

#include

const

int maxn =

1e6+10;

using

namespace std;

typedef

long

long ll;

//len記錄id區間數字數目,sum記錄id區間統計資訊,lazy記錄標記

ll sum[maxn*4]

, lazy[maxn*4]

, len[maxn*4]

;//a記錄原資料點資訊

ll a[maxn]

;int n, m;

void

pushup

(int rt)

void

build

(int l,

int r,

int rt)

int mid =

(l+r)

>>1;

build

(l, mid, rt<<1)

;build

(mid+

1, r, rt<<1|

1);pushup

(rt);}

void

pushdown

(int rt)

}//[l,r]為查詢區間,[l,r]的當前節點所示區間

ll query

(int rt,

int l ,

int r,

int l ,

int r)

void

update

(int rt,

int l ,

int r,

int l,

int r, ll val)

pushdown

(rt)

;int mid =

(l+r)

>>1;

if(l<=mid)

update

(rt<<

1, l ,mid, l, r, val);if

(r>mid)

update

(rt<<1|

1, mid+

1, r, l, r, val)

;pushup

(rt);}

intmain()

build(1

, n,1)

;while

(m--

)else}}

return0;

}

線段樹專題

最最基礎的線段樹,只更新葉子節點,然後把資訊用pushup int r 這個函式更新上來。hdu1166 敵兵布陣 線段樹 hdu 1166 敵兵布陣 單點更新區間求和 hdu1754 i hate it 線段樹 hdu 1754 i hate it 單點更新 區間求最值 hdu1394 minim...

線段樹專題

題意 給定n個數 a1,a2,a na 1,a 2,dots,a n a1 a2 an 給出q個詢問求 l,r 內所有子區間的異或和。比如,陣列1,2,3中 1,3 的異或和為 1 1 xor2 1xo r2xo r3 2 2xo r3 3 1 1xor2 1xor2xor3 2 2xor3 3 1...

ACM 線段樹 專題

其中應該有我以前 刷過的題吧 沒有辦法 演算法這東西 一不刷 就會忘。像這道題 我 就wa了 四發 才過 但是 我 以前確實過過。再重新理解一下吧 大概就是 線段樹 就是 左右 節點 然後 上面就是 我們的 和 建立的時候和每次修改 都要更新一下父節點 也就是子節點的和 樹這個東西 仔細想想 確實集...