P4231 三步必杀
题目描述
问题摘要:
N个柱子排成一排,一开始每个柱子损伤度为0。
接下来勇仪会进行M次攻击,每次攻击可以用4个参数l,r,s,e来描述:
表示这次攻击作用范围为第l个到第r个之间所有的柱子(包含l,r),对第一个柱子的伤害为s,对最后一个柱子的伤害为e。
攻击产生的伤害值是一个等差数列。若l=1l,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:
没有打到第六根柱子,答案不变
看到要加等差数列,我们很自然的会想到差分。
数据范围:
本题满分为100分,下面是4个子任务。(x/y)表示(得分/测试点数量)
妖精级(18/3):1⩽n,m⩽1000。这种工作即使像妖精一样玩玩闹闹也能完成吧?
河童级(10/1):s=e,这可以代替我工作吗?
天狗级(20/4):1⩽n⩽10^5,1⩽m⩽10^5。小打小闹不再可行了呢。
鬼神级(52/2):没有特殊限制。要真正开始思考了。
以上四部分数据不相交。
对于全部的数据:1⩽n⩽10^7,1⩽m⩽3×10^5,1⩽l<r⩽n.
所有输入输出数据以及柱子受损伤程度始终在[0,9×10^18]范围内。
分析
我们手玩一下样例,对等差数列进行差分,会得到一个这样的数列
2,2,2,2,2,-10
发现我们还要每次都遍历一遍,给差分数组加上,这样复杂度会很高。
我们考虑对差分数组在进行一遍差分,就会变成
2 0 0 0 0 ,-12,12
这样你就会发现,我们只要给四个位置加上就行了。
分别是 dd[l] ,dd[l+1],dd[r+1],dd[r+2](dd为对差分数组进行差分之后的结果)
设等差数列的公差为t,首项为st,尾项为en
那么 dd[l] += st; dd[l+1] += t-st; dd[r+1] -= en+t; dd[e+2] += en+t;
之后我们对dd数组求一下前缀和,就可以得到差分数组。
在对差分数组求一下前缀和,就是改变后的序列.
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,l,r,st,en,t;
long long ans,maxn,d[10000010],sum[10000010],a[10000010];
inline int read()
{
int s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){s = s * 10+ch -'0'; ch = getchar();}
return s * w;
}
int main()
{
n = read(); m = read();
for(int i = 1; i <= m; i++)
{
l = read(); r = read(); st = read(); en = read();
t = (en - st) / (r-l);//t是等差数列的公差
d[l] += st;//上面的柿子
d[l+1] += t-st;
d[r+1] -= en+t;
d[r+2] += en;//d是对差分数组差分得到的结果
}
for(int i = 1; i <= n; i++)
{
a[i] = a[i-1] + d[i];//a为差分数组
sum[i] = sum[i-1] + a[i];//sum为改变之后的序列
ans ^= sum[i];
maxn = max(maxn,sum[i]);
}
printf("%lld %lld\n",ans,maxn);
return 0;
}
ENDING
P4231 三步必杀的更多相关文章
- Luogu P4231 三步必杀 (差分)
目录 题目 题解 题目 题目链接 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼 ...
- 【luogu P4231 三步必杀】 题解
题目链接:https://www.luogu.org/problemnew/show/P4231 诶 我很迷啊..这跟树状数组有什么关系啊...拿二阶差分数组过了..? #include <cs ...
- 【Luogu】P4231三步必杀(差分,差分)
题目链接 郑重宣布我以后真的再也不会信样例了,三种写法都能过 另:谁评的蓝题难度qwq 蓝题有这么恐怖吗 两次差分,第一次差分,前缀和求出增量数组,第二次求出原数组顺便更新答案 看题解之后……第二次差 ...
- luogu P4231 三步必杀
嘟嘟嘟 这道题就是区间加一个等差数列,然后最后求每一个数的值. O(n)做法:二阶差分. 其实就是差分两遍.举个例子 0 0 0 0 0 0 0,变成了 0 2 4 6 8 0 0.第一遍差分:0 2 ...
- 洛谷P4231 三步必杀
题目描述: $N$ 个柱子排成一排,一开始每个柱子损伤度为0. 接下来勇仪会进行$M$ 次攻击,每次攻击可以用4个参数$l$ ,$r$ ,$s$ ,$e$ 来描述: 表示这次攻击作用范围为第$l$ 个 ...
- luoguP4231_三步必杀_差分
luoguP4231_三步必杀_差分 题意:N 个柱子排成一排,一开始每个柱子损伤度为0.接下来勇仪会进行M 次攻击,每次攻击可以用4个参数l,r ,s ,e 来描述: 表示这次攻击作用范围为第l个到 ...
- [Luogu]三步必杀
Description Luogu4231 Solution 我最近到底怎么了,这种题都做不出来了,一看题第一反应李超线段树(虽然不会),觉得不可做,看一眼题解才发现这个题可以差分,然后差分还打错了好 ...
- Membership三步曲之进阶篇 - 深入剖析Provider Model
Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
随机推荐
- 关于js重名方法的先后调用问题
当js中方法重名时,最后引入的js会覆盖前面的引入的js(就是说会调用最后引入的js中的方法)详情参照(main.js与white.js 的a())但是,当最后一个js中存在语法上的错误时(也可以是本 ...
- 设计模式(多个if的处理)
使用场景 如果在代码中出现大量if判断,再执行一些比较复杂的业务操作,类似于以下情况. @Test void test() { String str = "A"; if (str. ...
- 用 Spring Boot 和 MybatisPlus 快速构建项目
自动生成 public class MPGenerator { public static void main(String[] args) { AutoGenerator autoGenerator ...
- 下拉列表被flash覆盖的解决方法
做鼎闻有一段时间了,有的banner轮播图的地方用flash替换的时候,就会导致上面的导航条下拉列表被flash覆盖,找了一段时间没有得到有效的解决方法,后来知道关键是flash的这一属性{ &quo ...
- Avtiviti工作流规范 BPM与BPMN
进过长时间的轮转,重拾Activiti,因为最近在智联上看到多家公司的需求上写的,都要熟悉工作流引擎,也就是activiti所以重拾 之前看的视屏是activiti5,我觉得版本有点低,所以打算看一下 ...
- stackoverflow的ret2syscall利用
ret2syscall 系统调用 ret2syscall,即控制程序执行系统调用,获取shell.Linux将内核功能接口制作为系统调用(system call),可在程序中直接调用.程序中存在int ...
- 哪些方法可以绕过PowerShell Execution Policy?
哪些方法可以绕过PowerShell Execution Policy? 转: https://blog.csdn.net/qq_27446553/article/details/50577296
- python 模块安装导入
一.定义 python模块就是一个.py文件,一个模块中可以有多个函数,在使用模块时,只需要import下,就可以使用模块中的函数功能.import模块的过程相当于把这个py文件中的所有内容都执行一遍 ...
- 蓝奏网盘CMD控制台
LanZouCloud-CMD 2.0 基于蓝奏云API开发的CMD版蓝奏云控制台 Github : https://github.com/zaxtyson/LanZouCloud-CMD 更新说明 ...
- Druid连接池配置全攻略
Druid是阿里开源出来的数据库连接池,性能非常好,还自带日志监控. 它的DataSource类为:com.alibaba.druid.pool.DruidDataSource. 由于使用的yaml格 ...