poj2823:http://poj.org/problem?id=2823
题意:给出一个序列,要求得到所有长度为k的连续子序列的最大和最小值。
题解:直接上线段树
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }