4373 窗口

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 黄金 Gold

题目描述 Description

给你一个长度为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.

输入描述 Input Description

第1行n,k,第2行为长度为n的数组

输出描述 Output Description

2行

第1行每个位置的min value

第2行每个位置的max value

样例输入 Sample Input

8 3

1 3 -1 -3 5 3 6 7

样例输出 Sample Output

-1 -3 -3 -3 3 3

3 3 5 5 6 7

数据范围及提示 Data Size & Hint

数据范围:20%: n<=500; 50%: n<=100000;100%: n<=1000000;

/*
线段树区间查询.
o(nlogn+nlogn).
1726ms.
还好能卡过去orz.
*/
#include<iostream>
#include<cstdio>
#define MAXN 1000001
using namespace std;
struct data{int l,r,lc,rc,min,max;}tree[MAXN*4];
int n,m,cut,ans;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void build(int l,int r)
{
int k=++cut;tree[k].l=l,tree[k].r=r;
if(l==r){
tree[k].min=tree[k].max=read();return ;
}
int mid=(l+r)>>1;
tree[k].lc=cut+1;
build(l,mid);
tree[k].rc=cut+1;
build(mid+1,r);
tree[k].min=min(tree[tree[k].lc].min,tree[tree[k].rc].min);
tree[k].max=max(tree[tree[k].lc].max,tree[tree[k].rc].max);
}
int querymin(int k,int l,int r)
{
if(l<=tree[k].l&&tree[k].r<=r) return tree[k].min;
int tot=1e9,mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) tot=min(tot,querymin(tree[k].lc,l,r));
if(r>mid) tot=min(tot,querymin(tree[k].rc,l,r));
return tot;
}
int querymax(int k,int l,int r)
{
if(l<=tree[k].l&&tree[k].r<=r) return tree[k].max;
int tot=-1e9,mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) tot=max(tot,querymax(tree[k].lc,l,r));
if(r>mid) tot=max(tot,querymax(tree[k].rc,l,r));
return tot;
}
int main()
{
n=read();m=read();
build(1,n);
for(int i=1;i<=n-m+1;i++)
printf("%d ",querymin(1,i,i+m-1));
printf("\n");
for(int i=1;i<=n-m+1;i++)
printf("%d ",querymax(1,i,i+m-1));
return 0;
}
/*
st表写法.
复杂度O(nlogn+n).
2608ms.
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#define MAXN 1000001
#define D 21
using namespace std;
int n,k,a[MAXN],f[MAXN][D+5],s[MAXN][D+5],mi[D+5];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void slove()
{
int k=log(n)/log(2)+1;
for(int j=1;j<=k;j++)
for(int i=1;i<=n-mi[j-1];i++)
f[i][j]=max(f[i][j-1],f[i+mi[j-1]][j-1]),
s[i][j]=min(s[i][j-1],s[i+mi[j-1]][j-1]);
return ;
}
int querymax(int l,int r)
{
int k=log(r-l+1)/log(2);
return max(f[l][k],f[r-mi[k]+1][k]);
}
int querymin(int l,int r)
{
int k=log(r-l+1)/log(2);
return min(s[l][k],s[r-mi[k]+1][k]);
}
int main()
{
freopen("window.in","r",stdin);
freopen("window.out","w",stdout);
int x,y;
n=read();k=read();mi[0]=1;
for(int i=1;i<=D;i++) mi[i]=mi[i-1]<<1;
for(int i=1;i<=n;i++) a[i]=read(),f[i][0]=s[i][0]=a[i];
slove();
for(int i=1;i<=n-k+1;i++) printf("%d ",querymin(i,i+k-1));
printf("\n");
for(int i=1;i<=n-k+1;i++) printf("%d ",querymax(i,i+k-1));
return 0;
}
/*
单调队列维护[i,i-m+1]的min和max.
632ms.
论常数的重要性.
一开始傻逼的讲将1到m元素都入队.
然后不一定单调啊啊啊啊.
唉~.
*/
#include<iostream>
#include<cstdio>
#define MAXN 1000001
using namespace std;
int s[MAXN],n,m,q[MAXN],head=1,tail=1;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) s[i]=read();
q[1]=1;
for(int i=2;i<=n;i++)
{
while(head<=tail&&s[q[tail]]>s[i]) tail--;
q[++tail]=i;
while(head<=tail&&q[head]<i-m+1) head++;
if(i>=m) printf("%d ",s[q[head]]);
}
printf("\n");
head=tail=1;
for(int i=2;i<=n;i++)
{
while(head<=tail&&s[q[tail]]<s[i]) tail--;
q[++tail]=i;
while(head<=tail&&q[head]<i-m+1) head++;
if(i>=m) printf("%d ",s[q[head]]);
}
return 0;
}

