推薦
/**********************
通過離散化 +樹狀陣列 優化
****************************/
#include
using
namespace std;
const
int mod =
1e9+7;
const
int maxn =
1e3+60;
int s[maxn]
;// 最初的陣列
int e[maxn]
;// 排序後的書序
int num[maxn]
;// 儲存 離散化後的位置
int dp[maxn]
[maxn]
;int n, m;
intlowbit
(int x)
intadd
(int x,
int y,
int k)
//return0;
}int
getsum
(int x,
int y)
// 找比x+1 小 遞增長度為 y的 個數
return res;
}int
main()
/*************離散化過程******************/
sort
(e+1
, e+n+1)
;// 排序
for(
int i =
1;i <= n;i++
)/**************************************/
for(
int i =
1;i <= n;i++
)// 從1 到n 乙個乙個壓入樹狀陣列 不破壞最初的位置
else}}
printf
("case #%d: %d\n"
, cnt,
getsum
(n, m));
// 查詢總區間 長度為m的遞增序列的個數
}return0;
}
hdu 5542(樹狀陣列優化dp)
題意 求n個數中長度為m的上公升子串行的個數 解題思路 dp i j 表示第i個數長度為j的上公升序列的個數。dp i j sum,這裡的時間複雜度有o n 會超時,所以這裡要有優化。其實可以將a i 離散化,對於每乙個j,構造乙個樹狀陣列,這樣求sum就可以用樹狀陣列的求和了,時間複雜度可以降為o...
HDU 3743 樹狀陣列,離散化
其實,我也知道這道題是求逆序數來做的,但是問題來了,怎麼求逆序數,常規的解法肯定是不行的,因為資料量很大,那麼想到能用線段樹來做,是可以的,不過我還沒敲過,既然在看樹狀陣列就用這個做。又因為資料可以達到一百萬,並且資料又用不到,所以可以對資料進行離散化 include include include...
hdu 5877(樹狀陣列 離散化)
題意 查詢節點與它的父親節點相乘小於k的種類數。思路 用乙個樹狀陣列維護,查詢的話就是它的父親節點小於k a i 的個數。當跑完這個分支之後,要對他進行清除操作。ps 數比較大,需要離散化。include include include include include include include...