2017江苏省赛的E题,当时在场上看错了题目没做出来,现在补一下……

题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1264(注意在上面使用G++编译的话,请使用%I64d)

Time Limit : 3000 MS

Memory Limit : 65536 KB

Bobo has a integer sequence a1,a2,…,an of length n. Each time, he selects two ends 0≤l<r≤n and add ∑(i=l+1 to r)(ai) − C into a counter which is zero initially. He repeats the selection for at most m times.

If each end can be selected at most once (either as left or right)(所有端点只能使用一次), find out the maximum sum Bobo may have.

Input

The input contains zero or more test cases and is terminated by end-of-file. For each test case:

The first line contains three integers n, m, C. The second line contains n integers a1,a2,…,an.

  • 2≤n≤1e5
  • 1≤2m≤n+1
  • |ai|,C≤1e4
  • The sum of n does not exceed 1e6.

Output

For each test cases, output an integer which denotes the maximum.

Sample Input

4 1 1
-1 2 2 -1
4 2 1
-1 2 2 -1
4 2 2
-1 2 2 -1
4 2 10
-1 2 2 -1

Sample Output

3
4
2
0

题目思路:

既然是让我们求最大子序列和,首先想到的是O(n)的算法,所以最简单的思路是O(n)算出最大连续子序列和,然后标记掉两个用过的端点,再继续O(n)的算这时的最大连续子列和……

反复如此,直到某个时候,这个子序列和已经比C小了 或者 次数已经到达m次,就停止。

显然,这样的时间复杂度可以到达O(mn),明显是超时,显然,m次的查询很难再减少了,就考虑怎么降低寻找最大连续子列和的时间复杂度。

这时,可以考虑用前缀和保存整个数组,然后再对这个sum[0……n]进行排序(注意,此时的sum[i]有n+1个,因为 0 <= l < r <= n)

那么,我们每次想查询最大连续子列和,只需要,这个sum[0……n]数组的最后一个(sum[r])减去最前一个(sum[l]),不断地l++,r--即可……

这样的时间复杂度最坏大概是O(n)+O(nlgn)+O(m),就不会超时。

 #include<cstdio>
#include<algorithm>
#define MAXN 100000+5
using namespace std;
int n,m,c,cnt,sum[MAXN];
long long ans;
int main()
{
while(scanf("%d%d%d",&n,&m,&c)!=EOF)
{
sum[]=;
for(int i=;i<=n;i++)
{
scanf("%d",&cnt);
sum[i]=sum[i-]+cnt;
}
sort(sum,sum+n+);
ans=;cnt=;
for(int l=,r=n;l<r;l++,r--)
{
if(sum[r]-sum[l]-c>)
{
ans+=sum[r]-sum[l]-c;
cnt++;
}
if(cnt>=m || sum[r]-sum[l]-c<=) break;
}
printf("%I64d\n",ans);
}
}

其实,我们不难发现,前缀和也可以求出最大连续子列和,但是如果我们只要查询一次最大连续子列和,显然是遍历a[1……n]数组的O(n)的算法比较快,但如果我们要像上题那样,不断地求第二大、第三大……这样的,还是用前缀和维护数组比较快。

附上2017湘潭邀请赛暨2017江苏省赛(JSCPC)的题解:http://files.cnblogs.com/files/dilthey/xiangtan-2017-solution.pdf

比赛题目地址:http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/43

