POJ 2823 Sliding Window (线段树区间查询)

题目大意:

解题思路:

代码:

  1 # include<iostream>
  2 # include<cstdio>
  3
  4 using namespace std;
  5
  6 # define inf 99999999
  7 # define MAX 1000010
  8
  9 struct Segtree
 10 {
 11     int left, right;
 12     int mx, mn;
 13 }tree[MAX*4];
 14
 15 int a[MAX];
 16 int maxx,minx;
 17 int n,k;
 18
 19 void build ( int id,int l,int r )
 20 {
 21     tree[id].left = l; tree[id].right = r;
 22     if ( l==r )
 23     {
 24         int t;
 25         scanf("%d",&t);
 26         tree[id].mx = tree[id].mn = t;
 27         return;
 28     }
 29     else
 30     {
 31         int mid = ( l+r )>>1;
 32         build(id<<1,l,mid);
 33         build(id<<1|1,mid+1,r);
 34         tree[id].mx = max( tree[id<<1].mx,tree[id<<1|1].mx );
 35         tree[id].mn = min( tree[id<<1].mn,tree[id<<1|1].mn );
 36     }
 37
 38 }
 39
 40
 41 void query_min ( int id,int l,int r )
 42 {
 43
 44     if ( tree[id].left==l&&tree[id].right==r )
 45     {
 46         minx = min( minx,tree[id].mn );
 47         return;
 48     }
 49     else
 50     {
 51         int mid = (tree[id].left+tree[id].right)>>1;
 52         if ( r<=mid )
 53         {
 54             query_min(id<<1,l,r);
 55         }
 56         else if ( l > mid )
 57         {
 58             query_min(id<<1|1,l,r);
 59         }
 60         else
 61         {
 62             query_min(id<<1,l,mid);
 63             query_min(id<<1|1,mid+1,r);
 64         }
 65     }
 66
 67 }
 68
 69 void query_max( int id,int l,int r )
 70 {
 71
 72     if ( tree[id].left==l&&tree[id].right==r )
 73     {
 74         maxx = max( maxx,tree[id].mx );
 75         return;
 76     }
 77     else
 78     {
 79         int mid = ( tree[id].left+tree[id].right )>>1;
 80         if ( r<=mid )
 81         {
 82             query_max( id<<1,l,r );
 83         }
 84         else if ( l > mid )
 85         {
 86             query_max( id<<1|1,l,r );
 87         }
 88         else
 89         {
 90             query_max( id<<1,l,mid );
 91             query_max( id<<1|1,mid+1,r );
 92         }
 93     }
 94
 95 }
 96
 97
 98
 99 int main(void)
100 {
101     while ( scanf("%d %d",&n,&k)!=EOF )
102     {
103         int r;
104         build(1,1,n);
105         int m = n-k;
106         for ( int l = 1;l <= m;l++ )
107         {
108             r = l+k-1;
109             minx = inf;
110             query_min(1,l,r);
111             printf("%d ",minx);
112         }
113         minx = inf;
114         query_min(1,m+1,n);
115         printf("%d\n",minx);
116
117         for ( int l = 1;l <= m;l++ )
118         {
119             r = l+k-1;
120             maxx = -inf;
121             query_max(1,l,r);
122             printf("%d ",maxx);
123         }
124         maxx = -inf;
125         query_max(1,m+1,n);
126         printf("%d\n",maxx);
127
128     }
129
130
131     return 0;
132 }
时间: 2024-10-18 17:38:33

POJ 2823 Sliding Window (线段树区间查询)的相关文章

POJ 2823 Sliding Window 线段树区间求和问题

题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 还有一种做法是单调队列,耗时更少. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 1000005 using namespace std; int

PKU 2823 Sliding Window(线段树||RMQ||单调队列)

#include<cstdio> #include<algorithm> #define maxn 1000005 #define inf 0x3f3f3f3f using namespace std; int Segtree_min[maxn<<2],Segtree_max[maxn<<2]; int n,k,value; int begin,end; //每个结点保存该区间线段的最大/小值 void Build(int l,int r,int pos)

poj 2823 Sliding Window 单调队列或线段树

题目链接:http://poj.org/problem?id=2823 Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 38315   Accepted: 11350 Case Time Limit: 5000MS Description An array of size n ≤ 106 is given to you. There is a sliding window of size k

洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)

To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 输入输出格式 输入格式: 输入一共有两行,第一行为n,k. 第二行为n个数(<INT_MAX). 输出格式: 输出共两行,第一行为每次窗口滑动的最小值

POJ 2823 Sliding Window 题解

POJ 2823 Sliding  Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the slidi

POJ 2823 Sliding Window 单调队列题解

本题是单调队列题解的入门,当然也可以使用RMQ 和 线段树,不过速度都没有单调队列那么快. 单调队列难点: 1 如何入列,保存数据 -- 最小单调队列的时候, 所有数都入列一次,在新的数据准备入列的时候,增加判断,如果当前数值小于队尾数值,那么队尾数值就出列.空队列的时候直接入列. 2 保存的数列是什么样的? 举例吧: 1 3 -1 -3 5 3 6 7 构建最小单调队列 第一个数值1的时候,空队列,那么入列,得到: 1 第二个数值3, 因为大于1:那么1不用出列,直接入列,得到: 1 3 第三

poj 2823 Sliding Window

poj 2823 Sliding Window 单调队列 单调队列是一个单调的状态(递增,或者递减) 所以需要维护这么一个状态 http://baike.baidu.com/link?url=ZcGM7Hzo8zVQUU6Oqqq18SlCMJ92ts3I1aXwQGDZw_NiDDlzIIV9GKlfs3X1fcHVppZHOU31geHZG4cOcRZOAK 固定 k 区间的单调 队列,求 最小值,如果 两个元素 A B ,如果 A 的 下标 比 B 小,但是 A 的 值 比 B 大,那么在

[ACM] poj 2823 Sliding Window(单调队列)

Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 36212   Accepted: 10723 Case Time Limit: 5000MS Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left

[ACM] poj 2823 Sliding Window (单调队列)

高一时,学校组织去韶山游玩,我没去,这次趁着五一,总算去了我心心念念的韶山.其实我知道所有的景点都是差不多的,可是因为电视剧<恰同学少年>,让我对毛泽东有了进一层的了解,所以,我一直都想去看看. 有两个同学一男一女是我理想的旅友,可是女生不想去,而男士回家了.所以,我独自一人去了. 准备工作:一小包饼干,一小包山楂片,两个苹果,一瓶水,帽子(防晒),墨镜(装酷) 早晨5:30起床了,洗漱完毕,吃完早餐,赶到公交车站牌那里,才6点过几分.公交车6:31才到,等了近半个小时(公交车上明明说是6:0