滑动窗口&最大连续和&寻找段落
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 }