HDU 4521 2013腾讯编程马拉松初赛第四场 小明系列问题——小明序列(dp思想+线段树优化)
来源:互联网 发布:数控铣床编程实例带图 编辑:程序博客网 时间:2024/05/29 04:59
这个题的话,最开始想的是普通dp,但是看了一下数据规模10的5次方,O(N*N)肯定是会超时的,那么就想了一下,用线段树优化dp的查询过程
首先用线段树维护的是以当前点为序列最后一个点所能够达到的最大长度,为了避免影响到当前点的判断,所以在判断下一个点之前才更新当前这个点,具体的操作看代码
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;#define lc l,m,index<<1#define rc m+1,r,index<<1|1int num[100005],dp[100005];int cnt[100005<<2];int n,m;int MAX(int a,int b){ return a>b?a:b;}void updata(int l,int r,int index,int id,int mx) //更新当前点的前一个点{ cnt[index]=MAX(cnt[index],mx); if(l==r) return; int m=(r+l)>>1; if(id<=m) updata(lc,id,mx); else updata(rc,id,mx);return;}void build(int l,int r,int index){ cnt[index]=0; if(l==r) return ; int m=(l+r)>>1; build(lc); build(rc);return ;}int query(int L,int R,int l,int r,int index) //查找区间最大值{ if(L<=l && R>=r) return cnt[index]; int m=(l+r)>>1; int Max=0; if(L<=m) Max=MAX(Max,query(L,R,lc)); if(R>m) Max=MAX(Max,query(L,R,rc)); return Max;}int main(){ while(~scanf("%d%d",&n,&m)) { memset(dp,0,sizeof(dp)); int MX=0; for(int i=1;i<=n;i++) { scanf("%d",&num[i]); MX=MAX(MX,num[i]); } build(0,MX,1); int mx=0; for(i=1;i<=n;i++) { if(i-m-1>=1) //根据题意要在i-m-1开始对线段树进行更新 updata(0,MX,1,num[i-m-1],dp[i-m-1]);if(num[i]==0) //如果当前点为0,那么前一个点就是-1,所以特判0dp[i]=1;else dp[i]=1+query(0,num[i]-1,0,MX,1); //询问0到当前点num[i]的前一个点num[i]-1,最大长度为多少 mx=MAX(mx,dp[i]); } printf("%d\n",mx); } // system("pause"); return 0;}
- HDU 4521 2013腾讯编程马拉松初赛第四场 小明系列问题——小明序列(dp思想+线段树优化)
- HDU 4527 小明系列故事——玩转十滴水 2013腾讯编程马拉松初赛第五场第二题
- 2013腾讯编程马拉松初赛第一场(3月21日)小明系列故事——师兄帮帮忙
- 2013腾讯编程马拉松初赛第〇场(3月20日)小明系列故事——买年货
- 2013腾讯编程马拉松初赛第一场(3月21日) 小明系列故事——师兄帮帮忙 !!快速幂取摸
- HDU 4521 小明系列问题——小明序列【dp+线段树优化||最长递增序列】
- 【HDU】4521 小明系列问题——小明序列 线段树+DP
- HDU 4521 小明系列问题——小明序列 (线段树维护DP)
- HDU 4500 小Q系列故事——屌丝的逆袭 2013腾讯编程马拉松初赛第〇场第一题
- HDU 4505 小Q系列故事——电梯里的爱情 2013腾讯编程马拉松初赛第一场第一题
- hdu45221——小明系列问题——小明序列 线段树优化dp
- 2013腾讯编程马拉松初赛第四场(3.24)题解
- 2013腾讯编程马拉松初赛第一场(3月21日)小Q系列故事——电梯里的爱情
- 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流
- 2013腾讯编程马拉松初赛第〇场(3月20日) 小Q系列故事——屌丝的逆袭
- 2013腾讯编程马拉松初赛第一场(3月21日) 小Q系列故事——电梯里的爱情
- 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流 ---好水!!
- 2013腾讯编程马拉松初赛第〇场(HDU 4504)威威猫系列故事——篮球梦
- [MFC]系统托盘操作类,图标,气泡等
- 第八周项目4——加油
- Convnet在Windows下的使用
- ActionSupport、Preparable_详解
- Solution of Unable to start program VS C++
- HDU 4521 2013腾讯编程马拉松初赛第四场 小明系列问题——小明序列(dp思想+线段树优化)
- Cocos2d-x如何播放音乐和音效
- 【帧内预测】8.4.4.2.2 Reference sample substitution process for intra sample prediction
- native2ascii将中文国际化
- Lamda演算简介
- SYBASE常用函数
- 点击Cell插入菜单栏
- Head First设计模式-模板方法模式
- 巨强的安全知识库