題解 資料結構 樹狀陣列2

2021-10-08 13:25:18 字數 3122 閱讀 3016

接著上文

說(上文題目打太多了,卡的很)

這道題如果還像上一題那樣建樹狀陣列,必然超時

我們要發揮自己模仿的天分,使得原封不動地搬下來就可以a了

前面說到跟上題一樣建樹狀陣列要超時,那我們倒過來,使得單點訪問變為sum,區間修改變為update,有同學肯定想到了差分陣列

沒錯就是他

我們在區間修改,就相當於修改差分陣列的兩個值

比如我們給區間[l,r]加上x,就相當於給pl加x,給pr+1減x

而我們單點查詢,就相當於求差分陣列的字首和

**

#include

const

int m =

1e6+5;

int a[m]

, p[m]

;long

long bit[m]

;int n, m;

intlowbit

(int x)

void

update

(int k,

int temp)

}long

long

sum(

int k)

return tot;

}int

main()

for(

int i =

1; i <= m; i ++

)else

}return0;

}

題目描述

給定數列 ,你需要依次進行 個操作,操作有兩類:

輸入格式

第一行包含 個正整數 ,表示數列長度和詢問個數。保證 。

第二行 個整數 ,表示初始數列。保證 。

接下來 行,每行乙個操作,為以下兩種之一:

保證 。

輸出格式

對於每個2 l r操作,輸出一行,每行有乙個整數,表示所求的結果。

樣例樣例輸入

5 10

2 6 6 1 1

2 1 4

1 2 5 10

2 1 3

2 2 3

1 2 2 8

1 2 3 7

1 4 4 10

2 1 2

1 4 5 6

2 3 4

樣例輸出

15

3432

3350

資料範圍與提示

對於所有資料, , 。

分析p仍為a的差分陣列,那麼原陣列的字首和

a1+a2+……+ an

=p1+(p1+p2)+(p1+p2+p3)+……+(p1+p2+……+pn)

=n*p1+(n-1)*p2+(n-2)*p3+……+pn

=n*(p1+p2+p3+……+pn)-(0*p1+1*p2+2*p3+……+(n-1)*pn)

觀察減式兩邊,分別將pi和(i-1)*pi建立兩個樹狀陣列bit1和bit2,bit1就是差分陣列,區間修改按上一例進行;bit2的增量就不是x了,而是x*(i-1)。至於區間查詢,我們已經知道原陣列字首和了,直接相減即可查詢區間和。

**

#include

#include

const

int m =

1e6+5;

long

long a[m]

, p[m]

;long

long bit1[m]

, bit2[m]

;int n, m;

long

long

read()

else

sym =1;

while

(x >=

'0'&& x <=

'9')

return sym * tot;

}int

lowbit

(int x)

void

update

(int k,

long

long temp)

}long

long

sum1

(int k)

return tot;

}long

long

sum2

(int k)

return tot;

}int

main()

for(

int i =

1; i <= m; i ++

)else

}return0;

}

題目描述

「裝滿了鵝卵石的瓶子是滿的嗎?」墨老師曾經這樣問過他的學生。「不是,因為還可以放入小石子、再放入細砂、最後再倒入水。」學生們回答。「那麼從中可以得到什麼啟示呢?」墨老師又問,「啟示我們時間總是可以擠出來的!」乙個聰明的學生搶答。「你說得對!」墨老師微笑道,「但我還要告訴你們另乙個重要經驗,那就是:如果你不先將大的鵝卵石放進瓶子裡去,你也許以後永遠沒機會再把它們放進去了。」

但這世上的很多人,做事卻經常分不清事情的輕重緩急。我們可愛的典獄長大人就犯了這個錯誤,當他看到身高參差不齊的獄警們排成一列時,眉毛擰成了乙個結,他最想知道的就是,到底有多少個獄警逆序排隊了。這可以抽象為求逆序對的個數問題:即對於乙個包含n個非負整數的陣列a[1,…,n],如果有i < j,且a[ i ]>a[ j ],則稱(a[ i] ,a[ j] )為陣列a中的乙個逆序對。

例如,陣列(3,1,4,5,2)的逆序對有(3,1),(3,2),(4,2),(5,2)共4個。

輸入格式

輸入檔案reverse.in包括兩行,第一行是乙個整數n(1≤n≤1000),表示獄警人數。第二行包含n個整數,用空格分隔,即每個獄警的身高,獄警身高均在int範圍內。

輸出格式

輸出檔案reverse.out包括一行,這一行只包含乙個整數,即逆序對的個數。

樣例樣例輸入

3 1 4 5 2

樣例輸出

欲知後事如何,且聽下回

分解

資料結構 樹狀陣列

區間資訊的維護與查詢專題 樹狀陣列 1.問題 動態連續和查詢問題。給定乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構,支援以下兩種操作。add x,d 操作 讓ax增加d.query l,r 計算al al 1 ar.對普通陣列進行 一次修改或 特定區間 求和,時間複雜度為o n n...

資料結構 樹狀陣列

原陣列 字首和 範圍和 原陣列更改陣列元素在求和效率較低,引入樹狀陣列 假設原陣列a 樹狀陣列c 樹狀陣列 的三種操作 1.lowbit 子葉數 二進位制最低位的1代表多少 實現 int lowbit int n 求 lowbit x returnx x 2.update a i k 假設a i 是...

資料結構 樹狀陣列

講到了線段樹,那就順便講講樹狀陣列吧。假設乙個長度為 12 的線段樹,構建結果如下 在區間求和問題上,在葉子節點,顯然劃線部分的值可以由父親節點 左端葉子節點得到。那麼,這部分資訊就是冗餘的,沒有儲存的必要。同理,可以推導出所有冗餘的部分如下 那麼,去除冗餘部分後的結果如下 給每乙個節點乙個編號。我...