hdu5542 樹狀陣列 離散化 dp

2021-09-26 01:27:16 字數 1104 閱讀 8155

推薦

/**********************

通過離散化 +樹狀陣列 優化

****************************/

#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...