hdu 4521(线段树优化dp)
小明系列问题——小明序列
提起小明序列,他给出的定义是这样的:
①首先定义S为一个有序序列,S={ A1 , A2 , A3 , ... , An },n为元素个数 ;
②然后定义Sub为S中取出的一个子序列,Sub={ Ai1 , Ai2 , Ai3 , ... , Aim },m为元素个数 ;
③其中Sub满足 Ai1 < Ai2 < Ai3 < ... < Aij-1 < Aij < Aij+1 < ... < Aim ;
④同时Sub满足对于任意相连的两个Aij-1与Aij都有 ij - ij-1 > d (1 < j <= m, d为给定的整数);
⑤显然满足这样的Sub子序列会有许许多多,而在取出的这些子序列Sub中,元素个数最多的称为“小明序列”(即m最大的一个Sub子序列)。
例如:序列S={2,1,3,4} ,其中d=1;
可得“小明序列”的m=2。即Sub={2,3}或者{2,4}或者{1,4}都是“小明序列”。
当小明发明了“小明序列”那一刻,情绪非常激动,以至于头脑凌乱,于是他想请你来帮他算算在给定的S序列以及整数d的情况下,“小明序列”中的元素需要多少个呢?
输入的第一行为两个正整数 n 和 d;(1<=n<=10^5 , 0<=d<=10^5)
输入的第二行为n个整数A1 , A2 , A3 , ... , An,表示S序列的n个元素。(0<=Ai<=10^5)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;#define lson l,m,rt<<1
#define rson m+1,r,(rt<<1)|1
#define N (int)(1e5+5)int num[4*N],save[N],dp[N];void pushup(int rt) //向上更新
{num[rt]=max(num[rt<<1],num[rt<<1|1]);return ;
}void build(int l,int r,int rt)
{num[rt]=0;if(l==r)return ;int m=(l+r)>>1;build(lson);build(rson);return ;
}void update(int t,int v,int l,int r,int rt) //端点更新
{if(l==r){num[rt]=max(num[rt],v);return ;}int m=(l+r)>>1;if(t<=m)update(t,v,lson);elseupdate(t,v,rson);pushup(rt);}int query(int L,int R,int l,int r,int rt)//找出L,R区间内最大的长度
{if(L<=l&&R>=r)return num[rt];int m=(l+r)>>1;int Max=0;if(L<=m)Max=max(Max,query(L,R,lson));if(R>m)Max=max(Max,query(L,R,rson));return Max;
}
int main()
{int n,d;while(scanf("%d%d",&n,&d)!=EOF){int Max=0;for(int i=1;i<=n;i++){scanf("%d",&save[i]);Max=max(Max,save[i]);}build(0,Max,1);int ans=0;for(int i=1;i<=n;i++){if(i-d-1>=1)update(save[i-d-1],dp[i-d-1],0,Max,1); //这是关键,只把i-d-1前面的更新至线段树中if(save[i]==0)dp[i]=1;elsedp[i]=query(0,save[i]-1,0,Max,1)+1;ans=max(dp[i],ans);}printf("%d\n",ans);}return 0;
}
hdu 4521(线段树优化dp)相关推荐
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)
题意 题目链接:https://www.nowcoder.com/acm/contest/91/H 来源:牛客网 题解 设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的编号,r[i ...
- CF 474E Pillars(线段树优化DP)
CF 474E Pillars 题目描述 Marmot found a row with n n n pillars. The i i i -th pillar has the height of h ...
- AtCoder Regular Contest 085 F NRE 线段树优化dp
题意 有长度为n初始全为0的数组A和仅由0和1组成的数组B.现在给出m个区间,每次可以选择某个区间[l,r],使得A数组下标在[l,r]之间的元素变为1.问A和B最小不同位置数量是多少. n,m< ...
- CodeForces - 960F[动态开点线段树优化dp]详解
题意:给一张有向图,每条边有边权与编号,求一条最长的路径,这条路径的边权与编号都是递增的.(编号指输入顺序) 首先我们回忆一下普通得LIS得做法:就是dp[i]以第i个结尾得最长上升子序列的长度,那么 ...
- [ZJOI2010] 基站选址(线段树优化dp)
problem luogu-P2605 solution 首先,肯定都能想到最暴力的 dpdpdp. dpi,j:idp_{i,j}:idpi,j:i 个村庄为止一共选了 jjj 个基站,且第 ii ...
- CF834D. The Bakery(线段树优化dp 决策单调性优化dp)
linkkkkk 题意: 将一个长度为 n 的序列分为 m段,使得总价值最大. 一段区间的价值表示为区间内不同数字的个数. n≤35000,m≤50 思路: 考虑朴素的dpdpdp方程:dp[i][j ...
- BZOJ2131 免费的馅饼【线段树优化DP】
Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成,分别表示了每个馅饼落到 ...
- 【2019牛客暑期多校训练营(第二场)- E】MAZE(线段树优化dp,dp转矩阵乘法,线段树维护矩阵乘法)
题干: 链接:https://ac.nowcoder.com/acm/contest/882/E?&headNav=acm 来源:牛客网 Given a maze with N rows an ...
- [CF1603D] Artistic Partition——欧拉函数,线段树优化DP
[CF1603D] Artistic Partition 题解 问题其实就是要你把 1 ∼ n 1\sim n 1∼n 分成 k k k 段,最小化每一段的 c c c 值的和. 首先我们会想到,如果 ...
最新文章
- Python之文件操作
- java 项目使用 ajaxfileupload
- SharePoint 列表应用实例 - 显示约束
- SM30需要传输请求
- Python进阶_wxpy学习:聊天对象
- 对url给后台传数据的时候特殊字符需要转义
- CSS3景深-perspective
- 学Python可以用来干什么?就业情况究竟怎么样?
- Lua学习笔记(5): 表
- 互斥与同步——local_irq_enable与local_irq_disable
- python代码实例-python程序实例
- 网络流 poj 2195
- 【震撼】《京东技术解密》获众大神集体推荐,4千人10年经验一次放送
- [线性代数] 常用定义与公式
- 系统自带恶意软件清理助手
- 和老外聊天、发邮件常用英语缩写。
- 基于FPGA的密码锁
- 基于深度学习的语义分割
- MySQL学习博客第一篇
- Arrays和数组的转换
热门文章
- html自动播放图箭头,html5制作焦点图左右导航箭头样式
- 神策数据桑文锋:让销售回归科学
- 精益数据分析 | 你孜孜追求的“增长”可能只是自嗨
- 聚美优品范忱:我是如何将用户推荐准确率提升 10% 的?
- Unity3d(U3D) Windows/Android/IOS 播放rtmp/rtsp方案
- LBS突围:从微信到微博
- day4-生成器并行运算
- dubbo使用遇到的问题
- 『mcse 2008基础架构』Chapter 01 IP协议及配置方法 第1课网络连接及配置方法
- 复数矩阵QR分解算法的C++实现