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 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...
随机推荐
- db2数据库sql报错信息
sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 ...
- RubyWin32Api Win32OLE
#ruby提供了多种运行外部程序的方法 #1.%x %x不需要使用引号包含. #2. system方法 #3.exec类似system但是会中断当前的代码执行 #system和exec不能捕获执行程序 ...
- table中嵌套table,如何用jquery来控制奇偶行颜色
总是要趁着自己还有记忆的时候,把该记录下来的都记录下来,着实是不敢恭维自己的记性. 相信很多时候,我们前端人员,经常会用到table里面的某个td中还嵌套着table,而这个时候还总要去弄奇偶行的颜色 ...
- 【转】Android fill_parent和wrap_content分析
fill_parent设置一个顶部布局或控件强制性让它布满整个屏幕. wrap_content布局指根据视图内部内容自动扩展以适应其大小. 1. wrap_content <?xml versi ...
- Hadoop中的InputFormat解析
1.InputFormat InputFormat是Hadoop平台上Mapreduce输入的规范,仅有两个抽象方法. List<InputSplit> getSplits(), 获取由输 ...
- sqlserver 中 lastindexof 功能
create table tb(imgPath varchar(50)) insert into tb select 'd1/d2/f1'--d1/d2/dd/f1 select left(i ...
- Vim小知识
在退出vim编辑的时候,强制退出是q! 感叹号在前,即!q,表示执行外部shell命令,感叹号在后,即q!,表示强制执行vi命令.
- c++ 概念及学习/c++ concept&learning(三)
这一篇继续说说程序设计中的基本语句:控制块 一 if类控制语句 if if else if , else if ,else if(条件语句){如果条件为真,要做的一些事情} if(条件语句) {如 ...
- JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)
Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection:第二种是以Hashtable为代表的键值对. ... 线性表,基类是Collection: 数组类: person ...
- Ubuntu_wifi&pppoe
学校现在上网全部要拨号,加上我在宿舍用的是无线路由,也就是要在ubuntu下实现连接wifi后再拨号,这个功能在默认的ubuntu网络设置里面是没有的,里面有dsl但是对有线网络使用的,有点小郁闷.不 ...