POJ 2823 Sliding Window 线段树
http://poj.org/problem?id=2823
出太阳啦~^ ^被子拿去晒了~晚上还要数学建模,刚才躺在床上休息一下就睡着了,哼,还好我强大,没有感冒。
话说今年校运会怎么没下雨!!!说好的福大校运会下雨呢?
-----------------------------------------分割线“嘻嘻又和大家见面了”----------------------------------------
大意:
给定一串长度为n的序列,每k个数查询一次,要求输出这k个数中的最小和最大值。
题目其实很清楚了:
The array is [1 3 -1 -3 5 3 6 7],
and k is 3.
| Window position | Minimum value | Maximum 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 |
一看就知道是线段树。。。然后一想st算法也可以,不过貌似会MLE,我想偷懒的呀!!!那就只好敲了线段树。。交上去RE,好吧数组太小,改了再交就AC了。
不过时间好久(9032MS)。。搜下别人的方法,还有那啥单调队列(可以说没听过嘛),还有用优先队列的,Orz。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxnode=1000000+10;
const int MAXN=2000000+10;
const int INF=99999999;
int A[maxnode];
int ans_max[maxnode];
int ans_min[maxnode];
int qL,qR;
struct IntervalTree
{
int minv[MAXN*2];
int maxv[MAXN*2];
void build(int o, int L, int R) {
int M = L + (R-L)/2;
if(L == R)
{
minv[o] =A[L];
maxv[o]=A[L];
}
else {
build(o*2, L, M);
build(o*2+1, M+1,R);
minv[o] =min(minv[o*2], minv[o*2+1]);
maxv[o]=max(maxv[o*2], maxv[o*2+1]);
}
} int query_min(int o, int L,int R) {
int M = L + (R-L)/2,ans = INF;
if(qL <= L&& R <= qR) return minv[o]; // 当前结点完全包含在查询区间内
if(qL <= M) ans =min(ans, query_min(o*2, L, M)); // 往左走
if(M < qR) ans =min(ans, query_min(o*2+1, M+1, R)); // 往右走
return ans;
} int query_max(int o, int L,int R) {
int M = L + (R-L)/2,ans = -INF;
if(qL <= L&& R <= qR) return maxv[o]; // 当前结点完全包含在查询区间内
if(qL <= M) ans =max(ans, query_max(o*2, L, M)); // 往左走
if(M < qR) ans =max(ans, query_max(o*2+1, M+1, R)); // 往右走
return ans;
}
}t; int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&A[i]); t.build(1,1,n); int len=0;
for(int i=1;i+k-1 <=n;i++)
{
qL=i;qR=i+k-1;
ans_max[len]=t.query_max(1,1,n);
ans_min[len++]=t.query_min(1,1,n);
} for(int i=0;i<len;i++)
printf("%d ",ans_min[i]);
printf("\n");
for(int i=0;i<len;i++)
printf("%d ",ans_max[i]);
printf("\n");
}
POJ 2823 Sliding Window 线段树的更多相关文章
- POJ 2823 Sliding Window 线段树区间求和问题
题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...
- PKU 2823 Sliding Window(线段树||RMQ||单调队列)
题目大意:原题链接(定长区间求最值) 给定长为n的数组,求出每k个数之间的最小/大值. 解法一:线段树 segtree节点存储区间的最小/大值 Query_min(int p,int l,int r, ...
- POJ 2823 Sliding Window 题解
POJ 2823 Sliding Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
- POJ 2823 Sliding Window + 单调队列
一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1) 从队首删除 (2) 从队尾删除 (3) 从队尾插入 (4) ...
- POJ 2823 Sliding Window (线段树/单调队列)
题目不说了,可以用线段树或者单调队列,下面附上代码. 线段树: #include <iostream> #include <stdio.h> #include <algo ...
- POJ 2823 Sliding Window(单调队列 || 线段树)题解
题意:求每个长度为k的数组的最大值和最小值 思路: 1.用线段树创建维护最大值和最小值,遍历询问,简单复习了一下...有点手生 2.单调队列: 可以看一下详解 单调队列顾名思义就是一个单调递增或者递减 ...
- POJ 2823 Sliding Window ST RMQ
Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is m ...
- poj 2823 Sliding Window (单调队列入门)
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...
随机推荐
- linux环境下禅道搭建
1.下载禅道安装包,根据操作系统的版本: 2.上传包到linux的opt目录中: 3.解压包: cd /opt tar xzvf 禅道包名称,如:tar xzvf ZenTaoPMS.8.1.3.zb ...
- OpenCV —— 轮廓
把检测出的边缘像素组装成轮廓 —— cvFindContours OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储 ...
- 搭建 Docker 环境
- centos6.5下 python3.6安装、python3.6虚拟环境
https://www.cnblogs.com/paladinzxl/p/6919049.html # python3.6的安装 wget https://www.python.org/ftp/pyt ...
- 使用PLupload在同一页面中进行多个不同类型上传解决方案和一次多文件上传的注意事项
首先感谢,http://www.cnblogs.com/2050/p/3913184.html 这篇文章作者. 在使用PLUpload之前个人先封装了一些常用配置,并且将success与error做为 ...
- 【Educational Codeforces Round 36 C】 Permute Digits
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] //从大到小枚举第i(1..len1)位 //剩余的数字从小到大排序. //看看组成的数字是不是小于等于b //如果是的话. //说 ...
- 从头认识java-15.7 Map(4)-介绍HashMap的工作原理-hash碰撞(常常作为面试题)
这一章节我们来讨论一下hash碰撞. 1.什么是hash碰撞? 就是两个对象的key的hashcode是一样的,这个时候怎么get他的value呢? 答案是通过equals遍历table那个位置上面的 ...
- 4.使用fastjson进行json字符串和List的转换
转自:https://blog.csdn.net/lipr86/article/details/80833952 使用fastjson进行自定义类的列表和字符串转换 1.环境 jdk1.8,fastj ...
- 暴力破解FTP服务器技术探讨与防范措施
暴力破解FTP服务器技术探讨与防范措施 随着Internet的发展出现了由于大量傻瓜化黑客工具任何一种黑客攻击手段的门槛都降低了很多但是暴力破解法的工具制作都已经非常容易大家通常会认为暴力破解攻击只是 ...
- Talk the Talk
 Talk the Talk Mark Richards in Any pRoFESSion, jargon is used so that individuals within that pro- ...