樹狀陣列的一些想法和筆記

2021-10-11 22:44:22 字數 3184 閱讀 8362

問題 b: 逆序對

問題 c: 矩陣操作

一些參考的部落格

題目描述

給你n個數,建立乙個樹狀陣列,並執行相應操作,按格式要求輸出操作結果。執行的操作有以下兩種形式:

c i dt ,表示更新a[i],使得a[i]=a[i]+dt,其中1<=i<=n;

q i j ,表示詢問區間和,即a[i]+a[i+1]+…+a[j]的值,其中1<=i<=j<=n。

輸入第一行乙個正整數n(1<=n<=10000),代表資料個數。

接下來一行是n個資料。

接下來一行乙個正整數m,代表m個操作。

接下來m行,每行乙個操作,格式如上所述。

輸出第一行輸出建立後的樹狀陣列,資料之間以空格分隔。

接下來m行,輸出m個操作結果:對每個「c i dt 」操作,輸出更新後的樹狀陣列,資料間以空格分隔;對每個「q i j 」操作,輸出乙個數值。

樣例輸入

101 3 2 6 7 -2 5 8 4 10

5q 1 10

c 2 4

q 2 6

c 6 -3

q 6 6

樣例輸出

1 4 2 12 7 5 5 30 4 14

441 8 2 16 7 5 5 34 4 14

201 8 2 16 7 2 5 31 4 14

-5**

#include

#include

using

namespace std;

int n,m;

int a[

100]

,c[100];

//對應原陣列和樹狀陣列

intlowbit

(int x)

void

updata

(int i,

int k)

}int

getsum

(int i)

return res;

}int

main()

for(

int i=

1;i<=n;i++

) cout << endl;

cin >> m;

while

(m--)if

(temp==

'c')

cout << endl;}}

return0;

}

題目描述

給你n個數,每個數a[i]都是不超過109的非負整數。求其中逆序對的個數,即所有這樣的數對(i , j )滿足1<=ia[j]。要求用樹狀陣列的相關操作完成題目。

輸入第一行乙個正數n(1<=n<=100000),表示資料的個數。

接下來一行是n個整數。

輸出第一行乙個整數m,代表逆序對的個數。

樣例輸入

54 7 2 10 9

樣例輸出

**

#include

#include

using

namespace std;

int n,big=

-999

;int a[

100]

,c[100];

//對應原陣列和樹狀陣列

intlowbit

(int x)

void

updata

(int i,

int k)

}int

getsum

(int i)

return res;

}int

main()

;for

(int i=

1;i<=n;i++

)//建立樹狀陣列

for(

int i =

1; i <= n; i++

) cout << sum;

return0;

}

題目描述

給定乙個n✖n的矩陣a,其中每個元素不是0就是1。a[i,j]表示在第i行、第j列的數,初始時,a[i,j]=0 (1<=i,j<=n)。

我們可以按照如下方式改變矩陣:給定乙個左上角在(x1,y1)、右下角在(x2,y2)的矩形,通過使用「not」操作改變這個矩形內的所有元素值(元素0變成1,元素1變成0)。為了維護矩陣的資訊,你需要寫個程式來接收並且執行以下兩個操作:

(1)c x1 y1 x2 y2 (1<=x1<=x2<=n, 1<=y1<=y2<=n),表示更新操作,將改變左上角為(x1,y1)、右下角為(x2,y2)的矩形區域內的資料值,若元素值為0,則變成1;若元素值為1,則變成0。

(2)q x y (1<=x,y<=n),表示詢問操作,詢問a[x,y]的值。

輸入第一行兩個整數n和t(2<=n<=1000, 1<=t<=50000),分別代表方陣大小和運算元。

接下來t行,每行包含乙個操作,以「c x1 y1 x2 y2」或者「q x y」的形式給出,具體描述如上。

輸出對每個詢問操作,輸出一行乙個整數,表示相應矩陣元素的值。

樣例輸入

2 10

c 2 1 2 2

q 2 2

c 2 1 2 1

q 1 1

c 1 1 2 1

c 1 2 1 2

c 1 1 2 2

q 1 1

c 1 1 2 1

q 2 1

樣例輸出10

01**

#include

#include

using

namespace std;

//差分陣列

int c[

1000][

1000];

//用來存翻轉次數

int n,m;

intlowbit

(int x)

void

updata

(int x,

int y)

//將以x,y為右下角的矩形翻轉

intget

(int x,

int y)

intmain()

else

if(temp==

'q')

}return0;

}

一些關於陣列和指標的想法

指標是c的難點和精華,當他和陣列相遇時,如果沒有好好理清它們之間的關係和原理,那真是搞不清理還亂了。1 二維陣列a代表什麼含義?首先定義了乙個二維陣列a,當然我們必須把a看成乙個一維陣列,它有兩個 大 行 元素,每個 大 行 元素都由五個 小 列 元素,這是我們理解陣列的前提條件。第七行定義了乙個i...

關於樹狀陣列的一些討論

樹狀陣列用於在log n 的時間複雜度修改與詢問字首 相比線段樹更好寫 常數更小 不過侷限性很大 不能用於維護最大最小值之類的情況 最常用的應用 我用過的 大概有 單點修改區間查詢 區間修改單點查詢 區間修改區間查詢 離散化權值求逆序對 以上內容 洛谷金秋講義 上面已經把樹狀陣列定義以及修改查詢方法...

一些簡單的樹狀陣列題

大意 給定一列數 a i 求滿足下列條件的數對 x,y 的數量 1 xn 與 a i n 是等價的,所以直接將大於n的 a i 賦為 n 可以避免離散化 include include include include include include include include using nam...