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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378100.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

劍指 Offer 57 - II. 和為s的連續正數序列 思考分析

輸入一個正整數 target &#xff0c;輸出所有和為 target 的連續正整數序列&#xff08;至少含有兩個數&#xff09;。 序列內的數字由小到大排列&#xff0c;不同序列按照首個數字從小到大排列。 示例 1&#xff1a; 輸入&#xff1a;target 9 輸出&#xff1a;[[2,3,4],[4…

java uuid靜態方法_Java UUID compareTo()方法與示例

java uuid靜態方法UUID類compareTo()方法 (UUID Class compareTo() method) compareTo() method is available in java.util package. compareTo()方法在java.util包中可用。 compareTo() method is used to compare two UUID objects or in other words, it is used to compar…

hdu 1214

找規律的題目。如果不是圓環形狀的話&#xff08;也就是n個人排成直線&#xff09;&#xff0c;完全調換順序需要(n-1)*n/2次交換&#xff1b;為環形的時候&#xff0c;可能不需要這么多&#xff0c;因為調換有了兩個方向。我們記直線時n個人需要的交換次數為g(n)(n-1)*n/2&…

六、規則組織的衍生組織——緯向破斜組織數學模型的建立

基礎概念公式推到可參考該專欄下的前幾篇博文。 緯向破斜組織圖&#xff1a; 下半部分(從左往右)&#xff1a;&#xff0c;3上2下2上1下&#xff0c;右斜&#xff0c;飛數為1 上半部分(從下往上)&#xff1a;&#xff0c;2上2下1上3下。左斜&#xff0c;飛數為-1 通過分析可…

車牌識別與計算機編程,基于MATLAB的車牌識別程序詳解.ppt

基于MATLAB的車牌識別程序詳解自定義一個字符函數&#xff0c;用來從車牌區域中提取出7個字符&#xff0c;其中利用切割函數來進行切割。 程序&#xff1a;function [word,result]getword(d) word[];flag0;y18;y20.5; while flag0 [m,n]size(d);%將d的尺寸存入m n wide0; while…

數據結構與算法2——數組

數組是應用最廣泛的數據存儲結構。它被植入到大部分編程語言中。大部分數據結構都有最基本的四個操作&#xff1a;插入、刪除、查找、修改。對于這四種操作每一種數據結構都有相應的算法。算法和數據結構因此就是非常緊密的相聯系的。 1 數組例子 …

java treemap_Java TreeMap putAll()方法與示例

java treemapTreeMap類putAll()方法 (TreeMap Class putAll() method) putAll() method is available in java.util package. putAll()方法在java.util包中可用。 putAll() method is used to copy all the key-value pairs from the given map (m) and paste it into this map…

LeetCode 167. 兩數之和 II - 輸入有序數組 思考分析

目錄1、暴力&#xff0c;超時2、雙指針滑動窗口條件限制 AC3、觀看題解&#xff08;吸取他人經驗&#xff09;1、二分查找2、雙指針3、雙指針二分查找給定一個已按照升序排列 的有序數組&#xff0c;找到兩個數使得它們相加之和等于目標數。 函數應該返回這兩個下標值 index1 …

敏捷開發用戶故事系列之七:用戶故事與MVC

這是用戶故事系列的第七篇。&#xff08;之一&#xff0c;之二&#xff0c;之三&#xff0c;之四&#xff0c;之五&#xff0c;之六&#xff0c;之七&#xff0c;之八&#xff0c;之九&#xff09;用戶故事和MVC沒有關系&#xff0c;因為MVC是實現方法&#xff0c;因此在思考用…

七、規則組織的衍生組織——菱形斜紋組織數學模型的建立

基礎概念公式推到可參考該專欄下的前幾篇博文。 菱形斜紋組織圖&#xff1a; 分析&#xff1a;首先3上2下2上1下&#xff0c;飛數為1&#xff0c;右斜。kw8表示從左下角開始往上數8格為緯峰所在位置&#xff1b;kj8表示從左上角開始往右數8格為經峰所在位置。 這樣就將菱形斜…

