HDOJ 3450 HDU 3450 Counting Sequences ACM 3450 IN HDU
Posted on 2010-08-30 09:59 MiYu 閱讀(401) 評論(0) 編輯 收藏 引用 所屬分類: ACM ( 數據結構 ) 、ACM ( 樹狀數組 )MiYu原創, 轉帖請注明 : 轉載自 ______________白白の屋
題目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=3450
題目描述:
Counting Sequences
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others)Total Submission(s): 312 Accepted Submission(s): 105
4 2 1 3 7 5
4
題目分析 :
( 線段樹 || 樹狀數組 ) + DP
可以使用線段樹 或 樹狀數組來做, 可惜本人現在還不會線段樹, 下面是 樹狀數組 解題的分析 :
因為題目要求的 是 k >= 2 , 而且 相鄰元素 之差的絕對值 不大于 d, 這里糾結了很久 , 一直沒明白 "and the
neighboring 2 elements have the difference not larger than d" 這句話的意思, 英語水平太差了. 最后在
Amb 的解釋下才明白, 0rz...........
為了使問題簡單化, 我們不凡討論 k >= 1 的情況:
因為 輸入數據的范圍比較大, 2<=n<=100000,1<=d=<=10000000 , 所以先要將 數據排序后 用 hash[max] 做離散化處理.
當然, 原數組需要另開一個數組保存起來. 處理完成后, 我們可以這樣理解 : 用樹狀數組 com[pos], ( pos 為 num 在 hash 數組中的位
置 ) . 記錄 能與 num 構成 完美串的個數. 初始狀態的 完美子串 為0, 每次加入一個數, 那么這個數 num 與 比他小且差不超過d的第一
個數 而且與 比他大且差不超過d的第一個數 構成完美串 . 更新樹狀數組. 最后求出所有的子串和 sum, 因為算法是以 k >= 1 來做的,而
題目要求 k >= 2, 也就是說, 對 N 個數, 就多計算了 N 次, 因此 (sum - N ) % 9901 即為所求. ( 別忘了MOD....... )
代碼如下 :


