洛谷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,如果他们是相邻或他们之间没 ...
随机推荐
- debian下安装mysql 5.1.34
#cd /usr/local/src # tar xvzf mysql-5.1.34.tar.gz # cd mysql-5.5.1.34 配置和编译 #chmod +x configure # ./ ...
- Mysql函数----控制流函数介绍
MySQL有4个函数用来进行条件操作的,可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台. MySQL控制流函数: 1.CASE WHEN[test1] THEN [re ...
- webapi接口统一返回请求时间
webapi接口统一返回请求时间: public class BaseController : ControllerBase { protected ReturnResult<T> Res ...
- 嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法
嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法 点我进入OJ题目详情 题意 给你一串数,让你求长度最长的子串,这个字串满足里面没有重复出现的数字. 解题思路 使用一个标记数组,来标记每个数的第一 ...
- kafka复习(2)
一.简介 --------------------------------------- 1.kafka是一个分布式的.可分区的.可复制的消息系统.它提供了消息系统的功能,但是有自己独特的设计. 2. ...
- k3 cloud中员工离职以后释放站点
进入金蝶云企业平台:https://cloud.kingdee.com/qy,找到对应的用户并选择离职 给替代的员工加上专业应用组: 客户端也加上分组并且同步注册用户 管理中心更新用户许可:
- 毛玻璃效果 css
毛玻璃效果 <style> .container{ width: 287px; height: 285px; background-image: url(img/background.pn ...
- 30. Substring with Concatenation of All Words (JAVA)
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
- Docker 启动与停止容器
启动已运行过的容器 docker start 容器名称|容器id 如: docker start mycentos 启动所有运行过的容器(注意:反单引号` `), docker ps -a -q 是查 ...
- MySQL存储过程、触发器、自定义函数、事务
1.存储过程 MySQL中存储过程的参数中有IN.OUT.INOUT类型,但是函数的参数只能是IN类型的. “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参 ...