專題訓練(2)

2021-10-22 07:55:39 字數 2438 閱讀 7497

本週的學習內容:

樹狀陣列

用於對區間操作非常方便。

1001

求乙個整數,二進位制表示形式中最低位的1代表的整數。

就是樹狀陣列中,求lowbit的操作。

題解:

#include

using

namespace std;

intmain()

return0;

}

1002

樹狀陣列的應用。

點操作,區間查詢。

剛開始樹狀陣列的建立過程,可以直接以樹狀陣列的更新來建立。

#include

#include

#include

using

namespace std;

intlast

(int);

void

change

(int

,int);

intsum

(int);

int data[

50001]=

;int n;

intmain()

while

(cin>>order)

if(order==

"sub")if

(order==

"query")}

}}return0;

}int

last

(int x)

void

change

(int loc,

int num)

}int

sum(

int x)

return amount;

}

1003

樹狀陣列的應用。

對時間複雜度的優化。

題解:

#include

#include

using

namespace std;

int treedata[

100001]=

;int n;

intlowbit

(int x)

intadd

(int x)

return sum;

}void

update

(int x)

}int

main()

cout<}return0;

}

1004

氣球塗色。

區間操作,區間內的單點查詢。

差分樹狀陣列。(用差分+字首和也可以過,用樹狀陣列只是對時間複雜度進行了優化)

題解:

#include

using

namespace std;

intmain()

;for

(int i=

0;i)for

(int i=

1;i<=n;i++

)for

(int i=

1;i) cout<<}return0;

}

1005

求逆序對(2)

離散化+樹狀陣列。

離散化:

當所處理的資料較大時,無法開乙個特別大的陣列,因此,在不改變資料相對大小的條件下可以把資料進行相應的縮小。

例:原資料:

離散化後,可以把這四個數表示成:

因此,題解:

#include

#include

#include

using

namespace std;

const

int max=

1e5+1;

int data[max]

;int sign[max]

;int n;

intlowbit

(int x)

void

update

(int x)

}long

long

add(

int x)

return sum;

}int

main()

sort

(sign+

1,sign+

1+n)

;int m=

unique

(sign+

1,sign+

1+n)

-sign-1;

for(

int i=

1; i<=n; i++

)memset

(sign,0,

sizeof

(sign));

for(

int i=

1; i<=n; i++

) cout<}return0;

}

專題訓練2小結

這個專題學會了 floyd dijkstra 路徑儲存 1.arbitrage 普通floyd題 這題把inf設定成0更合適 加分可以改成乘法 2.free diy tour 一道很好的 dfs加儲存路徑題目 要多看看!3.minimum transport cost 該題求最短路 加列印路徑 最小...

專題訓練2 最短路

floyed演算法 o n 3 dijkstra 適合稠密圖 spfa 優點是可以處理負權值,但是不能處理負環,使用前最好先判斷是否有負環 適合稀疏圖 還不熟 會用到的存圖方法 鄰接矩陣 鄰接表前向星 待學 1.mpi maelstrom poj1502 無向圖 題目在此 一開始看錯了題意,以為需要...

Django ORM訓練專題

書 class book models.model title models.charfield max length 32 publish date models.datefield auto now add true price models.decimalfield max digits 5,...