HDU 4521 小明系列问题——小明序列 (线段树维护DP)
题目地址:HDU 4521
基本思路是DP。找前面数的最大值时能够用线段树来维护节省时间。
因为间隔要大于d。
所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的。
代码例如以下:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm> using namespace std;
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
#define LL __int64
const int INF=0x3f3f3f3f;
struct node
{
int maxv, num;
};
int maxv[400000], a[1100000];
int q_maxv;
void PushUp(int rt)
{
maxv[rt]=max(maxv[rt<<1],maxv[rt<<1|1]);
}
void Update(int p, int x, int l, int r, int rt)
{
if(l==r)
{
maxv[rt]=p;
return ;
}
int mid=l+r>>1;
if(x<=mid) Update(p,x,lson);
else Update(p,x,rson);
PushUp(rt);
}
void Query(int ll, int rr, int l, int r, int rt)
{
if(ll<=l&&rr>=r)
{
q_maxv=max(q_maxv,maxv[rt]);
return ;
}
int mid=l+r>>1;
if(ll<=mid) Query(ll, rr, lson);
if(rr>mid) Query(ll,rr,rson);
}
int main()
{
int n, d, i, j, top;
node tmp, now;
while(scanf("%d%d",&n,&d)!=EOF)
{
queue<node>q;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
memset(maxv,0,sizeof(maxv));
for(i=0;i<n;i++)
{
q_maxv=0;
if(a[i])
Query(0,a[i]-1,0,100000,1);
now.maxv=q_maxv;
now.num=a[i];
q.push(now);
if(i>=d)
{
tmp=q.front();
q.pop();
Update(tmp.maxv+1,tmp.num,0,100000,1);
}
}
while(!q.empty())
{
tmp=q.front();
q.pop();
Update(tmp.maxv+1,tmp.num,0,100000,1);
}
printf("%d\n",maxv[1]);
}
return 0;
}
HDU 4521 小明系列问题——小明序列 (线段树维护DP)的更多相关文章
- 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 ...
- hdu 4521 小明系列问题——小明序列(线段树 or DP)
题目链接:hdu 4521 本是 dp 的变形,却能用线段树,感觉好强大. 由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时.所以用线段树进行优化.线段树维护的是区间内 ...
- 小明系列问题――小明序列(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 ...
- hdu4521 小明系列问题——小明序列
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission ...
- 线段树维护区间前k小
线段树维护区间前k小 $ solution: $ 觉得超级钢琴太麻烦?在这里线段树提供一条龙服务 . 咳咳,开始讲正题!这道题我们有一个和超级钢琴复杂度一样 $ ~O(~\sum x\times lo ...
随机推荐
- 提供一段Excel获取Title的标题,类似于A、AA、AAA,我们操作Excel的时候通常根据次标题来获取一定的操作范围。
/******************************************** FormatExcelColumTitle Purpose Get excel title like &qu ...
- c#Ulong用一个高位Uint和低位Uint表示
有时候考虑到平台之间的通用性,可能把一个Ulong拆分成2个Uint来进行各平台之间的通讯,当时转换的时候有点头晕,对与或预算不是很熟悉,不过还是花了半小时弄出来了,代码: //ulong的最大值2^ ...
- nginx proxy_pass 后面的斜杠
# add / location /app/ { proxy_pass http://$backend/; } # location /app/ { proxy_pass http://$backen ...
- memcached与redis
Memcached VS Redis 问题:memcached 与 redis 哪个好? 答:这个问题它依赖与工程类别和它的数据. 1.它们都是内存 key/value 类型的高速与高可用的查询表. ...
- day3_python学习笔记_chapter5_数字
1. 整形的表示范围-2^32~2^32 - 1 : 长整形表示:aLong = 99999L 2. 复数的属性, num.real,该复数的实部, num.imag,该复数的虚部.num.conju ...
- Android 内部存储安装apk文件实现
目前国内市场的山寨机横行,安卓手机升级也是一天一个样,对于原来老手机可能没有SDCARD,导致我们的APP不能下载资源,无法更新APP,针对这种情况有以下解决方案.通过以下函数判断是否有SD卡再判断下 ...
- Fiddler [Fiddler] Connection to localhost. failed.
原文地址:http://blog.chinaunix.net/uid-20675015-id-1899931.html 在用Fiddler调试本机的网站时,即访问http://localhost,返回 ...
- symfony2-创建提交表单生成数据过程
一.”一对多“关系 表shop(一)
- .NET(C#):使用XPath查询带有命名空间(有xmlns)的XML
原文http://www.cnblogs.com/mgen/archive/2011/05/24/2056025.html 众所周知,XmlDocument可以进行XPath查询,但实际上这里所说的X ...
- Android使用XML全攻略(2)
Android使用XML全攻略(2) Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力会 ...