XTU 1264 - Partial Sum - [2017湘潭邀请赛E题(江苏省赛)]的更多相关文章

  1. XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]

    这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...

  2. XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]

    是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...

  3. XTU 1261 - Roads - [最小割][2017湘潭邀请赛B题(江苏省赛)]

    之前在网上搜了一个下午没搜到这道题的题解,然后同时又对着叉姐写的两行字题解看了一个下午: 虽然基本上已经知道了这题的思路,但愣是因为自己代码实现起来太繁复,外加不确定正确性,没敢码…… 但是一道题肝了 ...

  4. 2017湘潭大学邀请赛E题(贪心)

    链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE Partial Sum Input The input contains zero or more t ...

  5. 2017 湘潭邀请赛&JSCPC G&J

    训练的时候对G想了一个假算法..也有很大可能是写错了.. 下来一看别人的G 看起来很奇妙.. 开始把所有的左括号翻成右括号,然后cost*=-1 这样在优先队列中就是最优的 然后for每一段 如果前缀 ...

  6. 2017湘潭大学邀请赛G题(贪心+优先队列)

    参考博客:http://www.cnblogs.com/chendl111/p/6891770.html 题目链接:https://www.icpc.camp/contests/4mYguiUR8k0 ...

  7. 2018湘潭邀请赛C题(主席树+二分)

    题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...

  8. 2017湘潭大学邀请赛H题(树的直径)

    链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE H. Highway The input contains zero or more test cas ...

  9. 2017-5-14 湘潭市赛 Partial Sum 给n个数,每次操作选择一个L,一个R,表示区间左右端点,该操作产生的贡献为[L+1,R]的和的绝对值-C。 0<=L<R<=n; 如果选过L,R这两个位置,那么以后选择的L,R都不可以再选择这两个位置。最多操作m次,求可以获得的 最大贡献和。

    Partial Sum Accepted : Submit : Time Limit : MS Memory Limit : KB Partial Sum Bobo has a integer seq ...

随机推荐

  1. 7 -- Spring的基本用法 -- 7... 创建Bean的3种方式

    7.7 创建Bean的3种方式 ① 调用构造器创建Bean. ② 调用静态工厂方法创建Bean. ③ 调用实例工厂方法创建Bean. 7.7.1 使用构造器创建Bean实例. 使用构造器来创建Bean ...

  2. luasocket 接收数据

    在游戏客户端使用luasocket作为网络通信的手段, 有一点很蛋疼, 就是它的receive是阻塞的,  那界面就卡死在那里了,  不过有一个函数:settimeout(), 传入参数0, 表示如果 ...

  3. 配置Django框架为生产环境的注意事项(DEBUG=False)

    问题描述: Django1.10版本中框架中settings.py配置文件 配置文件settings.py配置了下面两项: DEBUG= False ALLOWED_HOSTS = ['*'] #这样 ...

  4. 基于github+hexo搭建个人博客(window)

    0x01 环境搭建 1.Node.js环境 下载Node.js安装文件:https://nodejs.org/en/download/ 根据系统选择相应安装包下载,安装过程一路Next,默认设置即可. ...

  5. Outlook 2007 实现自动添加密送的方法

    1)在Outlook里面键入Alt+F11打开VBA编辑器:     2)激活左边的工程面板,展开并双击上面的“Project (VbaProject.OTM)/Microsoft Office Ou ...

  6. Splash jsfunc() 方法

    jsfunc()方法可以直接调用 JavaScript 定义的方法,但是所调用的方法需要用双中括号包围,这相当于实现了 JavaScript 方法到 Lua 脚本的转换 function main(s ...

  7. Qt打包部署程序自动查找依赖DLL工具windeployqt

    qt编译好一个exe程序之后,部署到一台没有开发环境的机器上,需要一起拷贝其依赖的dll文件.这时需要一个windeployqt工具来帮忙,因为手动拷贝的话容易遗漏. https://blog.csd ...

  8. goto的用法

    using UnityEngine; using System.Collections; public class goto1 : MonoBehaviour { public bool can = ...

  9. SpringMVC系列之URL匹配问题

    一.工程目录 二.web.xml配置文件及与其他文件的关系 三.控制器部分 四.返回值 五.url前后缀 六.项目源代码 http://files.cnblogs.com/files/xujian20 ...

  10. PON系统基础知识简介

    一  PON基础知识 1.1 PON技术概念 PON(Passive Optical Network)即无源光网络,一种基于点到多点(P2MP)拓朴的技术.“无源”指ODN(光分配网络)不含有任何电子 ...