三步必杀(高阶差分系列)
题目链接:(https://www.luogu.org/problemnew/show/P4231 )
题目背景
(三)旧都
离开狭窄的洞穴,眼前豁然开朗。
天空飘着不寻常的雪花。
一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音。
这是由被人们厌恶的鬼族和其他妖怪们组成的小社会,一片其乐融融的景象。
诶,不远处突然出现了一些密密麻麻的小点,好像大颗粒扬尘一样。
离得近了点,终于看清楚了。
长着角的鬼们聚在一起,围观着另一只鬼的表演。
那”扬尘”,其实都是弹幕。
勇仪的招数之一,三步之内,所到之处弹幕云集,几乎没有生存可能。
为了强化这一技能,勇仪将对着一排柱子进行攻击。
旧地狱的柱子虽然无比坚固,但保险起见还是先要了解一下这样一套攻击对柱子有多少损伤,顺带也能检验练习的效果。
勇仪决定和其它鬼们商量商量…
“我知道妖怪之山的河童一族有一种叫做计算机的神奇道具,说不定可以借来用用”,萃香说道。
于是旧地狱的鬼族就决定请河城荷取来帮忙了。
“要记录【所有柱子的损伤程度】吗”,荷取问道。
经过进一步的询问,荷取发现他们仅仅需要【所有攻击都完成后】柱子的损伤程度。
任务了解地差不多了,荷取将其中的重要部分提取了出来,记录在了她的工作笔记本上:
(记录的内容见题目描述)
那么实验就这样开始了。
在惊天动地的碰撞声中,勇仪每完成一轮攻击,荷取都忠实地记录下对每根柱子产生的伤害。而此时勇仪就在旁边等待着记录完成,然后再进行下一轮的攻击。
地面上,天色渐晚。
“不想在这里留到深夜啊,不然就回不了家了”,荷取这样想着,手中依然在重复地向计算机中输入新产生的信息。
“真的必须一次一次地记录下每轮攻击对每个柱子产生的伤害吗?有没有更高效的方法?”这一念头在荷取的心中闪过…
(后续剧情在题解中,接下来请看T3)
题目描述
问题摘要:
N个柱子排成一排,一开始每个柱子损伤度为0。
接下来勇仪会进行M次攻击,每次攻击可以用4个参数l,r,s,e来描述:
表示这次攻击作用范围为第l个到第r个之间所有的柱子(包含l,r),对第一个柱子的伤害为s,对最后一个柱子的伤害为e。
攻击产生的伤害值是一个等差数列。若l=1,r=5,s=2,e=10,则对第1~5个柱子分别产生2,4,6,8,10的伤害。
鬼族们需要的是所有攻击完成之后每个柱子的损伤度。
输入输出格式
输入格式:
第一行2个整数N,M,用空格隔开,下同。
接下来M行,每行4个整数l,r,s,e,含义见题目描述。
数据保证对每个柱子产生的每次伤害值都是整数。
输出格式:由于输出数据可能过大无法全部输出,为了确保你真的能维护所有柱子的损伤度,只要输出它们的异或和与最大值即可。
(异或和就是所有数字按位异或起来的值)
(异或运算符在c++里为^)
输入输出样例
输入样例#1:
5 2
1 5 2 10
2 4 1 1
输出样例#1:
3 10
输入样例#2:
6 2
1 5 2 10
2 4 1 1
输出样例#2:
3 10
说明
样例解释:
样例1:
第一次攻击产生的伤害:2 4 6 8 10
第二次攻击产生的伤害:0 1 1 1 0
所有攻击结束后每个柱子的损伤程度:2 5 7 9 10。
输出异或和与最大值,就是3 10。
样例2:
没有打到第六根柱子,答案不变
思路
- 设a[]a[\ \ ]a[ ]为原数组,b[]b[\ \ ]b[ ]为a[]a[\ \ ]a[ ]的差分数组,c[]c[\ \ ]c[ ]为b[]b[\ \ ]b[ ]的差分数组
- 对于l,r,s,tl,r,s,tl,r,s,t我们可以算出公差为d=t−sr−ld=\frac{t-s}{r-l}d=r−lt−s
- 那么a[]a[\ \ ]a[ ]数组中数字的改变为a[i]=a[i]+s+d∗(i−l)(l≤i≤r)a[i]=a[i]+s+d*(i-l) \ \ \ \ \ (l \leq i \leq r)a[i]=a[i]+s+d∗(i−l) (l≤i≤r)
- b[]b[\ \ ]b[ ]数组中数字(b[i]=a[i]−a[i−1]b[i]=a[i]-a[i-1]b[i]=a[i]−a[i−1])的改变为
b[l]=a[l]+s−a[l−1]=b[l]+sb[l]=a[l]+s-a[l-1]=b[l]+sb[l]=a[l]+s−a[l−1]=b[l]+s
b[i]=a[i]+d∗(i−l)−a[i−1]−d∗(i−1−l)=b[i]+d(l+1≤i≤r)b[i]=a[i]+d*(i-l)-a[i-1]-d*(i-1-l) = b[i]+d \ \ \ \ \ \ (l+1\leq i \leq r)b[i]=a[i]+d∗(i−l)−a[i−1]−d∗(i−1−l)=b[i]+d (l+1≤i≤r)
b[r+1]=a[r+1]−(a[r]+t)=b[r+1]−tb[r+1]=a[r+1]-(a[r]+t)=b[r+1]-tb[r+1]=a[r+1]−(a[r]+t)=b[r+1]−t - c[]c[\ \ ]c[ ]数组中数字(c[i]=b[i]−b[i−1]c[i]=b[i]-b[i-1]c[i]=b[i]−b[i−1])的改变为
c[l]=b[l]+s−b[l−1]=c[l]+sc[l]=b[l]+s-b[l-1]=c[l]+sc[l]=b[l]+s−b[l−1]=c[l]+s
c[l+1]=b[l+1]+d−(b[l]+s)=c[l+1]+d−sc[l+1]=b[l+1]+d-(b[l]+s) = c[l+1]+d-sc[l+1]=b[l+1]+d−(b[l]+s)=c[l+1]+d−s
c[i]=(b[i]+d)−(b[i−1]+d)=c[i](l+2≤i≤r)c[i]=(b[i]+d)-(b[i-1]+d)=c[i] \ \ \ \ \ \ \ (l+2\leq i \leq r)c[i]=(b[i]+d)−(b[i−1]+d)=c[i] (l+2≤i≤r)
c[r+1]=(b[r+1]−t)−(b[r]+d)=c[r+1]−t−dc[r+1]=(b[r+1]-t)-(b[r]+d)=c[r+1]-t-dc[r+1]=(b[r+1]−t)−(b[r]+d)=c[r+1]−t−d
c[r+2]=b[r+2]−(b[r+1]−t)=c[r+2]+tc[r+2]=b[r+2]-(b[r+1]-t)=c[r+2]+tc[r+2]=b[r+2]−(b[r+1]−t)=c[r+2]+t - 统计时求两遍前缀和即可。
转自孟神的博客
错因
对于两个提交都是RE,我也是真没谁了。。。。
分析了一波原因,发现可能是因为数组开的太大了,但是又算了一下子数组占的大小的内存发现最多仅有256MB的一半,emmmm。
之后我看了一眼孟神的博客还是把一个超级大的数组改成了两个变量。
这样子,就过掉了!!!!!!!感谢孟神!!!!
code
#include<bits/stdc++.h>
using namespace std;const int nn=1e7+1;
typedef long long ll;int n,m;
ll f[nn];
//ll sum[2][nn];
ll sum1=0,sum2=0;
ll ans,maxx;inline int read()
{int x=0,f=1; char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
}int main()
{n=read(); m=read();for(int i=1;i<=m;++i){int l=read(), r=read();int s=read(), e=read();int d=(e-s)/(r-l);f[l]+=s; f[l+1]+=d-s;f[r+1]+=(-e-d); f[r+2]+=e;}for(int i=1;i<=n;++i){// sum[1][i]=sum[1][i-1]+f[i];
// sum[2][i]=sum[2][i-1]+sum[1][i];
// ans^=sum[2][i];
// maxx=max(maxx,sum[2][i]);
// cout<<maxx<<endl;sum1+=f[i];sum2+=sum1;
// cout<<sum1<<' '<<sum2<<endl;ans^=sum2;maxx=max(maxx,sum2);}printf("%lld %lld",ans,maxx);return 0;
}
任何一件事情,只要心甘情愿,总能够变得简单。
三步必杀(高阶差分系列)相关推荐
- P4231 三步必杀 二次差分
传送门 文章目录 题意: 思路: 题意: 思路: 考虑给[2,6][2,6][2,6]加上s=2,e=10s=2,e=10s=2,e=10的等差数列,变成2,4,6,8,102,4,6,8,102,4 ...
- (差分)洛谷P4231 三步必杀
洛谷P4231 三步必杀 三步必杀 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的 ...
- P4231 三步必杀
P4231 三步必杀 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼族和其他妖怪 ...
- 三步必杀【洛谷P4231】
P4231 三步必杀 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼族和其他妖怪 ...
- 三步必杀(P4231)
(三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼族和其他妖怪们组成的小社会,一片其乐融融的景 ...
- Luogu P4231 三步必杀 (差分)
目录 题目 题解 题目 题目链接 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼 ...
- 软件测试职业发展三步曲之一
软件测试职业发展三步曲之一 --软件测试职业发展方向 作者:叶赫华 天地玄黄,宇宙洪荒:所谓光阴似箭,因为一转眼滚滚的历史车轮就将人类文明推 进了二十一世纪的 ...
- 软件测试职业发展三步曲之一 - 软件测试职业发展方向
天地玄黄,宇宙洪荒:所谓光阴似箭,因为一转眼滚滚的历史车轮就将人类文明推进了二十一世纪的信息时代!葛大爷有对白曰:"二十一世纪最宝贵的是什么?"对曰:"人才!" ...
- 日语零基础入门至初级“三步走”
被日本动漫.日剧深深迷住,但看见似熟非熟的汉字假名却无从下手?!没关系,沪江网校推出日语入门系列班级,要想日语零基础入门你只需要"三步走"!首先,我们来了解看看什么是"三 ...
最新文章
- linux信号处理编程实验报告,Linux编程之信号处理
- php导出excel失败原因,PHPExcel导出Excel文件报找不到该文件错误
- android p wifi一直在扫描_Android再次解读萤石云视频
- csdn 用户 蚂蚁翘大象_用户界面设计师房间里的大象
- 张航、李沐等人提出ResNet最强改进版:性能提高3%,参数不增
- Linux 进程后台运行
- OpenShift 4 - Fedora CoreOS (5) - CoreOS的常规操作
- nginx ---- nginx服务器版本升级和新增模块
- html怎么创建表格,html怎么做表格
- 苹果开发——设置iTunesnbsp;Connec…
- Ubuntu下GPAC(MP4Box)的安装 | 基于MP4Box搭建DASH视频系统
- 栈和队列的应用(迷宫问题)
- 实用分享-在线公式编辑器(可导图识别)
- 2022年“研究生科研素养提升”系列公益讲座在线测评
- 2020.10.22--AI--立体图形制作、矛盾空间图形设计、3D文字
- 什么是STAR原则?
- matlab两轮自平衡小车,(2-3合刊) 基于MEMS惯性传感器的两轮自平衡小车设计
- 课程设计-商店管理系统(四)----数据库的建立
- Highlighting System V4.0(用于模型外发光)
- Paragon2022Tuxera 两款NTFS磁盘读写工具区别
热门文章
- “Navicat Premium”已损坏,无法打开。 您应该将它移到废纸篓。
- CAD图纸文件太大?三种小方法教你如何清理CAD超大文件。
- 关于keep,dont touch和max_fanout的用法建议
- hbase —— Dead Region Servers
- 我的美丽天使(My Fair Angel)入门经典教程(下载 安装 汉化 使用)
- 微信如何用软件测试是否被拉黑,怎么知道微信里对方把自己拉黑或删除了?微信被好友拉黑检测方法...
- [总结自用]关于Mbps、Mb/s、MB/s以及Mpps的区别及计算
- 服务器hdmi如何连接显示器,容易被忽略的HDMI连接显示器的一个重要设置
- HIVE --- Metastore
- python实战篇(五)---百度api实现车型识别