hdu4521-小明系列问题——小明序列(线段树区间求最值)

题意:求最长上升序列的长度(LIS),但是要求相邻的两个数距离至少为d,数据范围较大,普通dp肯定TLE。线段树搞之就可以了,或者优化后的nlogn的dp。

代码为  线段树解法。

 1 #include <set>
 2 #include <map>
 3 #include <cmath>
 4 #include <ctime>
 5 #include <queue>
 6 #include <stack>
 7 #include <cctype>
 8 #include <cstdio>
 9 #include <string>
10 #include <vector>
11 #include <cstdlib>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 using namespace std;
16 typedef unsigned long long ull;
17 typedef long long ll;
18 const int inf = 0x3f3f3f3f;
19 const double eps = 1e-8;
20 const int maxn = 1e5+10;
21 int dp[maxn],seg[maxn<<2];        //线段树区间求最值
22 int a[maxn];
23 void update(int l,int r,int pos,int x,int val)
24 {
25     if (l == r)
26     {
27         seg[pos] = val;
28         return ;
29     }
30     int mid = (l + r) >> 1;
31     if (x <= mid)
32         update(l,mid,pos<<1,x,val);
33     if (x > mid)
34         update(mid+1,r,pos<<1|1,x,val);
35     seg[pos] = max(seg[pos<<1],seg[pos<<1|1]);
36 }
37 int query(int l,int r,int pos,int x,int y)
38 {
39     if (x <= l && y >= r)
40         return seg[pos];
41     int mid = (l + r) >> 1;
42     int ans1 = 0,ans2 = 0;
43     if (x <= mid)
44         ans1 = query(l,mid,pos<<1,x,y);
45     if (y > mid)
46         ans2 = query(mid+1,r,pos<<1|1,x,y);
47     return max(ans1,ans2);
48 }
49 int main(void)
50 {
51     #ifndef ONLINE_JUDGE
52         freopen("in.txt","r",stdin);
53     #endif
54     int n,d;
55     while (~scanf ("%d%d",&n,&d))
56     {
57         memset(seg,0,sizeof(seg));
58         int len = 0;
59         for (int i = 0; i < n; i++)
60         {
61             scanf ("%d",a+i);
62             a[i] += 2;                     //因为a[i]可能为0,而我的线段树是从1开始的所以加2
63             len = max(len,a[i]);
64         }
65         int ans = 1;
66         for (int i = 0; i < n; i++)
67         {
68             dp[i] = query(1,len,1,1,a[i]-1) + 1;   //不能等于,所以减1,dp[i]表示以a[i]结尾的最长不降序列长度,
69             if (i >= d)                            //延迟更新,这是这道题的关键,
70                 update(1,len,1,a[i-d],dp[i-d]);
71             ans = max(dp[i],ans);
72         }
73         printf("%d\n",ans);
74     }
75     return 0;
76 }
时间: 2024-12-20 21:42:55

hdu4521-小明系列问题——小明序列(线段树区间求最值)的相关文章

【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****

[codevs2216]行星序列 2014年2月22日3501 题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小宇航员夏令营”,在这里小可可不仅学到了丰富的宇航知识,还参与解决了一些模拟飞行中发现的问题,今天指导老师交给他一个任务,在这次模拟飞行的路线上有N个行星,暂且称它们为一个行星序列,并将他们从1至n标号,在宇宙未知力量的作用下这N个行星的质量是不断变化的,所以他们对飞船产生的引力也会不断变化,小可可的

Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询

题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 给出一个长度为n的整数序列a1,a2,...,an,进行m次操作,操作分为两类. 操作1:给出l,r,v,将al,al+1,...,ar分别加上v: 操作2:给出l,r,询问 输入描述: n个数,m次操作op=1, l,r,v 区间[l,r] 加

hdu4521 小明系列问题——小明序列(LIS变种 (线段树+单点更新解法))

链接: huangjing 题目:中文题目 思路: 这个题目如果去掉那个距离大于d的条件,那么必然是一个普通的LIS,但是加上那个条件后就变得复杂了.用dp的解法没有看懂,我用的线段树的解法...就是采用延迟更新的做法,用为距离要大于d啊,所以我们在循环到第i的时候,就对(i-d-1)这个点进行更新,因为如果在(i-d-1)这个点更新了,会对后面的造成影响,然后线段树的tree[]数组存的是以i结尾的最长lis,那么每次询问的时候就找最大的tree[]就可以了... 代码: 小明系列问题--小明

hdu----(4521)小明系列问题——小明序列

小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1812    Accepted Submission(s): 551 Problem Description 大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了.可怜的小明苦苦地在各大网站上寻找着新的序列问题, 可是找来找

小明系列问题——小明序列

hdu4521:http://acm.hdu.edu.cn/showproblem.php?pid=4521 题解:给你一个序列,然后让你找一个最长上升子序列,但是这个最长上升子序列的数在原来序列的间隔不少于d. 题解:如果没有d的要求就是一个求最长上升子序列.这里用线段树可以来优化.以数的值来建树.维护一个sum值,num[rt].sum表示以rt值结尾的最长上升子序列的长度.同时f[i]表示以第i个数结尾的最长上升子序列的长度.对于d,我们只要再算第i个数的时候,只更新了前1到i-d-1个数

小明系列问题――小明序列(LIS)

小明系列问题――小明序列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4521 Description 大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了.可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来找去都是自己早已研究过的序列.小明想既然找不到,那就自己来发明一个新的序列问题吧!

hdu 4521 小明系列问题——小明序列 (间隔至少为d的LIS 两种解法)

先附上资源地址:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定工厂的电力有限,一次只能供给一个车间使用.也就是说,一个车间开工的时候,其他车间都必须停工

hdu45221——小明系列问题——小明序列 线段树优化dp

小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1918    Accepted Submission(s): 583 Problem Description 大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了.可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来找

hdu 4521 小明系列问题——小明序列 线段树+二分

小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem Description 大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了.可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来找去都是自己早已研究过的序列.小明想既然找不到,那就自己来发明一个新的序列问题吧!小明想啊想,终于想出了一个新的序列