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 }

 

posted @ 2015-04-24 00:47  BYYB_0506  阅读(183)  评论(0编辑  收藏  举报