hdu 4521 小明系列问题——小明序列 线段树
题意:
给你一个长度为n的序列v,你需要输出最长上升子序列,且要保证你选的两个相邻元素之间在原数组中的位置之差大于d
题解:
这个就是原来求最长上升子序列的加强版,这个思路和最长上升子序列的差不多
设dp[i]:截至到位置i能找到的最长上升子序列
对于一个位置i,我们要找截至到它的最长上升子序列,就需要for循环寻找dp[j]的最大值(且v[j]<v[i] 而且 1<=j<=i-1)
我们可以使用线段树来维护dp[j]的最大值
但是你发现dp[1],dp[2]...dp[i-1]中可能有某个位置k(1<=k<=i-1)满足,v[k]>v[i],那么dp[k]我们就不可以去维护这个值
我们怎么解决这个问题?
我们可以按照v[k]的值把它的dp[k]放在线段树中的位置v[k]位置,这样就可以避免这个问题

代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
#define rt root
#define ls root<<1
#define rs (root<<1)|1
#define mem(a) memset(a,0,sizeof(a))
#define mem_(a) memset(a,-1,sizeof(a))
#define mem__(a) memset(a,INF,sizeof(a))
typedef long long ll;
int tree[maxn<<2],arr[maxn],len[maxn];
int n,d;
struct shudui
{
int val,id;
} m[maxn];
bool mmp(shudui x,shudui y)
{
if(x.val!=y.val)
return x.val<y.val;
return x.id>y.id;
}
void push_up(int root)
{
tree[rt]=max(tree[ls],tree[rs]);
}
void update(int root,int L,int R,int pos,int val)
{
if(L==R)
{
tree[rt]=val;
return;
}
int mid=(L+R)>>1;
if(pos<=mid) update(ls,L,mid,pos,val);
else update(rs,mid+1,R,pos,val);
push_up(rt);
}
int query(int root,int L,int R,int LL,int RR)
{
if(LL<=L && R<=RR)
{
return tree[rt];
}
int mid=(L+R)>>1,ans=0;
if(LL<=mid) ans=max(ans,query(ls,L,mid,LL,RR));
if(RR>mid) ans=max(ans,query(rs,mid+1,R,LL,RR));
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int i,j,k,n;
while(cin>>n>>k)
{
mem(tree);
memset(len,0,sizeof(len));
int mx=-1;
for(i=1; i<=n; i++)
{
cin>>arr[i];
if(arr[i]>mx)mx=arr[i];
}
mx++;
int ans=0;
for(i=1; i<=n; i++)
{ //这个arr[i-k-1]+1就是为了保证严格上升子序列
if(i-k-1>0)update(1,1,mx,arr[i-k-1]+1,len[i-k-1]);
if(arr[i]!=0)len[i]=query(1,1,mx,1,arr[i])+1;//arr[i]==0时查找会出现错误111111111111155t
else len[i]=1;
if(len[i]>ans)ans=len[i];
}
cout<<ans<<endl;
}
}
/*
5 0
3 1 5 2 3 len1=1 U 4 1
Q 1 1 1
len2=2 U 2 2
Q 1 5 3
len3=3
*/
hdu 4521 小明系列问题——小明序列 线段树的更多相关文章
- 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 大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了.可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来 ...
- hdu 4521 小明系列问题——小明序列(线段树 or DP)
题目链接:hdu 4521 本是 dp 的变形,却能用线段树,感觉好强大. 由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时.所以用线段树进行优化.线段树维护的是区间内 ...
- HDU 4521 小明系列问题——小明序列 (线段树维护DP)
题目地址:HDU 4521 基本思路是DP.找前面数的最大值时能够用线段树来维护节省时间. 因为间隔要大于d. 所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的. 代码例如以下: #in ...
随机推荐
- 最全的HashMap源码解析!
HashMap源码解析 HashMap采用键值对形式的存储结构,每个key对应唯一的value,查询和修改的速度很快,能到到O(1)的平均复杂度.他是非线程安全的,且不能保证元素的存储顺序. 他的关系 ...
- Vim 自动添加脚本头部信息
每次写脚本还在为忘记添加头部信息啥的烦恼? 按照下面这么做,帮你减轻点烦恼. # 打开配置文件: vim /root/.vimrc # 添加如下信息: autocmd BufNewFile *.sh ...
- Docker学习笔记之基本命令使用
测试的环境为Ubuntu1804. 1. search命令搜索镜像 sudo docker search centos 搜索centos相关的镜像,可以看到第一个最多星的的centos是官方的镜像,而 ...
- WEB开发框架性能排行与趋势分析2-三大惊喜变化
WEB开发框架性能排行与趋势分析2-三大惊喜变化 Web框架性能排名 上一次基于TechEmpower的<Web Framework Benchmarks>性能基准测试的解读之后,时隔两年 ...
- APP测试之Monkey测试
一.简介 1.什么是Monkey测试? Monkey testing,也有人叫做搞怪测试.就是用一些稀奇古怪的操作方式去测试被测试系统,以测试系统的稳定性.Monkeytest,一般指这样的测试活动, ...
- 基础练习(上) - 蓝桥杯(Python实现)
闰年判断: 题目: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍数 ...
- C# 中的动态类型
翻译自 Camilo Reyes 2018年10月15日的文章 <Working with the Dynamic Type in C#> [1] .NET 4 中引入了动态类型.动态对象 ...
- 面向对象的延伸与Java内部定义类的应用
识别类 传统的过程化程序设计,必须从顶部的main函数开始编写程序,在面向对象程序设计时没有所谓的"顶部".首先从设计类开始,然后再往每个类中添加方法. 识别类的规则是在分析问题的 ...
- 微服务网关1-Spring Cloud Gateway简介
一.网关基本概念 1.API网关介绍 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各 ...
- gradles理解和文件配置
gradle gradle tasks :查看所有的taske命令 bootJar:打包,讲项目的所有依赖和主工程代码打包,一个可直接执行的一个包,不需要tomcat运行 gradle使用bootja ...