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 ...
随机推荐
- 拨开由问题《linux下malloc最大可申请的内存》带来的重重疑云
今天阅读相关书籍的时候看到 "进程中堆的最大申请数量" 这一问题,我们知道使用malloc分配内存是在堆Heap里面分配的,如果一台机器一共有8GB物理内存,空闲5GB,那么我们使 ...
- 安装maven配置maven环境变量
在官网下载maven的包 我们下载的是:apache-maven-3.5.2-bin.zip 3.解压缩maven的包到某个目录中 4.配置maven的环境变量 配置M2_HOME环境变量为maven ...
- 解决ip和域名都能够ping通但是启动nginx无法访问网页的问题
解决思路 最近双11逛西部数码的官网看看有没有什么服务器优惠的时候,发现了可以申请一个一块钱用一整年的SSL证书,立马心动下单了,想想俺也可以用https装装X了哈哈 不过在部署完证书,并调整ngin ...
- CF1578I Interactive Rays:ICPC WF Moscow Invitational Contest I 题解
题意简述:在平面上有一个坐标 \((x_c,y_c)\) 和半径 \(r\) 都是整数的圆 \((1\leq r_c\leq \sqrt{x_c^2+y_c^2}-1)\),你可以询问不超过 \(60 ...
- Perl调用和管理外部文件中的变量(如软件和数据库配置文件)
编写流程时,有一个好的习惯是将流程需要调用的软件.数据库等信息与脚本进行分离,这样可以统一管理流程的软件和数据库等信息,当它们路径改变或者升级的时候管理起来就很方便,而不需要去脚本中一个个寻找再修改. ...
- 63. Binary Tree Level Order Traversal II
Binary Tree Level Order Traversal II My Submissions QuestionEditorial Solution Total Accepted: 79742 ...
- NAT 工作原理
网络地址转换,就是替换IP报文头部的地址信息.NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力 规定了三个保留地址段落:10.0.0 ...
- Linux—linux 查看一个文件有多少M
ls -l --block-size=M #就把目录下的所有文件按M单位呈现
- 用原生CSS编写动态字体
HTML部分: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- Yarn【架构、原理、多队列配置】
目录 一.什么是yarn 二.yarn的基本架构和角色 三.yarn的工作机制 四.任务提交流程 五.资源调度器 FIFO 容量调度器 公平调度器 六.容量调度器多队列提交案例实操 1.案例:配置de ...