POJ 2823【单调队列】
题意:
给出序列,找出每个连续长度为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【单调队列】的更多相关文章
- Sliding Window POJ - 2823 单调队列模板题
Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间 ...
- caioj 1172 poj 2823 单调队列过渡题
给定一个n个数的数列,从左至右输出每个长度为m的数列段内的最大数. 输入:第一行两个整数n和m( 1<= n <= 20 0000,m<=n).下来给出n个整数. 输出:一行一个整数 ...
- poj 2823 单调队列
思路:裸的单调队列. #include<iostream> #include<cstring> #include<cstdio> #include<algor ...
- POJ 2823 单调队列入门水题
最最基础的单调队列题目.一个单增一个单减.还是可以借此好好理解一下单调队列的. #include <stdio.h> #include <string.h> #include ...
- poj 2823单调队列模板题
#include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃 #define N 1100000 int getmin[N],getmax[N],num[N],n,k, ...
- POJ 2838 单调队列
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 55309 Accepted: 15911 ...
- poj 3017 单调队列优化动态规划
思路:dp[i]=min{dp[j]+max(num[j+1]...num[i])},其中sum[i]-sum[j]<=m. 那么我们需要用单调队列维护j到i的最大值. #include< ...
- poj 2373 单调队列优化背包
思路:我们用单调队列保存2*b<=i-j<=2*a中的最大值.那么队列头就是最大值,如果队头的标号小于i-2*b的话,就出队,后面的肯定用不到它了. #include<iostrea ...
- POJ 3017 单调队列dp
Cut the Sequence Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8764 Accepted: 2576 ...
- POJ 1821 单调队列+dp
题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...
随机推荐
- Microsoft Dynamics CRM2011 必备知识点
一.CRM基本知识 1.CRM2001 有几个服务端点? 答:对外公开的服务,如Web服务,WCF,Restful API 2.一个ERP系统,要访问CRM的数据,CRM2011有哪些现有的服务入口提 ...
- linux shell 整理收集(不断更新)
1)主从复制延时判断 (转 http://www.cnblogs.com/gomysql/p/3862018.html) 说明: 不要通过Seconds_Behind_Master去判断,该值表示sl ...
- mysql row number的实现
CREATE TABLE `test_id` (`id` int(11) NOT NULL DEFAULT 0 ,`name` varchar(255) CHARACTER SET utf8 COLL ...
- WINRARA 排除 .svn 文件夹
加入-x*\.svn -x*\.svn\* 即可: rar.exe u -m3 -s -r -o+ -x*.db -x*.zip -x*.rar -x*\.svn -x*\.svn\* zmv9net ...
- SPOJ #11 Factorial
Counting trailing 0s of n! It is not very hard to figure out how to count it - simply count how many ...
- jQuery实现表单验证
表单是网页的一个重要组成部分.本节做一个简单的表单提交网页然后利用jQuery实现表单的验证.后续的表单完善以及功能的完善会在以后的博客中给出. 效果图: 代码: <!DOCTYPE html ...
- IIS SMTP Queue stuck
1. review smtp logs in C:\Windows\System32\LogFiles\SMTPSVC1, 2. find 421 error 2014-12-08 02:02:40 ...
- C基础--函数指针的使用
之前在看代码的时候,看了函数指针的使用,大体分为如下几类: 做一个function list,通过指针索引调用,使得处理功能类似的函数看起来更加清晰: 函数指针作为另一个函数的参数,用作回调: lin ...
- 删除SQL server 实例
在网上找到下面几种方法,本人使用的是第一种,很实用. 1.删除 SQL Server 的特定实例若要删除 SQL Server 的某个特定实例,请按照以下步骤操作: 找到并删除%drive%:\\Pr ...
- 一. JVM发展史,运行时数据区域,四大引用
一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...