目录

  • 题目
  • 题解

题目

题目链接
题目背景
(三)旧都
离开狭窄的洞穴,眼前豁然开朗。
天空飘着不寻常的雪花。
一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音。
这是由被人们厌恶的鬼族和其他妖怪们组成的小社会,一片其乐融融的景象。
诶,不远处突然出现了一些密密麻麻的小点,好像大颗粒扬尘一样。
离得近了点,终于看清楚了。
长着角的鬼们聚在一起,围观着另一只鬼的表演。
那”扬尘”,其实都是弹幕。
勇仪的招数之一,三步之内,所到之处弹幕云集,几乎没有生存可能。
为了强化这一技能,勇仪将对着一排柱子进行攻击。
旧地狱的柱子虽然无比坚固,但保险起见还是先要了解一下这样一套攻击对柱子有多少损伤,顺带也能检验练习的效果。
勇仪决定和其它鬼们商量商量...
“我知道妖怪之山的河童一族有一种叫做计算机的神奇道具,说不定可以借来用用”,萃香说道。
于是旧地狱的鬼族就决定请河城荷取来帮忙了。
“要记录【所有柱子的损伤程度】吗”,荷取问道。
经过进一步的询问,荷取发现他们仅仅需要【所有攻击都完成后】柱子的损伤程度。
任务了解地差不多了,荷取将其中的重要部分提取了出来,记录在了她的工作笔记本上:
(记录的内容见题目描述)
那么实验就这样开始了。
在惊天动地的碰撞声中,勇仪每完成一轮攻击,荷取都忠实地记录下对每根柱子产生的伤害。而此时勇仪就在旁边等待着记录完成,然后再进行下一轮的攻击。
地面上,天色渐晚。
“不想在这里留到深夜啊,不然就回不了家了”,荷取这样想着,手中依然在重复地向计算机中输入新产生的信息。
“真的必须一次一次地记录下每轮攻击对每个柱子产生的伤害吗?有没有更高效的方法?”这一念头在荷取的心中闪过...
(后续剧情在题解中,接下来请看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个整数NN,MM,用空格隔开,下同。
接下来MM行,每行4个整数ll,rr,ss,ee,含义见题目描述。
数据保证对每个柱子产生的每次伤害值都是整数。
输出格式:
由于输出数据可能过大无法全部输出,为了确保你真的能维护所有柱子的损伤度,只要输出它们的异或和与最大值即可。
(异或和就是所有数字按位异或起来的值)
(异或运算符在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:
没有打到第六根柱子,答案不变
数据范围:
本题满分为100分,下面是4个子任务。(x/y)表示(得分/测试点数量)
妖精级(18/3):\(1\leqslant n1,m\leqslant1000\)。这种工作即使像妖精一样玩玩闹闹也能完成吧?
河童级(10/1):\(s=e\),这可以代替我工作吗?
天狗级(20/4):$1\leqslant n\leqslant10^51\leqslant m \leqslant 10^5 $
鬼神级(52/2):没有特殊限制。要真正开始思考了。
以上四部分数据不相交。
对于全部的数据:\(1\leqslant n\leqslant10^7\)
\(1\leqslant m\leqslant3\times 10^5\)
\(1\leqslant l<r\leqslant n\)
所有输入输出数据以及柱子受损伤程度始终在\([0,9\times 10^{18}]\)
提示:
由于种种原因,时间限制可能会比较紧,C++选手请不要使用cin读入数据。
by orangebird

题解

真神的一道题.从八点肝到九点半,就差一个推一个小式子....无语
分析:
第一部分数据:暴力即可.
CODE

void work1() {ll l,r,s,e;for(ll i = 1;i <= m;++ i) {l = read();r = read();s = read();e = read();ll len = (e - s) / (r - l);//计算公差ll tmp = s;for(ll j = l;j <= r;++ j) {a[j] += tmp;tmp += len;}}ll maxx = 0,sum = 0;for(ll i = 1;i <= n;++ i) {sum = sum xor a[i];maxx = max(maxx,a[i]);}std::cout << sum << ' '<< maxx;
}

第二部分数据:差分
CODE

void work2() {ll l,r,s,e;for(ll i = 1;i <= m;++ i) {l = read();r = read();s = read();e = read();cha[l] += s;cha[r + 1] -= s;}ll last = 0 , sum = 0 , maxx = 0;for(ll i = 1;i <= n;++ i) {last = last + cha[i];sum = sum xor last;maxx = max(maxx, last);}std::cout << sum << ' '<< maxx;
}

第三部分数据.
不会做.......但是一看可用\(O(n * logn)\)的时间复杂度搞过去.
大概是用数据结构维护.
第四部分数据: 数据非常大.而且这个时间复杂的下界是\(O(n)\)的,那么我们如何才能不超时呢.
根据题目,区间加的.能想到的大概就是差分.

首先看一下公差式子:
设公差为\(d\),
如果对\([l,r]\)区间进行操作的话.(这里假设区间大小为6)
那么对于这个区间的增益就是
\(a[l] + s ,a[l + 1] + s + d,a[l + 2] + s + d + d,a[l + 3] + s + d + d + d.......a[l + 4] + e\)
考虑一下用差分怎么差分.
先把a数组去掉
简洁一些.
\(s,s+d,s+d+d,s+d+d+d,s+d+d+d+d,e\)
用差分的形式表现出来.
\(s,d,d,d,d,d,-e\)
显然如果暴力的去加的话,十分耗时间.
那么
中间的
\(d,d,d,d,d\)
实际上就是对\([l+1,r]\)区间加了一个数d
显然这一部分也是可以利用差分处理的.
所以.....这道题做完了..
CODE

void work3() {int l,r,s,e;for(int i = 1;i <= m;++ i) {l = read_int();r = read_int();s = read_int();e = read_int();ll d = Equa(l,r,s,e);cha1[l + 1] += d;cha1[r + 1] -= d;cha2[l] += s;cha2[r + 1] -= e;}for(int i = 1;i <= n;++ i)sum1[i] = sum1[i - 1] + cha1[i];//第一次差分for(int i = 1;i <= n;++ i) cha2[i] = cha2[i] + cha2[i - 1] + sum1[i];//第二次差分ll ans = 0 ;ll maxx = 0 ;for(int i = 1;i <= n;++ i) {ans = ans xor cha2[i];maxx = max(maxx,cha2[i]);}std::cout << ans << ' '<< maxx;
}

所以这道题一句话题解就是:
差分两次后得到答案.

转载于:https://www.cnblogs.com/tpgzy/p/9564697.html

Luogu P4231 三步必杀 (差分)相关推荐

  1. 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 ...

  2. (差分)洛谷P4231 三步必杀

    洛谷P4231 三步必杀 三步必杀 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的 ...

  3. P4231 三步必杀

    P4231 三步必杀 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼族和其他妖怪 ...

  4. 三步必杀【洛谷P4231】

    P4231 三步必杀 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼族和其他妖怪 ...

  5. 三步必杀(P4231)

    (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼族和其他妖怪们组成的小社会,一片其乐融融的景 ...

  6. 三步必杀(高阶差分系列)

    题目链接:(https://www.luogu.org/problemnew/show/P4231 ) 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现 ...

  7. c语言读取cmos的原理,三步读懂CMOS图像传感器的工作原理

    图像传感器是将光信号转换为电信号的装置,在数字电视.可视通信市场中有着广泛的应用.目前应用广泛的主要是CCD(Charge-Coupled Device,电荷耦合器件)与CMOS(Complement ...

  8. 64位游戏找call_《使命召唤16:战区》配置注册登录全攻略,三步让你极迅游戏!...

    如果说谁是2020年最火的游戏,那么<使命召唤16:战区>绝对是排名第一.自从<使命召唤16:战区>发布之后,同时在线人数就不断刷新纪录,一天300万,3天800万 ,到现在已 ...

  9. 三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQL2005版本)

    三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本) 转载原文,并注明出处!虽无多少技术含量,毕竟是作者心血原创,希望理解. 转自 http://blog.csdn.net ...

最新文章

  1. 互联网业务安全之通用安全风险模型
  2. 没有最快,只有更快!富士通74.7秒在ImageNet上训练完ResNet-50
  3. 如何搞30等角视图.斜45度说法不合理
  4. 浅析jQuery原理并仿写封装一个自己的库
  5. python读取txt数据-python读取文本文件数据
  6. 多分类问题中每一类的Precision-Recall Curve曲线以及ROC的Matlab画法
  7. 如何解决java乱码_java如何解决乱码
  8. 电子商务之 网店客服中心服务用语规范
  9. 老鸟程序员才知道的40个小技巧
  10. MATLAB 优化程序【profile简明用法】
  11. php中统一编码语句,统一编码
  12. 惠普企业(HPE)是否免不了最终被关停的命?
  13. 02 Nginx和Keepalived高可用
  14. Vue导出excel文件
  15. Java 如何判定当前时间是否在某个范围
  16. Red5流媒体服务器的搭建
  17. 为什么电脑屏幕会横过来_电脑屏幕横过来了怎么办
  18. Python采集视频数据,下载流媒体m3u8格式
  19. 生命探测仪能穿墙能探废墟 但不能穿透金属(图)
  20. 企业如何制定高效可靠环保企业管理平台解决方案

热门文章

  1. 计算机学院举办 温暖冬日 感恩社会 活动,温暖冬日 感恩社会 计算机学院举办冬季送温暖活动...
  2. 经典面试题-Jdo 是什么
  3. 解决npm public提示403 Forbidden - PUT https://registry.npmjs.org/js-toolkit - You do not have permission
  4. 小程序获取微信运动步数
  5. 数据防泄密软件可以解决哪些安全问题?
  6. eclipse中误删了servers文件的处理方法
  7. QGIS之十三矢量化电子地图并矩形化
  8. 微信小程序开发05 研发加速:使用 Webpack 提升小程序研发效率
  9. android 手机超频降频秘籍
  10. java统计在线人数_java实现在线人数统计