[Luogu1886]滑动窗口
然而这是单调队列的题。。为何要用线段树乱搞233333
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <cmath> 10 #include <queue> 11 #include <cstdio> 12 using namespace std; 13 14 const int N=1000100; 15 16 int n,k,a[N<<2],l,r,M=1; 17 int main(){ 18 scanf("%d%d",&n,&k); 19 while(M<n)M<<=1; 20 memset(a,0x3f,sizeof a); 21 for(int i=M+1;i<=M+n;i++)scanf("%d",&a[i]); 22 for(int i=M-1;i;i--)a[i]=min(a[i<<1],a[i<<1|1]); 23 for(int i=1;i+k-1<=n;i++){ 24 l=i,r=i+k-1; 25 int ans=0x3f3f3f3f; 26 for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){ 27 if(~l&1)ans=min(ans,a[l^1]); 28 if(r&1)ans=min(ans,a[r^1]); 29 } 30 printf("%d ",ans); 31 } 32 puts(""); 33 a[M]=0xcfcfcfcf; 34 for(int i=M-1;i;i--)a[i]=max(a[i<<1],a[i<<1|1]); 35 for(int i=1;i+k-1<=n;i++){ 36 l=i,r=i+k-1; 37 int ans=0xcfcfcfcf; 38 for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){ 39 if(~l&1)ans=max(ans,a[l^1]); 40 if(r&1)ans=max(ans,a[r^1]); 41 } 42 printf("%d ",ans); 43 } 44 }