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) 链接: ...
随机推荐
- MATLAB 最优化计算 (一)
1,令多行命 —— 逗号 VS 分号 2,管理工作空间 —— who , whos , clear , save , load , length (向量显示其长度,矩阵显示行数与列数中的较大数) s ...
- Java: 数据类型
核心:对事物的某种规范 前提: 1.JAVA:JAVA程序的运行是以堆栈的操作来完成的 堆栈以帧为单位保存线程的状态. JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作. 理解 ...
- 原生js中获取this与鼠标对象以及vue中默认的鼠标对象参数
1.通过原生js获取this对象 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- Python day字符串所有使用
字符串所有的操作name = "dio"names = "my\t name is {Name} and i am a {job}"print(name.cap ...
- Java开发者最经常使用19个Linux命令
1.查找文件 find / -name filename.txt 依据名称查找/文件夹下的filename.txt文件. 2.查看一个程序是否执行 ps –ef|grep tomcat 查看全部有关t ...
- 【LeetCode-面试算法经典-Java实现】【130-Surrounded Regions(围绕区域)】
[130-Surrounded Regions(围绕区域)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a 2D board containing 'X ...
- 18.C语言多线程总结
创建一个线程 _beginthread(myfun, , NULL);//返回值是一个HANDLE hd[i] = CreateThread(NULL, , add, NULL, , NULL);// ...
- 洛谷P1734 最大约数和
题目描述 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. 输入输出格式 输入格式: 输入一个正整数S. 输出格式: 输出最大的约数之和. 输入输出样例 输入样例#1: 复 ...
- Day4上午解题报告
预计分数:50 +0+0=50 实际分数:50+0+10=60 毒瘤出题人,T3不给暴力分 (*  ̄︿ ̄) T1 https://www.luogu.org/problem/show?pid=T155 ...
- Cisco安全防护读书笔记之一Cisco系统设备协议漏洞
650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" ...