滑动窗口&最大连续和&寻找段落

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int maxn=1e6+7;
 5 int a[maxn],q[maxn],n,k;
 6 void getmin(){
 7     int head=1,tail=0;
 8     for(int i=1;i<=n;i++){
 9         while(head<=tail&&i-q[head]>=k) head++;
10         while(head<=tail&&a[i]<=a[q[tail]]) tail--;
11         q[++tail]=i;
12         if(i>=k) cout<<a[q[head]]<<" ";
13     }
14 }
15 void getmax(){
16     int head=1,tail=0;
17     for(int i=1;i<=n;i++){
18         while(head<=tail&&i-q[head]>=k) head++;
19         while(head<=tail&&a[i]>=a[q[tail]]) tail--;
20         q[++tail]=i;
21         if(i>=k) cout<<a[q[head]]<<" ";
22     }
23 }
24 int main(){
25     cin>>n>>k;
26     for(int i=1;i<=n;i++) cin>>a[i];
27     getmin();cout<<endl;
28     getmax();
29     return 0;
30 }

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int maxn=2e5+7;
 5 int n,m,ans=-2147483647,a[maxn],h=1,t=1,q[maxn],num[maxn];
 6 int main(){
 7     cin>>n>>m;
 8     for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];} 
 9     for(int i=1;i<=n;i++){
10         while(num[h]+m<i&&h<=t) h++;
11         ans=max(ans,a[i]-q[h]);
12         while(q[t]>=a[i]&&h<=t) t--;
13         q[++t]=a[i];
14         num[t]=i;
15     }
16     cout<<ans<<endl;
17     return 0;
18 } 

关于这个的写法......

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define debug(x) cout<<#x<<" = "<<x<<endl;
 5 const int maxn=1e5+7;
 6 int n,s,t,head,tail;
 7 double l,r,mid;
 8 int q[maxn];
 9 double a[maxn],b[maxn],sum[maxn],num[maxn];
10 bool flag;
11 int main(){
12     cin>>n>>s>>t;
13     for(int i=1;i<=n;i++) cin>>a[i];
14     l=-maxn;r=maxn;
15     while(r-l>=1e-5){
16         mid=(l+r)/2;
17         for(int i=1;i<=n;i++) b[i]=a[i]-mid;
18         for(int i=1;i<=n;i++) sum[i]=sum[i-1]+b[i];
19         q[1]=0;head=1;tail=0;flag=false;
20         for(int i=1;i<=n;i++){
21             if(i>s){
22                 while(head<=tail&&sum[i-s]<sum[q[tail]]) tail--;
23                 q[++tail]=i-s;//这有这之前的是合法的,后面暂时不合法
24                 while(head<=tail&&i-t>q[head]) head++;
25                 if(head<=tail&&sum[q[head]]<=sum[i]) {flag=true;break;}
26             }
27         }
28         if(flag==true) l=mid;
29         if(flag==false) r=mid;
30     } 
31     printf("%.3lf",mid);
32     return 0;
33 } 

 

posted @ 2018-09-03 09:58  lcan  阅读(348)  评论(0编辑  收藏  举报