NEUOJ 1117: Ready to declare(单调队列)
1117: Ready to declare
时间限制: 1 Sec 内存限制: 128 MB pid=1117" style="color:rgb(26,92,200); text-decoration:none">讨论版
提交: 358 解决: 41
[提交][状态][
题目描写叙述
first K boys in the list at first, then the first boy leave ,the k+1-th boy join. So she will meet boys N-K+1 times.
输入
输出
Each case output two lines.The first line is each meet's min handsome value, the second line is each meet's max handsome value.
例子输入
8 3
5 3 2 1 1 10 2 3
例子输出
2 1 1 1 1 2
5 3 2 10 10 10
提示
来源
尽管正解是单调队列。但是我用的是两个栈实现的队列水过的。存下代码
/*************************************************************************
> File Name: Euler.cpp
> Author: acvcla
> QQ:
> Mail: acvcla@gmail.com
> Created Time: 2014年10月30日 星期四 11时19分11秒
************************************************************************/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1e5+5;
int stack1[maxn],stack2[maxn],max2[maxn],max1,min2[maxn],min1;
int top1,top2;
void init(){
top1=top2=0;
max1=max2[top2]=0;
min1=min2[top2]=maxn;
}
int ans1[maxn],ans2[maxn];
void deque(){ if(top2>0){
stack2[--top2];
return ;
}
while(top1>0){
stack2[top2]=stack1[--top1];
max2[top2]=max(top2>0?max2[top2-1]:0,stack2[top2]);
min2[top2]=min(top2>0?min2[top2-1]:maxn,stack2[top2]);
top2++;
}
max1=0;
min1=maxn;
--top2;
}
int get_max_min(int x){
if(x)return max(max1,top2>0?max2[top2-1]:0);
return min(min1,top2>0?min2[top2-1]:maxn);
}
void push(int x){
max1=max(x,max1);
min1=min(x,min1);
stack1[top1++]=x;
}
int main()
{
int n,k,x;
while(~scanf("%d%d",&n,&k)){
init();
int t=0,cnt=0;
for(int i=1;i<=n;i++){
scanf("%d",&x);
push(x);
++cnt;
if(cnt==k)
{
ans1[t]=get_max_min(0);
//cout<<"sldl"<<endl;
ans2[t++]=get_max_min(1);
deque();
cnt--;
}
}
for(int i=0;i<t;i++)printf("%d%c",ans1[i],i==t-1?'\n':' ');
for(int i=0;i<t;i++)printf("%d%c",ans2[i],i==t-1?'\n':' ');
}
return 0;
}
补上单调队列版
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn =1e5 + 10;
struct Queue
{
int value;
int index;
};
Queue min_que[maxn],max_que[maxn];
int n,k,num[maxn],front,rear;
int delete_rear_inc(int f,int r,int d)
{
int mid;
while(f<=r){
mid=(f+r)/2;
if(min_que[mid].value==d) return mid;
if(min_que[mid].value>d) r=mid-1;
else f=mid+1;
}
return f;
}
int delete_rear_dec(int f,int r,int d)
{
int mid;
while(f<=r){
mid=(f+r)/2;
if(max_que[mid].value==d) return mid;
if(max_que[mid].value>d) f=mid+1;
else r=mid-1;
}
return f;
}
int main()
{ while(~scanf("%d%d",&n,&k)){ for(int i=1;i<=n;i++)scanf("%d",&num[i]); min_que[1].value=num[1];
front=rear=min_que[1].index=1; for(int i=2;i<=k;i++) {
rear=delete_rear_inc(front,rear,num[i]);
min_que[rear].value=num[i];
min_que[rear].index=i;
} printf("%d",min_que[1].value);
for(int i=k+1;i<=n;i++) {
rear=delete_rear_inc(front,rear,num[i]);
min_que[rear].value=num[i];
min_que[rear].index=i;
if(i-min_que[front].index>=k) front++;
printf(" %d",min_que[front].value);
if(i==n)puts("");
} max_que[1].value=num[1];
front=rear=max_que[1].index=1; for(int i=2;i<=k;i++) {
rear=delete_rear_dec(front,rear,num[i]);
max_que[rear].value=num[i];
max_que[rear].index=i;
} printf("%d",max_que[1].value);
for(int i=k+1;i<=n;i++) {
rear=delete_rear_dec(front,rear,num[i]);
max_que[rear].value=num[i];
max_que[rear].index=i;
if(i-max_que[front].index>=k) front++;
printf(" %d",max_que[front].value);
if(i==n)puts("");
}
}
return 0;
}
NEUOJ 1117: Ready to declare(单调队列)的更多相关文章
- 洛谷P3975 跳房子 [DP,单调队列优化,二分答案]
题目传送门 跳房子 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一 ...
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- BZOJ 1047 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...
- 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列
第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 【转】单调队列优化DP
转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...
随机推荐
- vc2005编译ffmpeg以及ffplay
ffmpeg编译过程:1 http://ffmpeg.zeranoe.com/builds/下载官方提供的源码,win32库和dll.2 新建vc2005 console空工程,把ffmpeg.h,f ...
- 【转】超全!整理常用的iOS第三方资源 -- 不错
原文网址:http://www.cocoachina.com/ios/20160121/14988.html 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ ...
- 利用Modbus协议读取电能表的数据
1.电脑要有485转232的转换器2.你要看懂DLT_645—1997规约的通讯协议,现在大多电能表厂都会遵行这个通讯协议,DLT_645—1997规约不是最新的通讯协议.就看电表的使用什么通讯协议. ...
- Android-根据ImageView的大小来压缩Bitmap,避免OOM
本文转自:http://www.cnblogs.com/tianzhijiexian/p/4254110.html Bitmap是引起OOM的罪魁祸首之一,当我们从网络上下载图片的时候无法知道网络图片 ...
- mysql explain中key_len的计算
ken_len表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断是否所有的索引字段都被查询用到. key_len显示了条件检索子句需要的索引长度,但 ORDER B ...
- C# 一次查询多表,填充DataSet并指定表名
lhrhi 原文 NET 一次查询多表,填充DataSet并指定表名(DataSet指定DataTable名称的技巧) 现实中的场景,有时可能需要一次查询数据库中表张.在使用SqlDataAdapte ...
- memcache分布式部署的原理分析
下面本文章来给各位同学介绍memcache分布式部署的原理分析,希望此文章对你理解memcache分布式部署会有所帮助哦. 今天在封装memcache操作类库过程中,意识到一直以来对memcach ...
- 为redis分配一个新的端口
为redis分配一个8888端口,操作步骤如下:1.$REDIS_HOME/redis.conf重新复制一份,重命名为redis8888.conf.2.打开redis8888.conf配置文件,找到p ...
- 多校5 HDU5787 K-wolf Number 数位DP
// 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...
- <Chapter 2>2-2-1.用户偏好模式(The User Preferences Pattern)
在这个模块中我们要创建的应用是一个简单的钟.当一个用户访问这个网站时,这个应用会更具服务器的系统时间显示当前的时间.默认情况下,这个应用使用标准国际时间(UTC)时区显示当前时间.用户可以使用Goog ...