hdu 3514 dp + 单调队列优化
2012-09-15 21:08
405 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3415
题意:给你一个环形的数列,问你连续长度为k的数的和的最大值,并且输出区间坐标,使坐标字典序最小
分析:把环形转换成直线处理即可,求出累加和数组,用优先队列维护
题意:给你一个环形的数列,问你连续长度为k的数的和的最大值,并且输出区间坐标,使坐标字典序最小
分析:把环形转换成直线处理即可,求出累加和数组,用优先队列维护
#include<iostream> #include<algorithm> #include<memory.h> #include<cstdio> using namespace std; const int maxn=200004; int a[maxn],sum[maxn],n,t,k,q[maxn]; int main() { cin>>t; while(t--) { int i,j,st=1,ed=1,ans=-0x3ffffff; cin>>n>>k; for(i=1; i<=n; i++) { cin>>a[i]; if(ans<a[i]) ans=a[i],st=i-1,ed=i; a[i+n]=a[i]; } for(i=1; i<2*n; i++) { sum[i]=sum[i-1]+a[i]; } int l=0,r=0; q[l]=0; for(i=1; i<2*n; i++) { while(l<=r&&sum[q[r]]>sum[i])r--; q[++r]=i; while(i-q[l]>k&&l<r)l++; if(q[l]>=i) continue; if(ans<sum[i]-sum[q[l]]) { ans=sum[i]-sum[q[l]]; st=q[l],ed=i; } if(ans==sum[i]-sum[q[l]]) { if(st>q[l]) st=q[l],ed=i; else if(st==q[l]&&ed>i) ed=i; } } printf("%d %d %d\n",ans,st%n+1,((ed-1)%n)+1); } return 0; }
相关文章推荐
- CDOJ1696 吴神的炒股技巧 [dp + 单调队列优化]
- HDU 3415(Max Sum of Max-K-sub-sequence-单调队列优化DP)
- HDU 4374 单调队列优化 DP
- hdu 5945 Fxx and game 单调队列优化dp
- hdu 3401 Trade 单调队列优化dp
- hdu4362 dp + 单调队列优化
- HDU - 4362 Dragon Ball(单调队列优化的DP)@
- HDU 4258 Covered Walkway【单调队列斜率优化】
- NOI 2005 瑰丽华尔兹(三维DP + 单调队列优化)
- hdu3530——Subsequence(单调队列优化DP)
- 【HDU 3401 Trade】 单调队列优化dp
- HDU 1171 Big Event in HDU (多重背包+单调队列优化)
- hdu 4362 Dragon Ball 单调队列优化 dp
- HDU 1171 Big Event in HDU (单调队列优化多重背包)
- hdu 5945 Fxx and Game dp(单调队列优化)
- HDU 4374 One hundred layer DP的单调队列优化
- hdu-3401-Trade-单调队列优化的DP
- hdu 2191 单调队列优化
- hdu-3401-Trade-单调队列优化的DP
- hdu 4374 One hundred layer 单调队列优化dp