日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 2836 Traversal 简单DP + 树状数组

發布時間:2023/12/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 2836 Traversal 简单DP + 树状数组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給你一個序列,問相鄰兩數高度差絕對值小于等于H的子序列有多少個。

dp[i]表示以i為結尾的子序列有多少,易知狀態轉移方程為:dp[i] = sum( dp[j] ) + 1;( abs( height[i] - height[j] ) <= H )

由abs( height[i] - height[j] ) <= H 可得?height[i] - H <= height[j] <= height[i] + H

將序列中的數離散化,每個height對應一個id, 用樹狀數組求區間[?height[i] - H的id, height[i] + H的id ]內dp[j]的和,并且每次把新得到的dp[i]更新到樹狀數組中height[i]的id對應的位置。

?

1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int MAXN = 100100; 9 const int MOD = 9901; 10 11 int dp[MAXN]; 12 int height[MAXN]; 13 int num[MAXN]; 14 int C[MAXN]; 15 int n, d; 16 17 int lowbit( int x ) 18 { 19 return x & ( -x ); 20 } 21 22 int Query( int x ) 23 { 24 int res = 0; 25 while ( x > 0 ) 26 { 27 res += C[x]; 28 res %= MOD; 29 x -= lowbit(x); 30 } 31 return res; 32 } 33 34 void Add( int x, int v ) 35 { 36 while ( x <= n ) 37 { 38 C[x] += v; 39 C[x] %= MOD; 40 x += lowbit(x); 41 } 42 return; 43 } 44 45 int main() 46 { 47 while ( ~scanf( "%d%d", &n, &d ) ) 48 { 49 for ( int i = 1; i <= n; ++i ) 50 { 51 scanf( "%d", &height[i] ); 52 num[i] = height[i]; 53 } 54 55 sort( num + 1, num + n + 1 ); 56 int cnt = unique( num + 1, num + n + 1 ) - num - 1; 57 58 memset( C, 0, sizeof(C) ); 59 int ans = 0; 60 dp[0] = 0; 61 for ( int i = 1; i <= n; ++i ) 62 { 63 int id = lower_bound( num + 1, num + cnt + 1, height[i] ) - num; 64 int left = lower_bound( num + 1, num + cnt + 1, height[i] - d ) - num; 65 int right = upper_bound( num + 1, num + cnt + 1, height[i] + d ) - num - 1; 66 dp[i] = ( Query( right ) - Query( left - 1 ) + 1 ) % MOD; 67 ans += dp[i]; 68 Add( id, dp[i] ); 69 } 70 71 if ( ans >= n ) ans -= n; 72 else ans = 0; 73 printf("%d\n", ans % MOD ); 74 } 75 return 0; 76 }

?

轉載于:https://www.cnblogs.com/GBRgbr/p/3197983.html

總結

以上是生活随笔為你收集整理的HDU 2836 Traversal 简单DP + 树状数组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。