問題 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...