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.mzph.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…