题意:

给出序列,找出每个连续长度为k的子序列的最大值和最小值。

思路:

裸单调队列...

单调队列这东西用的真的非常局限,大概只能用到这种情景中==

简单说一下维护:

添加元素,为了保持单调性,排除队尾所有比要添加的元素大或者小的元素。

出队,出队之前要保证要出队的元素在当前范围内,如果不在先把不在的都出队。

这题可以只记录索引号,所以内存还是可以优化的,懒得写了。

坑:

复制自己的两段代码忘记改其中一个大于号。WA了一上午。不要不要的。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct st
{
int num,pos;
};
int tmp[];
st ansma[];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&tmp[i]);
}
if(m==)
{
for(int i=;i<=n;i++)
{
printf("%d",tmp[i]);
if(i!=n)
printf(" ");
}
printf("\n");
for(int i=;i<=n;i++)
{
printf("%d",tmp[i]);
if(i!=n)
printf(" ");
}
printf("\n");
return ;
}
int st,ed;
st=;ed=;
ansma[].num=tmp[];
ansma[].pos=;
for(int i=;i<m;i++)
{
while(tmp[i]<=ansma[ed].num&&ed>=st)
{
ed--;
}
ed++;
ansma[ed].num=tmp[i];
ansma[ed].pos=i;
}
for(int i=m;i<=n;i++)
{
while(tmp[i]<=ansma[ed].num&&ed>=st)
{
ed--;
}
ed++;
ansma[ed].num=tmp[i];
ansma[ed].pos=i;
while(ansma[st].pos<=i-m&&st<ed)
{
st++;
}
printf("%d",ansma[st].num);
if(i!=n)
printf(" ");
}
printf("\n");
st=;ed=;
ansma[].num=tmp[];
ansma[].pos=;
for(int i=;i<m;i++)
{
while(tmp[i]>=ansma[ed].num&&ed>=st)
{
ed--;
}
ed++;
ansma[ed].num=tmp[i];
ansma[ed].pos=i;
}
for(int i=m;i<=n;i++)
{
while(tmp[i]>=ansma[ed].num&&ed>=st)
{
ed--;
}
ed++;
ansma[ed].num=tmp[i];
ansma[ed].pos=i;
while(ansma[st].pos<=i-m&&st<ed)
{
st++;
}
printf("%d",ansma[st].num);
if(i!=n)
printf(" ");
}
printf("\n");
}

POJ 2823【单调队列】的更多相关文章

  1. Sliding Window POJ - 2823 单调队列模板题

    Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间 ...

  2. caioj 1172 poj 2823 单调队列过渡题

    给定一个n个数的数列,从左至右输出每个长度为m的数列段内的最大数. 输入:第一行两个整数n和m( 1<= n <= 20 0000,m<=n).下来给出n个整数. 输出:一行一个整数 ...

  3. poj 2823 单调队列

    思路:裸的单调队列. #include<iostream> #include<cstring> #include<cstdio> #include<algor ...

  4. POJ 2823 单调队列入门水题

    最最基础的单调队列题目.一个单增一个单减.还是可以借此好好理解一下单调队列的. #include <stdio.h> #include <string.h> #include ...

  5. poj 2823单调队列模板题

    #include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃 #define N  1100000 int getmin[N],getmax[N],num[N],n,k, ...

  6. POJ 2838 单调队列

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 55309   Accepted: 15911 ...

  7. poj 3017 单调队列优化动态规划

    思路:dp[i]=min{dp[j]+max(num[j+1]...num[i])},其中sum[i]-sum[j]<=m. 那么我们需要用单调队列维护j到i的最大值. #include< ...

  8. poj 2373 单调队列优化背包

    思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值.那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了. #include<iostrea ...

  9. POJ 3017 单调队列dp

    Cut the Sequence Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8764   Accepted: 2576 ...

  10. POJ 1821 单调队列+dp

    题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...

随机推荐

  1. datatables的Bootstrap样式的分页怎么添加首页和尾页(引)

    找到dataTables.bootstrap.js(版本3):(此项目中文件名为:dataTableExt.js) $.fn.dataTableExt.oApi.fnPagingInfo = func ...

  2. C# 爬虫批量下载文件

    public static void DownFile(string url, string path, string fileName) { HttpWebRequest request = (Ht ...

  3. Saiku操作界面的简化

    在安装完毕Saiku后,由于是社区版本,所以界面上存在很多升级为商业版的文字.为了使得系统不那么碍眼,可通过如下方式更改来去除相应的内容: 1.去除查询页面的升级为商业版的提示 You are usi ...

  4. 电脑设置固定ip

  5. 转:java日志组件介绍(common-logging,log4j,slf4j,logback )

    原网址:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging common-logging是 ...

  6. SQL 查询本月无数据用上个月的数据问题

    SQL 查询本月无数据用上个月的数据 前言 因为标题有长度限制,先简要说明一下应用场景.比如我们要查一段时间范围内(2013-08-01至2013-12-31)每个月每个运营商的用户总量,每个运营商用 ...

  7. CSS Margin外边距合并

    应该知道这点东西的!!! 可是偏偏记不住! 外边距合并会发生在以下两种情况下: 1 垂直出现的两个拥有外边距的块级元素. div1 { margin-bottom: 20px; } div2 { ma ...

  8. android学习笔记39——使用原始资源

    原始资源 android中没有专门提供管理支持的类型文件,都被称为原始资源.例如:声音资源... android原始资源存放位置: 1.res/raw,android SDK会处理该目录下的原始资源, ...

  9. 一款灵活好用的日历控件Kalendae

    Kalendae是一款纯js不依赖任何js库的日历控件,可以轻松实现显示月份数量,当前选中多个日期,并可以按照周等你想要的格式去定制选中项. 下载地址:GitHub/Kalendae 第一步:Kale ...

  10. SqlServer统计最近一周的数据

    select * from 表名 where  DATEDIFF( day, 日期字段列名,getdate())<7 and DATEPART(w,  日期字段列名) <DATEPART( ...