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) 链接: ...
随机推荐
- Sql Server 基础语法
来自:http://www.cnblogs.com/AaronYang/archive/2012/04/24/2468093.html Sql Server 基础语法 -- 查看数据表 select ...
- java(数组及常用简单算法 )
数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[] 变量名 = new 数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...
- Interrupt distribution scheme for a computer bus
A method of handling processor to processor interrupt requests in a multiprocessing computer bus env ...
- 【直接拿来用のandroid公共代码模块解析与分享】の Notification和NotificationManager
本文源代码托管在https://github.com/ASCE1885/asce-common,欢迎fork Android项目做得多了.会发现原来非常多基础的东西都是能够复用,这个系列介绍一些自己项 ...
- HBase-scan API 通过scan读取表中数据
直接贴代码啦 /** * * @param zkIp * @param zkPort * @param tablename * @param startRow 传null扫全表 * @param st ...
- ThreadLocal使用演示样例
MainActivity例如以下: package cc.cv; import android.os.Bundle; import android.app.Activity; /** * Demo描写 ...
- regular-第一课(正则表达式基础)
之前一直听说正则表达式,尤其是在学习java的时候,遇到了不少关于正则表达式的用法.例如一个输入框,你可以使用正则表达式限制输入的内容.当然,在android以后,正则表达式就几乎没有怎么用了.不过呢 ...
- BZOJ2780: [Spoj]8093 Sevenk Love Oimaster(广义后缀自动机,Parent树,Dfs序)
Description Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXu ...
- Direct2D 图形计算
D2D不仅可以绘制,还可以对多个几何图形对象进行空间运算.这功能应该在GIS界比较吃香. 这些计算包括: 合并几何对象,可以设置求交还是求并,CombineWithGeometry 边界,加宽边界,查 ...
- 【Spring】Service 注入失败,空指针
service层的类都有用@Service标识,但报空指针,注入失败,很可能是因为spring的application配置和springmvc的配置文件配置错误,导致容器冲突了. spring和spr ...