XTU 1264 - Partial Sum - [2017湘潭邀请赛E题(江苏省赛)]
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题(江苏省赛)]的更多相关文章
- XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]
这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...
- XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]
是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...
- XTU 1261 - Roads - [最小割][2017湘潭邀请赛B题(江苏省赛)]
之前在网上搜了一个下午没搜到这道题的题解,然后同时又对着叉姐写的两行字题解看了一个下午: 虽然基本上已经知道了这题的思路,但愣是因为自己代码实现起来太繁复,外加不确定正确性,没敢码…… 但是一道题肝了 ...
- 2017湘潭大学邀请赛E题(贪心)
链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE Partial Sum Input The input contains zero or more t ...
- 2017 湘潭邀请赛&JSCPC G&J
训练的时候对G想了一个假算法..也有很大可能是写错了.. 下来一看别人的G 看起来很奇妙.. 开始把所有的左括号翻成右括号,然后cost*=-1 这样在优先队列中就是最优的 然后for每一段 如果前缀 ...
- 2017湘潭大学邀请赛G题(贪心+优先队列)
参考博客:http://www.cnblogs.com/chendl111/p/6891770.html 题目链接:https://www.icpc.camp/contests/4mYguiUR8k0 ...
- 2018湘潭邀请赛C题(主席树+二分)
题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...
- 2017湘潭大学邀请赛H题(树的直径)
链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE H. Highway The input contains zero or more test cas ...
- 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 ...
随机推荐
- chm只看到目录,看不到内容解决办法
鼠标左键->属性->解除锁定->搞定!
- Redis 集群配置
Redis 集群介绍: (1) 为什么要使用集群:如果数据量很大,单台机器会存在存储空间不够用 .查询速度慢 .负载高等问题,部署集群就是为了解决这些问题(2) Redis 集群架构如下,采用无中心结 ...
- Selenium 基本用法
如下,使用 Selenium 打开淘宝首页并获取页面源代码: from selenium import webdriver browser = webdriver.Chrome() # 声明一个浏览器 ...
- com.baidu.mapapi.CoordType
2.2.2升级到3.0.1百度报错了, 一:请检查.jar,.so是否是最新的 二:clear
- 细说php的异常和错误处理机制
再谈php错误与异常处理 讲的非常好 w3school php异常处理机制 php错误异常处理详解 注: 关注set_error_handler() set_exception_handler() r ...
- windowsError错误码详解
WindowsError的错误代码详解 0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. 4系统无法打开文件. 5拒绝访问. 6句柄无效. 7存储控制块被损坏. 8存 ...
- linux C 调用shell程序执行
#include<stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h ...
- 原:Myeclipse10+Egit+bitbucket实现版本控制
1.首先在https://bitbucket.org注册账号,建立仓库(repository),这部分有问题的可以看https://confluence.atlassian.com/display/B ...
- 多了解一下Chrome开发者控制台
多了解一下Chrome开发者控制台 2017年10月14日 • Tools, Web前端 • 1.0k views • 暂无评论 作为一名前端开发者,Chrome内置的控制台是必须了解的,它拥有非常丰 ...
- MongoDB安装问题以及启动
在安装MongoDB的文件中找到bin文件,其中有mongo.exe应用程序,双击打开会出现第二幅图的样子. 将MongoDB服务器作为Windows服务运行,运行后,不知道为什么无法启动,即使删除d ...