【BZOJ3544】[ONTAK2010]Creative Accounting 前缀和+set

【BZOJ3544】[ONTAK2010]Creative Accounting

Description

给定一个长度为N的数组a和M,求一个区间[l,r],使得(\sum_{i=l}^{r}{a_i}) mod M的值最大,求出这个值,注意这里的mod是数学上的mod

Input

第一行两个整数N,M。
第二行N个整数a_i。

Output

输出一行,表示答案。

Sample Input

5 13
10 9 5 -5 7

Sample Output

11

HINT

【数据范围】
N<=200000,M,a_i<=10^18

题解:首先子串和=两个前缀相减。所以对于每个前缀和,我们找到max(它-之前的前缀)就行了。贪心可知之前的前缀和要么是它的后继要么是0。

#include <cstdio>
#include <cstring>
#include <set>
#include <iostream>
using namespace std;
typedef long long ll;

set<ll> s;
set<ll>::iterator it;
ll m,sum,ans;
int n;
inline ll rd()
{
	ll ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+gc-‘0‘,gc=getchar();
	return ret*f;
}
int main()
{
	n=rd(),m=rd();
	int i;
	s.insert(0);
	for(i=1;i<=n;i++)
	{
		sum=((sum+rd())%m+m)%m;
		it=s.upper_bound(sum);
		if(it!=s.end())	ans=max(ans,sum+m-(*it));
		s.insert(sum);
		ans=max(ans,sum);
	}
	printf("%lld",ans);
	return 0;
}
时间: 2024-08-11 05:31:32

【BZOJ3544】[ONTAK2010]Creative Accounting 前缀和+set的相关文章

BZOJ3544 [ONTAK2010]Creative Accounting

看不懂题,就不能写的稍微像人话点吗我去... 题目就是要找一段区间使得Σai mod m的值最大. 于是嘛...前缀和一下再贪心就好了. 先求出前i个数的前缀和s,然后用s更新解. 还有可能就是前面的某个前缀和s1刚好在mod m意义下大于s且是最小的一个,那么这一段的和就是m + s - s1,再用它来更新解. 1 /************************************************************** 2 Problem: 3544 3 User: ra

BZOJ 3544 ONTAK 2010 Creative Accounting 贪心+平衡树

题目大意:给出一段区间,和一个树p,请找出一段区间,使得这段区间和%p的值最大. 思路:利用前缀和的思想,用set维护出现过的所有的前缀和.对于一个前缀和m来说,如果之前出现过(m + 1) % p是最好的,这样就可以达到最大.所以就找之前出现过比(m + 1)大的数,如果没有就贪心的取begin().然后更新答案. 负数取模还是要好好搞搞. CODE: #include <set> #include <cstdio> #include <cstring> #inclu

noip知识点总结之--贪心

一.什么是贪心 贪心算法嘛... 就是在对某个问题求解时,总是做出在当前看来是最好的选择 In other wors,并不是从整体最优上加以考虑,而是在获得某种意义上的局部最优解 二.贪心算法的适用前提 局部的最优解能导致最后整体的最优解,即局部的最优解不受该部分以外的东西的影响 对于贪心算法,我们需要证明:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的 实际上,能用贪心算法的问题很少,大部分看上去能用贪心算法去做的题目,其实都得不到最优解T T(这时候就需要运用动态规划了) 而看

hdu5327_Olympiad(数组前缀和)

/////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:tt2767 声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 查看本文更新与讨论请点击:http://blog.csdn.net/tt2767 链接被删请百度: CSDN tt2767 ///////////////

COGS 696. [IOI1996][USACO 2.3] 最长前缀

★   输入文件:prefix.in   输出文件:prefix.out   简单对比时间限制:1 s   内存限制:128 MB 描述 USACO 2.3.1 IOI96 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定要全部出现(如下例中B

【BZOJ-1218】激光炸弹 前缀和 + 枚举

1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1778  Solved: 833[Submit][Status][Discuss] Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值.激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破

mysql批量删除相同前缀的表格

如果你网站后台没法运行mysql,就进phpmyadmin,然后运行一段代码.假如要删除织梦cms的dede_前缀的表,则运行 Select CONCAT( 'drop table ', table_name, ';' )   FROM information_schema.tables   Where table_name LIKE 'dede_%'; 然后,会得一个查询列表,然后点击选择全部,并复制下来这一大串代码.重新点击你安装的程序所对应的数据库,然后点击上面的sql,运行复制下来的一段

常见的浏览器前缀

有些时候,某些CSS属性还只是最新版的预览版,并未发布成最终的正式版,而大部分浏览器已经为这些属性提供了支持,但这些属性是小部分浏览器专有的:有些时候,有些浏览器为了扩展某方面的功能,它们会选择新增的一些CSS属性,这些自行扩展的CSS属性也是浏览器专属的.为了让这些浏览器识别这些专属属性,CSS规范允许在CSS属性前增加各自的浏览器前缀. 常见的浏览器前缀有: 前缀 组织 示例 说明 -ms- Microsoft -ms-interpolation-mode IE浏览器专属的CSS属性需添加-

Trie树统计单词前缀

输入 输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词.接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问. 输出 对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数. 样例输入 5 babaab babbbaaaa a