Max Sum of Max-K-sub-sequence

  • 题目
  • 题意:区间连续最大和
  • 题解:转化为求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;
    }

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值