線段樹 題集

2022-05-16 07:55:09 字數 3890 閱讀 7985

扶蘇學長給我們講了線段樹、樹狀陣列、主席樹等資料結構

並發布了練習題單……

題目:a:

只需將maketag函式更改為異或和即可

然後tag的更新方式更改

#include#include

#include

using

namespace

std;

const

long

long k=5e5+5

;long

long

a[k];

struct

segment

else

}inline

void

maketag()

void

spread()

}

inline

bool out(const

long

long l,const

long

long r)

void change(long

long l,long

long

r)

else}}

long

long ask(long

long l,long

long

r) }}

};segment *root;

int main(void

)

root=new segment(1

,n);

for(long

long i=1;i<=m;i++)

else

}}

b、d:

模板不多說

c:該題沒有修改,只有詢問,所以只維護乙個最小值即可

#include#include

#include

using

namespace

std;

const

long

long k=5e5+5

;long

long

a[k];

struct

segment

else

}inline

bool out(const

long

long l,const

long

long r)

long

long ask(long

long l,long

long

r) }}

};segment *root;

int main(void

)}

f:維護乙個區間和與乙個區間平方和

再對方差公式進行推導

即可

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn=100005;8

double

a[maxn];

9int

n,q;

10struct

node

22else29}

30 inline void

pushup()

34 inline void

pushdown()41}

42 inline void maketag(double

w)47 inline bool inrange(const

int l,const

intr)

50 inline bool outofrange(const

int l,const

intr)

53 inline void upd(const

int l,const

int r,double

w)else

if(!outofrange(l,r))62}

63double qry(const

int l,const

intr)

67if

(outofrange(l,r))

70else74}

75double qry1(const

int l,const

intr)

79if

(outofrange(l,r))

82else86}

87};

88int

main()

8994 node *rot=new node(1

,n);

95for(int i=1;i<=q;i++)

102if(o==1

)106

if(o==2

)109

if(o==3

)115

}116

return0;

117 }

g:多次試驗表明,我煎不出來。。。

等扶蘇學長來講吧

h:本題需要使用狀壓優化與位運算

初始時將所有顏色用二進位制數表示

每次上色將對應的數值更新

下傳標記為直接覆蓋

上傳資訊時,將兩個數進行或運算

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

9using

namespace

std;

1011

intl, t, o, lf, rt, color;

12char

op;13

14struct

node

22 inline bool outofrange(const

int l, const

intr)

25 inline void maketag(const

long

long

x)29 inline void

pushdown()

35 inline void

pushup()

39if(rs != null)

*/42 v = (ls->v) | (rs->v);43}

44 node (const

int l, const

intr)

54else60}

61 inline void upd(const

int l, const

int r, const

long

long

x)65

else

if(!outofrange(l, r))71}

72 inline long

long query(const

int l, const

intr)

76else

if(!outofrange(l, r))

80else

return0;

81}82};

8384 inline int bit(const

long

long

n)90

return

res;91}

9293

intmain()

104else

109}110

111return0;

112 }

i、j:

這兩個題mod做

e將會在樹狀陣列時進行講解

另:《棠梨煎雪》可以通過樹狀陣列拿到可觀的部分分

-end-

線段樹題集

poj 2886 反素數 線段樹 題意 有n個人圍成一圈,遊戲的起點是k,每個人持有乙個數字 非編號 num,每次當前的人退出圈,下乙個人是他左邊的第num個 也就是說下乙個退出的是k num,k可以為負數,表示右邊的第num個 現在一直如果乙個人是第i個推出的,那麼他的得分就是i的因數的個數,球得...

線段樹 模板題

problem description 已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 input 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含...

線段樹(模板題)

對於一條數鏈,二分,然後二分,然後再二分 給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。數列元素初始化為0 輸入 輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數k,a,b k 0或1,a,b n k 0時表示將a處數字加上b,...