- 题目
- 题意:区间连续最大和
- 题解:转化为求sum[i] - sum[j]最大,即求在 i位的 k区间范围内最小的sum [j],单调队列维护一下最小值就好了。
-
反思:对deque的理解太浅,以至于卡了很久,由于deque的迭代器失效问题,debug是会报错的,但是运行是没有问题的。
- 链接:https://blog.csdn.net/ww32zz/article/details/48224941
-
#include<cstdio> #include<deque> #define INF 0x3f3f3f using namespace std; const int maxn = 2e5+10; struct node{ int sum,st; }now,ans; int num[maxn]; int main() { int t,n,k,ed,len; deque<node> dq; scanf("%d",&t); while(t--) { ans.sum = -INF; ans.st = 0; ed = 0; scanf("%d%d",&n,&k); for(int i=1;i<=n;++i) { scanf("%d",&num[i]); num[n+i] = num[i]; } for(int i=1;i<=2*n;++i) num[i] += num[i-1]; for(int i=1;i<=2*n;++i) { if(!dq.empty() && dq.front().st < i-k){ dq.pop_front(); } while(!dq.empty()) { int u = dq.back().sum; if(num[i-1] < u){ dq.pop_back(); } else break; } now.sum = num[i-1]; now.st = i-1; dq.push_back(now); int mark = num[i] - dq.front().sum; if(ans.sum < mark) { ans.sum = mark; ans.st = dq.front().st + 1; ed = i; } } if(ans.st > n) ans.st -= n; if(ed > n) ed -= n; printf("%d %d %d\n",ans.sum,ans.st,ed); while(!dq.empty()){ dq.pop_front(); } } return 0; }
Max Sum of Max-K-sub-sequence
最新推荐文章于 2021-11-04 14:35:22 发布