hdu 4521 小明系列问题——小明序列(线段树 or DP)
题目链接:hdu 4521
本是 dp 的变形,却能用线段树,感觉好强大。
由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时。所以用线段树进行优化。线段树维护的是区间内包含某点的最大满足条件的长度,叶子节点以该元素结尾,最长长度。至于相邻两项隔 d 个位置,求 dp[i] 时,我们只把 dp[i - d - 1] 更新至线段树中,然后在这颗线段树中找最大的个数。
具体来说,就是把序列 S 的值 Ai 作为线段树叶子下标,以 Ai 结尾的 LIS 长度(即经典算法里的 dp[i])作为叶子结点的值,然后对每个 Ai,查询 0 ~ Ai - 1 的最大的 LIS 长度(也就是 dp[]),这个用线段树实现可以很快地得到结果;至于更新时,不能每遍历到一个就直接更新,因为这样子的话 A[i - d] ~ A[i - 1] 会被加入到线段树中,它们对 A[i] 无任何作用,却会对线段树的查询结果有干扰,因此我们在对每一个 Ai 进行查询(即计算出对应的 dp[i])前,就只把 A[i - d - 1] 即 dp[i - d - 1] 加入到线段树中即可,这个操作是很关键的。理清思路后,就是线段树的单点更新、区间查询了。
因为我写线段树习惯从 1 开始,所以对所有元素都 +1 了。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define root int rt, int l, int r
- #define lson rt << 1, l, mid
- #define rson rt << 1 | 1, mid + 1, r
- #define makemid int mid = l + r >> 1
- const int N = ;
- int len[N << ];
- void build(root) {
- len[rt] = ;
- if(l == r) return ;
- makemid;
- build(lson);
- build(rson);
- }
- inline void pushup(int rt) {
- len[rt] = max(len[rt << ], len[rt << | ]);
- }
- int pos, val;
- void update(root) {
- if(l == r) {
- len[rt] = max(len[rt], val);
- return ;
- }
- makemid;
- if(pos <= mid) update(lson);
- else update(rson);
- pushup(rt);
- }
- int ql,qr;
- int query(root) {
- if(ql <= l && r <= qr) return len[rt];
- makemid;
- int res = ;
- if(ql <= mid) res = max(res, query(lson));
- if(qr > mid) res = max(res, query(rson));
- return res;
- }
- int dp[N], num[N];
- int main() {
- int n,d;
- while(~scanf("%d%d",&n,&d)) {
- int mm = , ans = ;
- for(int i = ; i <= n; ++i) {
- scanf("%d",num + i);
- ++num[i];
- mm = max(mm, num[i]);
- }
- build(,,mm);
- for(int i = ; i <= n; ++i) {
- if(i - d - >= ) { //这是关键,只把 i-d-1 前面的更新至线段树中
- pos = num[i - d - ];
- val = dp[i - d - ];
- update(,,mm);
- }
- if(num[i] == ) dp[i] = ;
- else {
- ql = ;
- qr = num[i] - ;
- dp[i] = query(,,mm) + ;
- }
- ans = max(ans, dp[i]);
- }
- printf("%d\n",ans);
- }
- return ;
- }
hdu 4521 小明系列问题——小明序列(线段树 or DP)的更多相关文章
- HDU 4521 小明系列问题——小明序列 (线段树维护DP)
题目地址:HDU 4521 基本思路是DP.找前面数的最大值时能够用线段树来维护节省时间. 因为间隔要大于d. 所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的. 代码例如以下: #in ...
- hdu 4521 小明系列问题——小明序列 线段树+二分
小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Pro ...
- hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- 小明系列问题――小明序列(LIS)
小明系列问题――小明序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- hdu----(4521)小明系列问题——小明序列
小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- 小明系列问题——小明序列(Lis 相距大于d的单调上升子序列)
小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- HDU 4521 小明系列问题——小明序列 (线段树 单点更新)
题目连接 Problem Description 大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了.可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来 ...
随机推荐
- Conditional - 编译屏蔽特性
public class Test : MonoBehaviour { void Start() { Func(); } [System.Diagnostics.Conditional("U ...
- unity替换mesh测试
直接替换SkinnedMeshRender的Mesh,实现所谓断肢效果(不过最近发现,绑定多mesh似乎更好实现这样的效果.有时间准备写一篇): 只要不改变两个Mesh原始文件的层级,就不会出现权重的 ...
- 2016 Al-Baath University Training Camp Contest-1 A
Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...
- 解析xml,几种方式
市面上解析xml分两种方式,1.dom 2.sax ,xml解析常见的一共有三种开发包,1.jaxp 2.jdom 3.dom4j,这三种方式最常用的是dom4j,jaxp和jdom很少有人用, ...
- Json 入门例子【2】
<script> var json1 = { "id": 1, "tagName": "apple" }; $("#f ...
- MVC2.0==>MVC3.0
总结出如下4个MVC3.0和2.0的重要区别. 1. @ 符号在 View 页面中的用法: C#代码以 @符号开头,例如 1 <h2>Name: @Model.Name</h2> ...
- linux 切换多个jdk脚本
1,编写脚本 jdkswitch.sh #!/bin/sh # usage: . this_file [argvs] openjdk7_home=/usr/lib/jvm/java--openjdk- ...
- iOS开发,推送消息 steps
概述:推送过程简介 一.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请. ...
- iOS深入学习(UITableView:系列1-最基本的东西)
这是UITableView博客系列的第一篇,使用xib和arc编码,主要讲解一些UITableView使用过程中简单的.但是又容易被忽略的东西,而且我会告诉读者,怎样在使用了之后就再也不会忘记. 操作 ...
- Ajax发送POST请求的心路历程
好多年前就在项目中用ajax实现了页面部分数据的发送,当时用的是GET方法. 这次用POST方法实现同样的功能,竟然花费了不少的时间! ① 关于JQuery ajax的配置项说明 url : 请求的u ...