求最大不超过k的连续子序列的和 单调队列
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int num[201000],id[201000],sum[201000]; int main() { int n,m,i,j,T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); sum[0]=0; for(i=1;i<=n;i++) { scanf("%d",&num[i]); sum[i]=sum[i-1]+num[i]; } for(i=n+1;i<=n+m;i++) sum[i]=sum[i-1]+num[i-n]; int Max=-999999999; int front=0,top=0,star,end; for(i=1;i<=n+m;i++) { while(front<top&&sum[i-1]<sum[id[top-1]]) top--; id[top++]=i-1; while(i-id[front]>m&&front<top) front++; if(sum[i]-sum[id[front]]>Max) { star=id[front]+1; end=i; Max=sum[i]-sum[id[front]]; } } if(star>n) star%=n; if(end>n) end%=n; printf("%d %d %d\n",Max,star,end); } return 0; }
时间: 2024-10-31 11:43:16