题目传送

简单地说,这题就是让我们求前i个数的最大子串和和最值。

对于最大子串和,我们可以设一个变量qian,表示以当前元素结尾的最大子串的子串和。若搜索完第i-1个小朋友,现在看到第i个小朋友时,若qian大于0,就说明以第i-1个小朋友为结尾的最大子串和的值大于0,那么让这小朋友连上这个字串的话得到的子串和一定比让这个小朋友独自一人组成一个子串得到的和要大,而且在这时第i个小朋友连上这个字串后得到的这个子串也是以第i个小朋友为结尾的和最大的子串;若qian小于0,那第i个小朋友就不如自己单独组成一个新的子串,这样得来的子串和还要比让这个小朋友连上之前的子串得到的子串和要大。若qian大于目前搜索到的所有子串的和中最大的和maxn还要大,就更细maxn。第i个小朋友的特征值就是此时的maxn(注意,以第i个小朋友为结尾的子串不一定是前i个小朋友中组成的所有子串中子串和最大的子串)。

对于最值,我们要每次求第i个小朋友的分数时都把前面的小朋友分数加特征值都扫一遍吗?不用。我们只要维护一个表示当前的前i-1个小朋友中最大的分数与特征值的和的变量maxx就行了。

根据题目范围,显然小朋友的“手牌值”和特征值都是在long long 类型以内的。对于分数也好像在long long 以内。但真的是这样吗?

我们使单位“1”等于109(即小朋友最大可能的手牌值),看一下数据最大的情况,即有1000000个小朋友,每个小朋友手里的牌值都是一个“单位‘1’”,列有下表:

小朋友编号 1 2 3 4 5 6 7 8 9 ... 1,000,000
手牌值(1:109 1 1 1 1 1 1 1 1 1 ... 1
特征值(1:109 1 2 3 4 5 6 7 8 9 ... 1,000,000
分数(1:109 1 2 4 7 11 16 22 29 37 ... 499999500001

499999500001*109=4.99999500001*1020,而long long的数据最大约9*1018,显然会爆,怎么办?这里是用两个long long 型high和low用1015进制表示一个数,即任意一个不超过题意数据范围内的数都可以用high*base+low表示(base=1015)。一个普通的数x转成这样一个数,只需high=x/base,low=x%base。相加的话注意进位就好。对于符号,我们只要保证high和low同号或high为0就行。同时发现,因为low的绝对值小于base,那么如果low为负数,加上一个base就变成正数了;如果low为正数,减去一个base就变成负数了。

见AC代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cctype> using namespace std; long long spe[],num[],ans,mod,qian ; const long long base=; char ch; bool f; inline long long read()
{
ans=;
f=;
ch=getchar();
while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
while(isdigit(ch)) ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return f?-ans:ans;
} struct lll{
long long high,low;
}poi[],maxx; inline lll operator+(lll a,const lll &b)
{
a.low+=b.low;
a.high+=b.high+a.low/base;
a.low%=base;
if(a.high>&&a.low<) a.high--,a.low+=base;
if(a.high<&&a.low>) a.high++,a.low-=base;
return a;
} inline lll operator+(lll a,const long long c)
{
lll b;
b.high=c/base;
b.low=c%base;
a.low+=b.low;
a.high+=b.high+a.low/base;
a.low%=base;
if(a.high>&&a.low<) a.high--,a.low+=base;
if(a.high<&&a.low>) a.high++,a.low-=base;
return a;
} inline lll max(lll a,lll b)
{
if(a.high>b.high) return a;
if(a.high<b.high) return b;
if(a.low>=b.low) return a;
else return b;
} int main()
{
int n=read(),mod=read();
for(int i=;i<=n;i++) num[i]=read();
long long maxn=num[];
for(int i=;i<=n;i++)
{
if(qian<) qian=;
qian+=num[i];
maxn=max(maxn,qian);
spe[i]=maxn;
}
poi[].low=spe[]%base;
poi[].high=spe[]/base;
maxx=poi[]+spe[];
for(int i=;i<=n;i++)
{
poi[i]=maxx;
maxx=max(poi[i]+spe[i],maxx);
}
maxx=poi[];
for(int i=;i<=n;i++)
maxx=max(maxx,poi[i]);
cout<<(base%mod*maxx.high+maxx.low)%mod;
return ;
}

有人说难题都是一个个简单的题叠加成的。对于很多题,其实我们只要把它分解成一个个我们能解决的简单的子问题,最后合并一下就行了。

洛谷P1982 小朋友的数字——题解的更多相关文章

  1. 洛谷P1982 小朋友的数字

    题目传送门 这个题的题目有点长,我们先来分析一波. 首先,这个题目中提到了以下几个量 1.最直接的就是每个小盆友手上的数字,这是题目给你的 2.每个小盆友的特征值 题目中给的定义是:每个小朋友的特征值 ...

  2. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  3. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  4. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  5. 【洛谷P1982】小朋友的数字

    小朋友的数字 题目链接 题目翻译: 每个小朋友有一个数字,构成一个数字序列a1,a2…an 我们定义“特征值”fi为a1~ai中的最大连续子段和 再定义“分数”si为1~i-1中最大的(sj+fj), ...

  6. [洛谷P3292] [SCOI2016]幸运数字

    洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...

  7. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  8. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

  9. [洛谷P1823]音乐会的等待 题解(单调栈)

    [洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...

随机推荐

  1. python每日一练:0011题

    第 0011 题: 敏感词文本文件 filtered_words.txt,里面的内容为以下内容,当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights. 北京 程序员 公 ...

  2. 应用安全 - 中间件漏洞 - Nostromo

     CVE-2011-0751 Date: 2011.3 类型: 路径遍历 PoC:https://nvd.nist.gov/vuln/detail/CVE-2011-0751 CVE-2019-162 ...

  3. 浅谈html5在vr中的应用

    使用过HTML5制作动画过程的开发者都知道,HTML5页面给人一种逼真的感觉,同时HTML也是可以制作VR页面,但是需要你熟练HTML5与JavaScript开发过程,所以在有必要的情况下,我们可以用 ...

  4. 20191112 Spring Boot官方文档学习(4.3)

    4.3.Profiles Spring Profiles提供了一种隔离部分应用程序配置并使之仅在某些环境中可用的方法.任何@Component,@Configuration或@Configuratio ...

  5. [Git] 014 远程仓库篇 第一话

    0. 前言 在 [Git] 001 初识 Git 与 GitHub 之新建仓库 中,我在 GitHub 上建了一个仓库 "interesting" 这回的任务 把远程的 " ...

  6. Struts学习(一)

    1.Struts开发基础 1.1  MVC的基本概念 mvc将一个应用系统的输入.处理和输出流程按照Model(模型).View(视图)和Controller(控制器)三部分进行分离,划分成模型层.视 ...

  7. Javascript原型介绍

    原型及原型链 原型基础概念 function Person () { this.name = 'John'; } var person = new Person(); Person.prototype ...

  8. 使用Object.create()实现继承 用 Object.create实现类式继承

    使用Object.create()实现继承:https://www.cnblogs.com/cuew1987/p/4075027.html 用 Object.create实现类式继承:https:// ...

  9. easy-mock的运用

    一.概念 Easy Mock 是杭州大搜车无线团队出品的一个极其简单.高效.​可视化.并且能快速生成模拟数据的 在线 mock 服务 .以项目管理的方式组织 Mock List,能帮助我们更好的管理 ...

  10. I-最短的名字

    在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab. 名字这么长,叫全名显然起来很不方便.所以村民之间一般只叫名字的前缀.比如叫’aaaaa’的时候可以只叫’a ...