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. 网站每日UV数据指标去重统计

    package com.iexecloud.cloud.casemanager;import redis.clients.jedis.Jedis;import java.text.SimpleDate ...

  2. Jenkins快速上手安装

    目录 环境准备 - JDK 安装 1. APT 安装 2. WAR包方式运行 3.Docker 方式运行 Jenkins 是一个独立的开源自动化服务器,可以用来自动化与构建.测试.交付或部署软件相关的 ...

  3. 既生瑜何生亮 access_token VS refresh_token

    中国有句老话, 既生瑜何生亮, 既然有我周瑜在世, 为什么老天还要一个诸葛亮啊? 同样的, 众所周知, 在 OAuth 2.0 授权协议中, 也有两个令牌 token , 分别是 access_tok ...

  4. JOI 2020 Final 题解

    T1. 只不过是长的领带 大水题,把 \(a_i,b_i\) 从小到大排序. 发现最优方案只可能是大的 \(a_i\) 跟大的 \(b_i\) 匹配,小的 \(a_i\) 与小的 \(b_i\) 匹配 ...

  5. Sums gym100753M

    Sums gym100753M 同余最短路模板,然而这个东西貌似也可以做去年D1T2 首先我们选择一个模数作为基准,然后剩下的这样连边: 对于一个面值为 x 的硬币 ,当前在 u 这个点(感性理解一下 ...

  6. 关于 KB/KiB、MB/MiB

    ermmm--怎么说呢,这个非常容易搞混,那就写篇 blog 澄清一下吧-- 首先贴上百度百科的官方定义 根据国际单位制标准,1KB = 1000B(字节, Byte). 根据按照 IEC 命名标准 ...

  7. 洛谷 P4709 - 信息传递(置换+dp)

    题面传送门 一道挺有意思的题罢-- 首先看到这种与置换乘法相关的题,首先把这些置换拆成一个个置换环,假设输入的置换有 \(m\) 个置换环,大小分别为 \(s_1,s_2,\cdots,s_m\),显 ...

  8. Linux关机/重启/用户切换/注销

    目录 1. 关机/重启命令 2. 用户切换/注销 2.1 基本说明 2.2 切换用户 2.3 注销用户 1. 关机/重启命令 # shutdown命令 shutdown -h now # 立即关机 s ...

  9. linux 常用查看命令

    linux 常用查看命令 目录 linux 常用查看命令 linux 查看内存/进程-ps/top linux 查看磁盘存储-df linux 查看io读写-iotop linux 查看端口占用-ne ...

  10. Scala(三)【函数式编程】

    目录 一.方法和函数 1.方法 1)基本语法 2)简化原则 3)方法参数 2.函数 3.方法和函数的区别 二.高阶函数 三.匿名函数 四.柯里化 五.闭包 一.方法和函数 1.方法 1)基本语法 de ...