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 }

 

你可能感兴趣的:(window)