本週的學習內容:
樹狀陣列
用於對區間操作非常方便。
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,...