环上最大连续和

给定N,K以及一个环:A[1],A[2],A[3],...A[N],其中A[1]的左边是A[N]。
求该环上最大的连续子段和,要求选出的子段长度不超过K。

输入描述:
第一行两个整数N和K。接下来一行,N个整数表示A[i]。
输出描述:
输出题目要求的最大连续和。



求Max{sum[i]-sum[x]},单调队列维护sum[x]。

code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
inline void read(int &a)
{
    int k=1; a=0; char c=getchar();
    while(c<‘0‘||‘9‘<c){if(c==‘-‘)k=-1; c=getchar();}
    while(‘0‘<=c&&c<=‘9‘){a=a*10+c-‘0‘; c=getchar();}
    a*=k;
}
inline void write(int a)
{
    if (a<0){putchar(‘-‘);a=-a;}
    if (a>9)write(a/10);
    putchar(a%10+‘0‘);
    return ;
}
int a[200005],q[200005],sum[200005];
int main()
{
    int n,m,i,j;
    cin>>n>>m;
    for (i=1;i<=n;i++)
    {
        read(a[i]);
        a[i+n]=a[i];
    }
    for (i=1;i<=2*n;i++)
    {
        sum[i]=sum[i-1]+a[i];
    }
    int l=1,r=1,ans=-2147483647;
    q[r]=0;
    for (i=1;i<=n+m;i++)
    {
        while (l<=r&&i-q[l]>m)
        l++;
        if (l<=r&&sum[i]-sum[q[l]]>=ans)
        {
            ans=sum[i]-sum[q[l]];
        }
        while (l<=r&&sum[q[r]]>=sum[i])
        r--;
        q[++r]=i;
    }
    cout<<ans<<endl;
    return 0;
}
 

原文地址:https://www.cnblogs.com/applechina/p/10807133.html

时间: 2024-11-07 01:30:09

环上最大连续和的相关文章

从《彩色圆环》一题探讨一类环上dp的解法

清橙A1202 bzoj2201 bsoj4074 先看看这篇官方题解的问题\(A\),了解一下经典的圆环染色问题 --<彩色圆环(circle)>命题报告,吴佳俊 题外话:其实还可以更优,用矩阵快速幂可以优化,也可以特征根推出通项公式,这里不展开讨论了 我们从中获取了一种处理环上dp的思路,即增设一维来维护首尾是否相同 先来看链的情况 设\(f[i]\)表示考虑到第\(i\)位时的期望美观度,显然有 \[ f[i]=\sum_{0 \le j < i} f[j]*(i-j)*P[i-j

Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量

D. Directed Roads ZS the Coder and Chris the Baboon has explored Udayland for quite some time. They realize that it consists of n towns numbered from 1to n. There are n directed roads in the Udayland. i-th of them goes from town i to some other town 

poj 2947 Widget Factory(模7环上的高斯消元)

http://poj.org/problem?id=2947 大致题意: 有n种装饰物,m个已知条件,每个已知条件的描述如下: p start end a1,a2......ap (1<=ai<=n) 第一行表示从星期start到星期end一共生产了p件装饰物(工作的天数为end-start+1+7*x,加7*x是因为它可能生产很多周),第二行表示这p件装饰物的种类(可能出现相同的种类,即ai=aj).规定每件装饰物至少生产3天,最多生产9天.问每种装饰物需要生产的天数.如果没有解,则输出&q

环上的游戏

环上的游戏(cycle)有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流取数,取数的规则如下:(1)选择硬币左边或者右边的一条边,并且边上的数非0:(2)将这条边上的数减至任意一个非负整数(至少要有所减小):(3)将硬币移至边的另一端.如果轮到一个玩家走,这时硬币左右两边的边上的数值都是0,那么这个玩家就输了.如下图,描述的是Alice和Bob两人的对弈过

Flink:动态表上的连续查询

用SQL分析数据流 越来越多的公司在采用流处理技术,并将现有的批处理应用程序迁移到流处理或者为新的应用设计流处理方案.其中许多应用程序专注于分析流数据.分析的数据流来源广泛,如数据库交易,点击,传感器测量或物联网设备. Apache Flink非常适合流式分析,因为它提供了事件时间语义支持,恰一次的处理,并同时实现了高吞吐和低延迟.由于这些特性,Flink能够近乎实时地从大量输入流计算确切的和确定性的结果,同时在出现故障时提供恰一次处理的语义. Flink的流处理核心API,DataStream

tyvj 1342 教主泡嫦娥 环上DP

342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国的方舟上.但也有很多百姓平民想搭乘方舟,毕竟他们不想就这么离开世界,所以他们决定要么登上方舟,要么毁掉方舟. LHX教主听说了这件事之后,果断扔掉了手中的船票.在地球即将毁灭的那一霎那,教主自制了一个小型火箭,奔向了月球…… 教主登上月球之后才发现,他的女朋友忘记带到月球了,为此他哭了一个月.但细心的教

acdream 1682(有环的最大连续和)

题意:有n个数字围成一个圈,然后从圆圈拿走连续的一些数,问拿走的数的和的最大值是多少. 题解:普通最大连续和的做法,如果前面累加的数加当前数是大于最大值就更新最大值,如果小于0就把累加值清零,这个是有环的,那么可以从两种情况考虑,一种是普通的最大连续和找到的最大值,另一种就是头尾拼接的,把所有数取相反数,然后找到最大连续和,那么用总和sum加这个数就是头尾拼接的最大值,取两种情况较大的就是解. #include <stdio.h> #include <algorithm> usin

一个环上的染色问题

学高中数学组合计数的时候经常在那本实验班里碰到这个问题:给一个n元环用k种颜色染色,相邻位置不同色,求方案数.高中遇到这个问题的时候n和k都是很小的,因为一般都是讨论讨论瞎计数做掉.当时某吴姓同学经常说有个公式--但是那个时候我并不知道怎么推出来.今天中午吃饭的时候又看到一个讲这个问题的帖子,所以自己整理了一下发现做法还是挺多的.这个也算是经典问题了吧? (n=4,k=2的情况,有2种方案) 首先我们可以直接写出一个dp:不妨设1号点染的色是1号颜色(最终答案乘个k)设f[i,j]表示对前i个点

bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan索环&amp;&amp;环上单调队列

1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1141  Solved: 435[Submit][Status] Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说,上面的第一个例子是一张仙人图,而第二个不是——注意到它有三条简单回路