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

首先我们不难写出这样的一个表示答案的式子:

\[\sum\limits_{i=l}^r a_i\times\operatorname{dist}(x,i)
\]

直接进行暴力模拟对于这道题目来说肯定是不可行的,所以我们来想一下如何优化。

首先就是这个 \(\operatorname{dist}(x,i)\)。我们根据定义可以直接推出其用 \(b_i\) 表示的式子:

\[\operatorname{dist}(x,i)=\begin{cases}\sum\limits_{j=i}^{x-1}b_j&i<x\\0&i=x\\\sum\limits_{j=x}^{i-1}b_j&\text{otherwise.}\end{cases}
\]

乍一看这式子貌似还是不太好看,我们不妨根据 \(l,r\) 和 \(x\) 的关系分类讨论以分别对应唯一的 \(\operatorname{dist}(x,i)\) 的值。

这里以 \(r<x\) 为例来具体讲讲。

在这种情况下,所有点上的东西全部往右移。容易发现 \(\forall i\in[l,r],i<x\)。因此我们直接用上面那坨式子的第一种情况化简成:

\[\sum\limits_{i=l}^r(a_i\times\sum\limits_{j=i}^{x-1}b_j)
\]

看到 \(\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\)。

于是又可以开始愉快地化简了:

\[\begin{aligned}&\sum\limits_{i=l}^ra_i\times(dis_x-dis_i)\\=&\sum\limits_{i=l}^ra_i\cdot dis_x-\sum\limits_{i=l}^ra_i\cdot dis_i\\=&dis_x\cdot\sum\limits_{i=l}^ra_i-\sum\limits_{i=l}^ra_i\cdot dis_i\end{aligned}
\]

然后,仿照上面的套路,我们设 \(s_i=\sum\limits_{j=1}^ia_j\),\(S_i=\sum\limits_{j=1^i}a_j\cdot dis_j\)。原式子就可以化简成:

\[dis_x\cdot (s_r-s_{l-1})-(S_r-S_{l-1})
\]

然后你再把 \(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号岛 题解的更多相关文章

  1. P3932 浮游大陆的68号岛

    P3932 浮游大陆的68号岛 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完 ...

  2. P3932 浮游大陆的68号岛 【线段树】

    P3932 浮游大陆的68号岛 有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下 ...

  3. 线段树 洛谷P3932 浮游大陆的68号岛

    P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...

  4. [Luogu3932] 浮游大陆的68号岛

    题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 浮游大陆的68号岛,位于浮游大陆的边境地带.平时很少有人造访. 岛上被浓厚的森林覆盖. ...

  5. noip模拟赛 浮游大陆的68号岛

    题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂 ...

  6. [洛谷P3932]浮游大陆的68号岛

    题目大意:有一行物品,每两个物品之间有一个距离.每个物品有一个价值.现在问你若干问题,每个问题问你把l~r所有物品全部搬到物品x处需要多少价值. 把物品a搬到物品b处的价值为物品a的价值乘a到b的距离 ...

  7. 【机器人M号】题解

    题目 题目描述 3030年,Macsy正在火星部署一批机器人. 第1秒,他把机器人1号运到了火星,机器人1号可以制造其他的机器人. 第2秒,机器人1号造出了第一个机器人--机器人2号. 第3秒,机器人 ...

  8. ETO的公开赛T5《猎杀蓝色空间号》题解

    这道题别看题面这么长,其实题意很简单 就是让你求从起点开始的最长合法区间 合法的要求有两个:兜圈子和直飞 且这两个条件相互独立 (也就是说兜圈子的末尾不会对下面可能出现的直飞造成影响) 举个例子: 1 ...

  9. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下.Noip2007 树网的核:floyd,推出性质,暴力.Noip2008 笨小猴:模拟Noip2008 火柴棒等式:枚举Noip2008 传纸条:棋盘dpNoip2 ...

随机推荐

  1. mysql注入绕过information_schema过滤

    1.利用mysql5.7新增的sys.schema_auto_increment_columns 这是sys数据库下的一个视图,基础数据来自与information_schema,他的作用是对表的自增 ...

  2. 第08章 MySQL聚合函数

    第08章 MySQL聚合函数 我们上一章讲到了 SQL 单行函数.实际上 SQL 函数还有一类,叫做聚合(或聚集.分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值. 1 ...

  3. Vue 中使用 TypeScript axios 使用方式

    Vue 中使用 TypeScript axios 使用方式 方式一 import axios from 'axios'; Vue.prototype.$axios = axios; // 在 .vue ...

  4. 集群SGE作业调度系统

    目录 0. 一些基本概念 1. 常见的几种资源管理和调度系统 2. SGE常见指令 2.1 提交任务 2.2 查看任务 2.3 删除任务 2.4 挂起/恢复任务 2.5 更改任务属性 0. 一些基本概 ...

  5. GWAS初探

    原理 GWAS 的主要方法学依据是归纳法中的共变法,是探究复杂因果关系最主要的科学思维和方法.所谓共变法,是通过考察被研究现象发生变化的若干场合中,确定是否只有一个情况发生相应变化,如果是,那么这个发 ...

  6. C语言 文本字符串存入二维数组

    字符串存入数组 文本内容: line1_1 line1_2line2_1 line2_2line3_1 line3_2line4_1 line4_2line5_1 line5_2line6_1 lin ...

  7. tcp可靠传输的机制有哪些(面试必看

    一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层 ...

  8. git的使用理解(分支合并的使用理解,多人编程的解决方案)

    本文主要记录了对git日常使用的一些理解,主要是对git分支的一些感悟. git强大的版本控制系统,之前也使用过SVN,感觉上git对于多人开发的版本控制更加强大,特别是最近对git分支的使用,更是深 ...

  9. 8.深入TiDB:解析Hash Join实现原理

    本文基于 TiDB release-5.1进行分析,需要用到 Go 1.16以后的版本 我的博客地址:https://www.luozhiyun.com/archives/631 所谓 Hash Jo ...

  10. UE4类型数据自动注册

    Version:4.26.2 UE4 C++工程名:MyProject 在<宏GENERATED_BODY做了什么?>中,简单分析了GENERATED_BODY宏给一个简单的.继承自UOb ...