博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu3415 Max Sum of Max-K-sub-sequence 单调队列
阅读量:6704 次
发布时间:2019-06-25

本文共 1842 字,大约阅读时间需要 6 分钟。

//hdu3415 Max Sum of Max-K-sub-sequence//单调队列//首先想到了预处理出前缀和利用s[i] - s[j]表示(j,i]段的和//之后的问题就转换成了求一个最小的s[j]了,这样就能够单调队列//求最小值。

//队列中维护的是区间的開始的位置j。我们插入队列中的是j-1,由于 //这个时候s[i] - s[j-1]刚好就是[j,i]段闭区间的和 //这里用两种方式实现,一种是stl,一种是手动模拟,两者的速度,測试的 //结果在杭电測试都是一样的,499ms。 // //单调队列的路还长着,继续走吧 #include <cstdio> #include <queue> #include <algorithm> #include <iostream> #include <cstring> using namespace std; typedef long long ll; const int maxn = 1e5 + 8; ll a[maxn*2]; ll sum[maxn*2]; ll x[maxn * 2]; int deq[maxn * 2]; int n,k; int mod; void input(){ scanf("%d%d",&n,&k); for (int i=1;i<=n;i++){ scanf("%lld",&a[i]); } for (int i=n+1;i<=2*n;i++){ a[i] = a[i-n]; } sum[0] = 0; for (int i=1;i<=n;i++){ sum[i] = sum[i-1] + a[i]; } for (int i=1;i<k;i++){ sum[i+n]= sum[i+n-1] + a[i]; } mod = n; n = n + k - 1; } void solve(){ int s,e; int head = 0,tail = 0; ll mx = -1e10; for (int i=1;i<=n;i++){ while(tail > head && sum[i-1]<=sum[deq[tail-1]]) tail--; while(tail > head && deq[head]<i-k) head++; deq[tail++] = i-1; if (sum[i] - sum[deq[head]] > mx){ mx = sum[i] - sum[deq[head]]; s = deq[head] + 1; e = i; } } if (e > mod) e -= mod; printf("%lld %d %d\n",mx,s,e); //printf("%lld %d\n",x[mk],(mk+k)%n); } //void solve(){ // int s,e; // deque<int> deq; // deq.clear(); // ll mx = -1e10; // for (int i=1;i<=n;i++){ // while(!deq.empty() && sum[i-1]<=sum[deq.back()]) // deq.pop_back(); // while(!deq.empty() && deq.front()<i-k) // deq.pop_front(); // deq.push_back(i-1); // if (sum[i] - sum[deq.front()]>mx){ // mx = sum[i] - sum[deq.front()]; // s = deq.front() + 1; // e = i; // } // } // // if (e > mod) // e -= mod; // printf("%lld %d %d\n",mx,s,e); // // //printf("%lld %d\n",x[mk],(mk+k)%n); //} int main(){ //freopen("1.txt","r",stdin); int t; scanf("%d",&t); while(t--){ input(); solve(); } return 0; }

转载于:https://www.cnblogs.com/gavanwanggw/p/6748744.html

你可能感兴趣的文章
[自己动手玩黑科技] 1、小黑科技——如何将普通的家电改造成可以与手机App联动的“智能硬件”...
查看>>
Phonegap 通知 Notification
查看>>
3.2. 用户认证
查看>>
ORACLE 9i卸载并重新安装
查看>>
[Python]Hamming distance 问题
查看>>
详解游标
查看>>
[CareerCup] 3.1 Implement Three Stacks using Array 使用数组来实现三个栈
查看>>
《xUnit Test Patterns》学习笔记5 - xUnit基础
查看>>
Linux下锁定账号,禁止登录系统的设置总结
查看>>
STM32启动过程解析-2.02固件库启动文件分析
查看>>
PLSQL Developer设置及快捷键设置
查看>>
《深入浅出MFC》笔记(四)
查看>>
第 15 章 Div+CSS页面设计
查看>>
[LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
查看>>
linux运维
查看>>
Go中的CGI包使用
查看>>
移动端产品上线流程
查看>>
博客园被黑了?
查看>>
[Struts]学习日记2 - 增加一些验证
查看>>
js 获取浏览器高度和宽度值(多浏览器)
查看>>