【COGS495】窗口
【问题描述】
给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表:
| Window position | Min value | Max value |
| [1 3 -1] -3 5 3 6 7 | -1 | 3 |
| 1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
| 1 3 [-1 -3 5]3 6 7 | -3 | 5 |
| 1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
| 1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
| 1 3 -1 -3 5 [3 6 7 ] | 3 | 7 |
你的任务是找出窗口在各位置时的max value,min value.
【输入格式】
第一行n,k,第二行为长度为n的数组
【输出格式】
第一行每个位置的min value,第二行每个位置的max value
【分析】
好吧,其实我不想发上来的,纯粹凑数。
裸的单调队列。
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
const int maxn=;
const int INF=0x7fffffff;
using namespace std;
struct que{int shu[maxn],l,r;}Q_max,Q_min;
void solve();
void print();
int data[maxn],n,k;
int ans[][maxn]; int main()
{
//文件操作
freopen("window.in","r",stdin);
freopen("window.out","w",stdout);
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) scanf("%d",&data[i]);
solve();//滑动窗口
print();//打印
return ;
}
void solve()
{
//拉上窗口
int i;
Q_max.l=Q_min.l=Q_max.r=Q_min.r=;//初始化指针
for (i=;i<=k;i++)
{
while (Q_max.l<Q_max.r && Q_max.shu[Q_max.l]<i-k+) Q_max.l++;
while (Q_min.l<Q_min.r && Q_min.shu[Q_min.l]<i-k+) Q_min.l++;
while (Q_max.l<Q_max.r && data[Q_max.shu[Q_max.r-]]<data[i]) Q_max.r--;
while (Q_min.l<Q_min.r && data[Q_min.shu[Q_min.r-]]>data[i]) Q_min.r--;
Q_max.shu[Q_max.r++]=i;Q_min.shu[Q_min.r++]=i;
}
//注意窗口永远指向窗口最右端
for (i=k;i<=n;i++)
{
while (Q_max.l<Q_max.r && Q_max.shu[Q_max.l]<i-k+) Q_max.l++;
while (Q_min.l<Q_min.r && Q_min.shu[Q_min.l]<i-k+) Q_min.l++;
ans[][i]=Q_max.shu[Q_max.l];ans[][i]=Q_min.shu[Q_min.l];//标记打印
while (Q_max.l<Q_max.r && data[Q_max.shu[Q_max.r-]]<data[i+]) Q_max.r--;
while (Q_min.l<Q_min.r && data[Q_min.shu[Q_min.r-]]>data[i+]) Q_min.r--;
Q_max.shu[Q_max.r++]=i+;Q_min.shu[Q_min.r++]=i+;
}
}
void print()
{
for (int i=k;i<=n;i++) printf("%d ",data[ans[][i]]);
printf("\n");
for (int i=k;i<=n;i++) printf("%d ",data[ans[][i]]);
}
【COGS495】窗口的更多相关文章
- 【テンプレート】RMQ
1174 区间中最大的数 基准时间限制:1 秒 空间限制:131072 KB 收藏 关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...
- .NET Core的日志[3]:将日志写入Debug窗口
定义在NuGet包"Microsoft.Extensions.Logging.Debug"中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志 ...
- JS判断鼠标进入容器方向的方法和分析window.open新窗口被拦截的问题
1.鼠标进入容器方向的判定 判断鼠标从哪个方向进入元素容器是一个经常碰到的问题,如何来判断呢?首先想到的是:获取鼠标的位置,然后经过一大堆的if..else逻辑来确定.这样的做法比较繁琐,下面介绍两种 ...
- Windows API 设置窗口下控件Enable属性
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...
- cesium自定义气泡窗口infoWindow
一.自定义气泡窗口与cesium默认窗口效果对比: 1.cesium点击弹出气泡窗口显示的位置固定在地图的右上角,默认效果: 2.对于习惯arcgis或者openlayer气泡窗口样式的giser来说 ...
- 如何dos命令打开服务窗口?
1.输入services.msc点击<确定>进入服务窗口.如图:
- cmd窗口编码设置
问题描述:不知道误操作了什么,导致cmd窗口的鼠标显示位置出现错位,如下: 现在要将鼠标位置调整回来. 使用工具:cmd. 操作步骤: 1.查看cmd属性可以看到 可以看到是UTF-8编码格式的,我们 ...
- 从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能
前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史) ...
- 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
随机推荐
- [OpenGL]VS2010配置OpenGL开发环境
opengl概述 OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口. OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任 ...
- (转载)PHP中刷新输出缓冲
(转载)http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默 ...
- 网络流(最大密集度子图,分数规划):UvaLive 3709 Hard Life
John is a Chief Executive Officer at a privately owned medium size company. The owner of the company ...
- 数据结构(树链剖分,线段树):SDOI 2016 游戏
4515: [Sdoi2016]游戏 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 351 Solved: 157[Submit][Status][ ...
- Android安全bug ANDROID-8219321
ANDROID-8219321漏洞主要源自Android ZipFile函数漏洞:没有进行校验重名entry逻辑漏洞,逻辑漏洞细节详见Google+文章和Bluebox Security提报Andro ...
- Java---对象与类的封装
一.类和对象: package cn.hncu.Myclasslearn; /** * * @author hncu_chx * * Mylove amin */ /**类是一种数据类型,声明一个类就 ...
- CodeForces 587A
题目链接: http://codeforces.com/problemset/problem/587/A 题意: 输入n个数,在这n个数中,寻找有多少个数不能消除掉 消除方法:两个相同的数消除后,生成 ...
- xcode4的workspace里各lib工程与app工程联编之runscript简介
copy from:http://www.cnblogs.com/xiaouisme/archive/2012/02/06/2339470.html 本文讲解怎么在xcode4的workspace里配 ...
- Theme Section - HDU 4763(KMP)
题目大意:给你一个串,从这个串里面找出一个前缀后缀中间相等的串的最大长度也就是 EAEBE,每个字母都代表一个串,E出现了三次,找出最长的那个E. 分析:我们知道KMP里面保存的就是前缀和后缀的最 ...
- 《Qt编程的艺术》——8.2.1 在Designer中使用View类
不幸的是,QDirModel有一个严重的限制:因为view不响应鼠标操作,我们不得不自己建立这些功能.除此之外,每个view中,用户都一次只能选择一个元素.如果你想要允许同时选择多个项目,你也必须自己 ...