洛谷P1982 小朋友的数字——题解
简单地说,这题就是让我们求前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 小朋友的数字——题解的更多相关文章
- 洛谷P1982 小朋友的数字
题目传送门 这个题的题目有点长,我们先来分析一波. 首先,这个题目中提到了以下几个量 1.最直接的就是每个小盆友手上的数字,这是题目给你的 2.每个小盆友的特征值 题目中给的定义是:每个小朋友的特征值 ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 【洛谷P1982】小朋友的数字
小朋友的数字 题目链接 题目翻译: 每个小朋友有一个数字,构成一个数字序列a1,a2…an 我们定义“特征值”fi为a1~ai中的最大连续子段和 再定义“分数”si为1~i-1中最大的(sj+fj), ...
- [洛谷P3292] [SCOI2016]幸运数字
洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- [洛谷P1823]音乐会的等待 题解(单调栈)
[洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...
随机推荐
- EFI系统分区如何删除
U盘或者硬盘被做了系统安装盘. 结果在格式化都是失败,分区也不行. 有了新招 EFI分区是您的系统启动引导的分区,存放引导启动的文件的,因此它是一个操作系统独立的分区,实际上它是UEFI加载的固件和应 ...
- 各种CNN模型
Resnet: model_urls = { 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', 'res ...
- IP地址转换函数——inet_pton inet_ntop inet_aton inet_addr inet_ntoa
inet_pton NAME inet_pton - 将 IPv4 和 IPv6 地址从点分十进制转换为二进制 SYNOPSIS #include <arpa/inet.h> in ...
- ipad已停用 连接itunes怎么办
问题描述: ipad 开机密码多次输入出错后,提示 ipad已停用 连接itunes 解决方法: 参考: https://jingyan.baidu.com/article/fb48e8bee9ef4 ...
- 文档压缩 | gzip、bzip2、xz
6.文档的压缩与打包 Linux下常见后缀名所对应的的压缩工具 .gz 表示由gzip压缩工具压缩的文件 .bz2 表示由bzip2压缩工具压缩的文件 .tar 表示由tar打包程序打包的文件(tar ...
- 文件类型 | 命令ln | 软链接硬链接
1.9文件类型 1.9.1常见文件类型 d:目录 -:普通文件 l:链接文件 b:设备 1.9.2文件后缀名 sh:shell脚本 tar.gz:压缩包 my.cnf:配置文件 test.zip:压缩 ...
- python控制流-名词解释
一.控制流的元素 控制流语句的开始部分通常是“条件”,接下来是一个代码块,称为“子句”. 二.控制流的条件 条件为了判断下一步如何进行,从而求布尔值的表达式.几乎所有的控制流语句都使用条件. 三.代码 ...
- mock.js的运用
一:概念 Mock.js是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试.提供了以下模拟功能: 根据数据模板生成模拟数据 模拟 Ajax 请求,生成并返回模拟数据 基于 H ...
- Linux环境部署Node.js
介绍 先前在阿里云ECS上部署Node.js,碰到不少坑,都是自己不仔细造成的,所以准备再部署一遍,并记录下来.我将我的服务器重置了,这次选择的是CentOS 7.4 64位,上次的是7.2的. 使用 ...
- P1177快速排序
这是一个快速排序的模板题.拿到题后便写了quicksort(确定一个基准数,利用两个哨兵,把大的放右边,小的放左边,再递归实现排序),但是竟然TLE了60pts(???),于是翻看dalao们的题解, ...