Codevs 4373 窗口(线段树 单调队列 st表)的更多相关文章

  1. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  2. BZOJ 1012 线段树||单调队列

    非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...

  3. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  4. POJ 2823 Sliding Window (线段树/单调队列)

    题目不说了,可以用线段树或者单调队列,下面附上代码. 线段树: #include <iostream> #include <stdio.h> #include <algo ...

  5. bzoj 1171 大sz的游戏& 2892 强袭作战 (线段树+单调队列+永久性flag)

    大sz的游戏 Time Limit: 50 Sec  Memory Limit: 357 MBSubmit: 536  Solved: 143[Submit][Status][Discuss] Des ...

  6. 【BZOJ1171】大sz的游戏(线段树+单调队列)

    点此看题面 大致题意: 有\(n\)个点,两点间最大通讯距离为\(L\).已知除\(1\)号点外第\(i\)个点能够发出和接收的信号区间\([l_i,r_i]\)以及到\(1\)号点的距离\(dis_ ...

  7. HDU 4123 Bob's Race:树的直径 + 单调队列 + st表

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...

  8. loj #6302. 「CodePlus 2018 3 月赛」寻找车位【线段树+单调队列】

    考虑静态怎么做:枚举右边界,然后枚举上边界,对应的下边界一定单调不降,单调栈维护每一列从当前枚举的右边界向左最长空位的长度,这样是O(nm)的 注意到n>=m,所以m<=2000,可以枚举 ...

  9. 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集

    LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...

随机推荐

  1. 【xlwings】 wps 和 office 的excel creat_sheet区别

    最近在学习 xlwings,参考学习的网址:https://www.jianshu.com/p/b534e0d465f7 写得很棒,学到了很多. 在新建sheet表单, 发现一个问题. import ...

  2. Redis客户端相关

    1.redis是什么 redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库.redis的官网地址,非常好记,是redis.io.目前,Vmware在 ...

  3. 在react项目当中做导航守卫

    距离上一篇文章,似乎已经过去好久了. 确实是最近相对忙了一点,本身是用vue重构之前一个传统的项目,就自己一个人写.而且,在稍微闲暇之余,想着同时用react也重构一遍,也算是对react的学习吧!毕 ...

  4. ajax-springMVC提交表单的方式

    1.request参数提交(Form提交),适用于GET/POST request参数传递都会转换成 id=123&fileName=test.name&type=culture_ar ...

  5. SQL With AS Expression

    A. Creating a simple common table expression The following example shows the total number of sales o ...

  6. python之字符串类型及其操作

    1.1字符串类型的表示 字符串是字符的序列表示,可以由一对单引号('). 双引号(")或三引号(’")构成.其中,单引号和双引号都可以表示单行字符串,两者作用相同.使用单引号时,双 ...

  7. 分库分布的几件小事(四)分库分表的id主键生成

    1.问题 其实这是分库分表之后你必然要面对的一个问题,就是id咋生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局唯一的id来支持.所以这都是你实际生产环境中必须考虑的问 ...

  8. Java ArrayList常用接口介绍及示例

    Java List 常用类型 类型 特征 ArrayList 随机访问元素快:中间插入与删除元素较慢:操作不是线程安全的 LinkedList 中间插入与删除操作代价较低,提供优化的顺序访问:随机访问 ...

  9. MySQL数据库笔记一:简介及简单操作

    一.初识MySQL数据库 1.数据库的概述 <1>数据库:Database 长期存储在计算机内的,有组织的,可共享的数据集合. 存储数据的仓库.(文件) <2>数据库管理系统: ...

  10. mysql精准模糊查询使用CONCAT加占位符(下划线“_”)的使用,直接限定了长度和格式

    比如现在有张表t_user,如下:(表中只是引用某某某的话,并无恶意) id name 1 司马懿 2 司马老贼 3 司马老贼OR司马懿 4 司马大叔 1.模糊查询一般用的模糊查询都是like关键词, ...