顯卡測試軟件毛毛蟲,超龍超龍,與眾不同,頂流配備,散熱一流,3070Ti超龍旗艦版評測...

可能大家都沒想到此次顯卡荒會持續近一年&#xff0c;還是出現國家級干涉才將這股“歪風”剎住了。而且也僅僅算是剎住了大陸的速度&#xff0c;主要踩死剎車的應該就是黃大廚。他從5月初推出的新核心就采取了出廠即鎖算力的做法&#xff0c;但是即便如此&#xff0c;那些看著高…

poj 2513 Colored Sticks

// 判斷圖是否聯通 在連通的基礎上還要判斷是否存在歐拉通路// 判斷連通就并查集了 判斷是否存在歐拉通路&#xff1a; 點度數為數的點 1 >3就是不存在的 其它是存在的// 我開始用 map 判重 然后就悲劇了一上午 好久沒寫 Trie樹了 都忘了、#include <iostream> #in…

strictmath_Java StrictMath ulp()方法與示例

strictmathStrictMath類ulp()方法 (StrictMath Class ulp() method) Syntax: 句法&#xff1a; public static double ulp(double do);public static float ulp(float fl);ulp() Method is available in java.lang package. ulp()方法在java.lang包中可用。 ulp(double do) Me…

八、非規則組織分析及其數學模型——平紋變化組織

非規則組織顧名思義&#xff0c;無法通過一個數學模型來描述所有的非規則組織、對于每一個具體的非規則組織而言&#xff0c;其也有一定的規律性可循&#xff0c;即可通過分析每一個具體的非規則組織的組織點運動規律來建立相應的數學模型。 一、平紋變化組織 平紋變化組織即…

怎么看xp計算機是32位還是64位,教你查看XP系統的不同32位還是64位詳細的步驟

電腦中使用的不同的版本如果安裝一些大型的游戲的時候都是有技巧來實現的&#xff0c;那在XP電腦中想要知道的對于不同的32位還是64位的版本的文件操作的時候新手是怎么知道自己安裝的軟件的版本呢&#xff0c;今天小編就來跟大家分享一下教你查看XP系統的不同32位還是64位詳細…

微軟面試100題2010年版全部答案集錦(含下載地址)

微軟等數據結構算法面試100題全部答案集錦作者&#xff1a;July、阿財。時間&#xff1a;二零一一年十月十三日。引言無私分享造就開源的輝煌。今是二零一一年十月十三日&#xff0c;明日14日即是本人剛好開博一周年。在一周年之際&#xff0c;特此分享出微軟面試全部100題答案…

get post

1. get是從服務器上獲取數據&#xff0c;post是向服務器傳送數據。2. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中&#xff0c;值和表單內各個字段一一對應&#xff0c;在URL中可以看到。post是通過HTTP post機制&#xff0c;將表單內各個字段與其內容放置在HTML …

LeetCode 27.移除元素 思考分析

題目 給你一個數組 nums 和一個值 val&#xff0c;你需要 原地 移除所有數值等于 val 的元素&#xff0c;并返回移除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須僅使用 O(1) 額外空間并 原地 修改輸入數組。 元素的順序可以改變。你不需要考慮數組中超出新長…

九、非規則組織分析及其數學模型——曲線斜紋組織

曲線斜紋組織圖&#xff1a; 因為其形狀酷似拋物線&#xff0c;拋物線又是曲線中的一種&#xff0c;故稱為曲線斜紋組織。 特點&#xff1a;1&#xff0c;每一根經紗上的組織點運動規律不變 2&#xff0c;飛數是變化的&#xff0c;故也稱為變飛數組織 飛數滿足的兩個條件&…

ulp通信_Java Math類ulp()方法及示例

ulp通信數學類ulp()方法 (Math class ulp() method) ulp() method is available in java.lang package. ulp()方法在java.lang包中可用。 ulp() method is used to return the size of a ulp of the given argument, where, a ulp of the given value is the positive distance…