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. feed流拉取,读扩散,究竟是啥?

    from:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961214&idx=1&sn=5e80ad6f2 ...

  2. sql server 存储过程基础知识

    转自家园大哥博文http://www.cnblogs.com/jiajiayuan/archive/2011/06/15/2081201.html 什么是存储过程呢?存储过程就是作为可执行对象存放在数 ...

  3. Unity 协程使用指南

    0x00 前言 在使用Unity的过程中,对协程仅仅知道怎样使用,但并不知道协程的内部机理,对于自己不清楚的部分就像一块大石压力心里.让自己感觉到担忧和不适. 这篇文章一探到底,彻底揭开协程的面纱,让 ...

  4. hibernate4.3 无法获取数据库最新值

    在用ssh框架的时候遇到一个问题(hibernate版本号4.3) 问题描写叙述:web端和应用程序都能够读写数据库.当应用程序改动数据库后.hibernate无法读取最新值,读出来的一直都是旧数据. ...

  5. SpringBoot(八)-- 日志

    一.介绍 SpringBoot内部使用Commons Logging来记录日志,但也保留外部接口可以让一些日志框架来进行实现,例如Java Util Logging,Log4J2还有Logback.如 ...

  6. RAC的搭建(二)--创建ASM磁盘

     1. 规划 表决磁盘: 1Gx3(3节点以下,建议都采用这种配置,三个磁盘加起来要大于1.8G,否则会报错) 数据磁盘: 10Gx1 闪回磁盘: 5Gx1 2. 创建共享磁盘 virtualBox上 ...

  7. 《转》Python学习(19)-python函数(二)-关于lambda

    转自http://www.cnblogs.com/BeginMan/p/3178103.html 一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称 ...

  8. Elasticsearch学习之深入搜索二 --- 搜索底层原理剖析

    1. 普通match如何转换为term+should { "match": { "title": "java elasticsearch"} ...

  9. 常用的数据整理的JavaScript库

    Lodash.js https://lodash.com/ Underscore.js https://www.html.cn/doc/underscore/

  10. JVM工具jinfo实践

    一.jinfo命令格式 命令格式: jinfo [option] <pid> Usage: jinfo [option] <pid> (to connect to runnin ...