接著上文
說(上文題目打太多了,卡的很)
這道題如果還像上一題那樣建樹狀陣列,必然超時
我們要發揮自己模仿的天分,使得原封不動地搬下來就可以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包括一行,這一行只包含乙個整數,即逆序對的個數。
樣例樣例輸入
5
3 1 4 5 2
樣例輸出
4
欲知後事如何,且聽下回
分解
資料結構 樹狀陣列
區間資訊的維護與查詢專題 樹狀陣列 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 的線段樹,構建結果如下 在區間求和問題上,在葉子節點,顯然劃線部分的值可以由父親節點 左端葉子節點得到。那麼,這部分資訊就是冗餘的,沒有儲存的必要。同理,可以推導出所有冗餘的部分如下 那麼,去除冗餘部分後的結果如下 給每乙個節點乙個編號。我...