LuoguP3932 浮游大陆的68号岛 题解
Content
在一个无限长的数轴上有 \(n\) 个点。第 \(i\) 个点上面有 \(a_i\) 件物品,且第 \(i\) 个点到第 \(i+1\) 个点的距离为 \(b_i\)。
定义从第 \(i\) 个点上面的 \(x\) 件物品搬到第 \(j\) 个点的花费为 \(x\times\operatorname{dist}(i,j)\),其中 \(\operatorname{dist}(i,j)\) 即表示第 \(i\) 和第 \(j\) 个点的距离。
现在有 \(m\) 次询问,每次询问给定三个正整数 \(x,l,r\),求将所有下标在区间 \([l,r]\) 内的所有点上面的物品全部搬到第 \(x\) 个点的总花费是多少。
答案对 \(\bf 19260817\) 取模。
数据范围:\(1\leqslant n,m\leqslant 2\times 10^5\),\(1\leqslant a_i,b_i\leqslant 2\times 10^9\)。
Solution
首先我们不难写出这样的一个表示答案的式子:
\]
直接进行暴力模拟对于这道题目来说肯定是不可行的,所以我们来想一下如何优化。
首先就是这个 \(\operatorname{dist}(x,i)\)。我们根据定义可以直接推出其用 \(b_i\) 表示的式子:
\]
乍一看这式子貌似还是不太好看,我们不妨根据 \(l,r\) 和 \(x\) 的关系分类讨论以分别对应唯一的 \(\operatorname{dist}(x,i)\) 的值。
这里以 \(r<x\) 为例来具体讲讲。
在这种情况下,所有点上的东西全部往右移。容易发现 \(\forall i\in[l,r],i<x\)。因此我们直接用上面那坨式子的第一种情况化简成:
\]
看到 \(\sum\limits_{j=i}^{x-1}b_j\) 马上想到什么?前缀和优化!
设 \(dis_i=\sum\limits_{j=1}^{i-1}b_j\),不难想到其实际意义就是第 \(i\) 个点到第 \(1\) 个点的距离。然后 \(\sum\limits_{j=i}^{x-1}b_j=\sum\limits_{j=1}^{x-1}b_j-\sum\limits_{j=1}^{i-1}b_j=dis_x-dis_i\)。
于是又可以开始愉快地化简了:
\]
然后,仿照上面的套路,我们设 \(s_i=\sum\limits_{j=1}^ia_j\),\(S_i=\sum\limits_{j=1^i}a_j\cdot dis_j\)。原式子就可以化简成:
\]
然后你再把 \(dis_i,s_i,S_i\) 这三样东西全部都在询问之前先 \(\mathcal O(n)\) 预处理一下,就可以 \(\mathcal O(1)\) 回答每一次询问了。
\(l>x\) 的话,就是所有的东西全部向左移,直接用上面那坨式子的第三种情况化简一下,然后转换成我们设的这三个东西(\(dis_i,s_i,S_i\))即可。
\(l\leqslant x\leqslant r\) 这个情况稍微复杂一些。我们把区间 \([l,r]\) 以 \(x\) 为分界点分开。左边那一部分按照 \(r<x\) 那种情况的处理方式去处理,右边那一部分按照 \(l>x\) 那种情况的处理方式去处理,最后把两个部分的和加起来即可。
这样,本题的思路就呼之欲出了:
- \(\mathcal O(n)\) 预处理出我们上面所提到的 \(dis_i=\sum\limits_{j=1}^{i-1}b_j\),\(s_i=\sum\limits_{j=1}^ia_j\),\(S_i=\sum\limits_{j=1^i}a_j\cdot dis_j\)。
- 每次询问分上述三个情况讨论分别 \(\mathcal O(1)\) 求出答案。
另外,这题目要时时刻刻注意取模的问题。由于频繁取模写一大堆东西太麻烦,我这里直接用函数实现了两数相加取模、两数相减取模和两数相乘取模,这样写起来就方便很多。
虽然但是,我自己写的时候发现最终表示起来也挺复杂的。
Code
为了少考虑些整型溢出的情况,使用了 #define int ll
。
namespace Solution {
#define int ll
const int N = 2e5 + 7, mod = 19260817;
int n, q, x, l, r, dis[N], s1[N], s2[N];
ii Add(int x, int y) {return (x + y) % mod;}
ii Del(int x, int y) {return ((x - y) % mod + mod) % mod;}
ii Mul(int x, int y) {return 1ll * x * y % mod;}
iv Main() {
read(n, q);
F(int, i, 2, n) read(dis[i]), dis[i] %= mod, dis[i] = Add(dis[i], dis[i - 1]);
F(int, i, 1, n) {
int x; read(x), x %= mod;
s1[i] = Add(s1[i - 1], x);
s2[i] = Add(s2[i - 1], Mul(x, dis[i]));
// printf("%d %d\n", s1[i], s2[i]);
}
while(q--) {
read(x, l, r);
if(r < x) println(Del(Mul(dis[x], Del(s1[r], s1[l - 1])), Del(s2[r], s2[l - 1])));
else if(l > x) println(Del(Del(s2[r], s2[l - 1]), Mul(dis[x], Del(s1[r], s1[l - 1]))));
else println(Add(Del(Mul(dis[x], Del(s1[x - 1], s1[l - 1])), Del(s2[x - 1], s2[l - 1])), Del(Del(s2[r], s2[x]), Mul(dis[x], Del(s1[r], s1[x])))));
}
return;
}
#undef int
}
LuoguP3932 浮游大陆的68号岛 题解的更多相关文章
- P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完 ...
- P3932 浮游大陆的68号岛 【线段树】
P3932 浮游大陆的68号岛 有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下 ...
- 线段树 洛谷P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...
- [Luogu3932] 浮游大陆的68号岛
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 浮游大陆的68号岛,位于浮游大陆的边境地带.平时很少有人造访. 岛上被浓厚的森林覆盖. ...
- noip模拟赛 浮游大陆的68号岛
题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂 ...
- [洛谷P3932]浮游大陆的68号岛
题目大意:有一行物品,每两个物品之间有一个距离.每个物品有一个价值.现在问你若干问题,每个问题问你把l~r所有物品全部搬到物品x处需要多少价值. 把物品a搬到物品b处的价值为物品a的价值乘a到b的距离 ...
- 【机器人M号】题解
题目 题目描述 3030年,Macsy正在火星部署一批机器人. 第1秒,他把机器人1号运到了火星,机器人1号可以制造其他的机器人. 第2秒,机器人1号造出了第一个机器人--机器人2号. 第3秒,机器人 ...
- ETO的公开赛T5《猎杀蓝色空间号》题解
这道题别看题面这么长,其实题意很简单 就是让你求从起点开始的最长合法区间 合法的要求有两个:兜圈子和直飞 且这两个条件相互独立 (也就是说兜圈子的末尾不会对下面可能出现的直飞造成影响) 举个例子: 1 ...
- noip2017考前整理(未完)
快考试了,把我以前写过的题回顾一下.Noip2007 树网的核:floyd,推出性质,暴力.Noip2008 笨小猴:模拟Noip2008 火柴棒等式:枚举Noip2008 传纸条:棋盘dpNoip2 ...
随机推荐
- 如何解决 ASP.NET Core 中的依赖问题
依赖性注入是一种技术,它允许我们注入一个特定类的依赖对象,而不是直接创建这些实例. 使用依赖注入的好处显而易见,它通过放松模块间的耦合,来增强系统的可维护性和可测试性. 依赖注入允许我们修改具体实现, ...
- 测试平台系列(82) 解决APScheduler重复执行的问题
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了在线执行R ...
- ound interface org.elasticsearch.common.bytes.BytesReference, but class was expected
es得版本和本地项目不一致.. 配置es版本,现在使用得是5.2得版本,可是 maven上看到 elasticsearch-rest-high-level-client 最低也得6版本.下载安装高版本 ...
- Java二次开发海康SDK-对接门禁机
写在最前 SDK版本:CH-HCNetSDKV6.1.6.45_build20210302_win64 参考文档:海康SDK使用手册_V6.1 对接测试设备型号:DS-K1T671M 设备序列号:E5 ...
- Codeforces 997E - Good Subsegments(线段树维护最小值个数+历史最小值个数之和)
Portal 题意: 给出排列 \(p_1,p_2,p_3,\dots,p_n\),定义一个区间 \([l,r]\) 是好的当且仅当 \(p_l,p_{l+1},p_{l+2},\dots,p_r\) ...
- Comet OJ Contest #13 D
Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...
- nmap相关
nmap -sT IP-sT(全链接扫描),获取目标IP+PORT的状态,其实是发了三个包:SYN,SYN/ACK,ACK,类似于TCP三次握手 状态: open 开放的 closed 关闭的 fil ...
- perl练习——计算点突变
题目来源:http://rosalind.info/problems/hamm/ 一.程序目的:计算序列点突变(Point Mutations) 输入: GAGCCTACTAACGGGAT CATCG ...
- TCP三次握手与Linux的TCP内核参数优化
感谢各位技术大佬的资料分享,这里我把我理解的内容做一个整理 一:TCP的三次握手 1.TCP简述 TCP是一个面向连接的协议,在连接双方发送数据之前,首先需要建立一条连接.TCP建立连接可以简单称为: ...
- 小程序https启用tls1.2
公司的web服务器是iis7,在开发微信小程序的时候,需要启用TLS1.2. 将下面的代码复制到文本,存为reg文档,双击搞定. Windows Registry Editor Version 5.0 ...