Sliding Window

poj2823:http://poj.org/problem?id=2823

题意:给出一个序列,要求得到所有长度为k的连续子序列的最大和最小值。
题解:直接上线段树

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1000002;
 7 int n,k,s;
 8 struct  Node{
 9     int left;
10     int right;
11     int minn;
12     int maxn;
13 }node[4*maxn];
14 void build(int l,int r,int idx){
15     node[idx].left=l;
16     node[idx].right=r;
17     if(l==r){
18         scanf("%d",&s);
19         node[idx].minn=s;
20         node[idx].maxn=s;
21         return;
22     }
23     int mid=(l+r)/2;
24     build(l,mid,idx*2);
25     build(mid+1,r,idx*2+1);
26     node[idx].maxn=max(node[idx*2].maxn,node[idx*2+1].maxn);
27     node[idx].minn=min(node[idx*2].minn,node[idx*2+1].minn);
28 }
29 int queryminn(int s,int t,int idx){
30     if(node[idx].left==s&&node[idx].right==t){
31         return node[idx].minn;
32     }
33     int mid=(node[idx].left+node[idx].right)/2;
34     if(mid>=t)return queryminn(s,t,idx*2);//范围只能这么写,否则会出错 
35     else if(mid<s)return queryminn(s,t,idx*2+1);
36     else 
37       return min(queryminn(s,mid,idx*2),queryminn(mid+1,t,idx*2+1));
38 }
39 int querymaxnn(int s,int t,int idx){
40     if(node[idx].left==s&&node[idx].right==t){
41         return node[idx].maxn;
42     }
43     int mid=(node[idx].left+node[idx].right)/2;
44     if(mid>=t)return querymaxnn(s,t,idx*2);
45     else if(mid<s)return querymaxnn(s,t,idx*2+1);
46     else 
47       return max(querymaxnn(s,mid,idx*2),querymaxnn(mid+1,t,idx*2+1));
48 }
49 int main(){
50     while(~scanf("%d%d",&n,&k)){
51         build(1,n,1);
52         for(int i=1;i+k<=n+1;i++){
53             printf("%d ",queryminn(i,k+i-1,1));
54         }
55         printf("
");
56         for(int i=1;i+k<=n+1;i++){
57             printf("%d ",querymaxnn(i,k+i-1,1));
58         }
59         printf("
");
60     }
61 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3402107.html