hihoCoder 1078 區間查詢線段樹

2022-08-29 06:18:15 字數 1618 閱讀 8366

對於小ho表現出的對線段樹的理解,小hi表示挺滿意的,但是滿意就夠了麼?於是小hi將問題改了改,又出給了小ho:

假設貨架上從左到右擺放了n種商品,並且依次標號為1到n,其中標號為i的商品的**為pi。小hi的每次操作分為兩種可能,第一種是修改**——小hi給出一段區間[l, r]和乙個新的**newp,所有標號在這段區間中的商品的**都變成newp。第二種操作是詢問——小hi給出一段區間[l, r],而小ho要做的便是計算出所有標號在這段區間中的商品的總**,然後告訴小hi。

那麼這樣的乙個問題,小ho該如何解決呢?

每個測試點(輸入檔案)有且僅有一組測試資料。

每組測試資料的第1行為乙個整數n,意義如前文所述。

每組測試資料的第2行為n個整數,分別描述每種商品的重量,其中第i個整數表示標號為i的商品的重量pi。

每組測試資料的第3行為乙個整數q,表示小hi進行的運算元。

每組測試資料的第n+4~n+q+3行,每行分別描述一次操作,每行的開頭均為乙個屬於0或1的數字,分別表示該行描述乙個詢問和一次商品的**的更改兩種情況。對於第n+i+3行,如果該行描述乙個詢問,則接下來為兩個整數li, ri,表示小hi詢問的乙個區間[li, ri];如果該行描述一次商品的**的更改,則接下來為三個整數li,ri,newp,表示標號在區間[li, ri]的商品的**全部修改為newp。

對於100%的資料,滿足n<=10^5,q<=10^5, 1<=li<=ri<=n,1<=pi<=n, 0

區間查詢的模板題,直接套就好了。

1 #include2

using

namespace

std;

3const

int maxn=1e5+10;4

inta[maxn];

5int sum[maxn<<2],exc[maxn<<2];6

void maintain(intk)7

10void pushdown(int lenl,int lenr,int

k)1119}

20void build(int l,int r,int

k)21

29int mid=(l+r)>>1

;30 build(l,mid,k<<1

);31 build(mid+1,r,k<<1|1

);32

maintain(k);33}

34void change(int l,int r,int cl,int cr,int k,int

newp)

3543

int mid=(l+r)>>1

;44 pushdown(mid-l+1,r-mid,k);

45 change(l,mid,cl,cr,k<<1

,newp);

46 change(mid+1,r,cl,cr,k<<1|1

,newp);

47maintain(k);48}

49int query(int l,int r,int ql,int qr,int

k)50

63int

main()

64else

79 cout<1,n,l,r,1)<81return0;

82 }

hihocoder 1305 區間求差

you are given two interval collections a and b.collection a has n intervals a1 a2 a3 a4 a2n 1 a2n and collection b has m intervals b1 b2 b3 b4 b2m 1 b...

7620 區間合併

7620 區間合併 總時間限制 1000ms 記憶體限制 65536kb 描述 給定 n 個閉區間 ai bi 其中i 1,2,n。任意兩個相鄰或相交的閉區間可以合併為乙個閉區間。例如,1 2 和 2 3 可以合併為 1 3 1 3 和 2 4 可以合併為 1 4 但是 1 2 和 3 4 不可以合...

4975 區間翻轉

小q和tangjz正在乙個長度為n的序列a 1,a 2,a n上玩乙個有趣的關於區間翻轉的遊戲。小q和tangjz輪流行動 小q先手。每次行動方玩家需要選擇乙個長度為4x 2或4x 3的區間 l,r 1 l r n 其中x是該玩家自行選擇 的非負整數,然後將a l,a a a r翻轉,例如1 3 2...