洛谷 1886 滑动窗口

【题解】

  线段树或者单调队列都可以。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define LL long long
 5 #define rg register
 6 #define N 1000010
 7 #define ls (u<<1)
 8 #define rs (u<<1|1)
 9 #define mid ((a[u].l+a[u].r)>>1) 
10 using namespace std;
11 int n,m;
12 struct tree{
13     int l,r,mx,mn;
14 }a[N<<2];
15 inline int read(){
16     int k=0,f=1; char c=getchar();
17     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
18     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
19     return k*f;
20 }
21 void build(int u,int l,int r){
22     a[u].l=l; a[u].r=r;
23     if(l<r){
24         build(ls,l,mid),build(rs,mid+1,r);
25         a[u].mx=max(a[ls].mx,a[rs].mx);
26         a[u].mn=min(a[ls].mn,a[rs].mn);
27     }
28     else a[u].mx=a[u].mn=read(); 
29 }
30 int query(int u,int l,int r,int type){
31     if(l<=a[u].l&&a[u].r<=r) return type?a[u].mx:a[u].mn;
32     if(type){
33         int ret=-1e9;
34         if(l<=mid) ret=max(ret,query(ls,l,r,type));
35         if(r>mid) ret=max(ret,query(rs,l,r,type));
36         return ret;
37     }
38     else{
39         int ret=1e9;
40         if(l<=mid) ret=min(ret,query(ls,l,r,type));
41         if(r>mid) ret=min(ret,query(rs,l,r,type));
42         return ret;
43     }
44 }
45 int main(){
46     n=read(); m=read(); build(1,1,n);
47     for(rg int i=1;i<=n-m+1;i++) printf("%d ",query(1,i,i+m-1,0));//min
48     puts("");
49     for(rg int i=1;i<=n-m+1;i++) printf("%d ",query(1,i,i+m-1,1));//max
50     return 0;
51 }
View Code
原文地址:https://www.cnblogs.com/DriverLao/p/9397590.html