NC14683 储物点的距离

题目

题目描述

一个数轴,每一个储物点会有一些东西,同时它们之间存在距离。

每次给个区间 \([l,r]\) ,查询把这个区间内所有储物点的东西运到另外一个储物点的代价是多少?

比如储物点 \(i\) 有 \(x\) 个东西,要运到储物点 \(j\) ,代价为 \(x \cdot dist( i , j )\)

\(dist\) 就是储物点间的距离。

输入描述

第一行两个数表示 \(n\) , \(m\)第二行 \(n-1\) 个数,第i个数表示第 \(i\) 个储物点与第 \(i+1\) 个储物点的距离 \(a_i\) 第三行 \(n\) 个数,表示每个储物点的东西个数 \(b_i\) 之后 \(m\) 行每行三个数 \(x\) , \(l\) , \(r\)。

表示查询要把区间 \([l,r]\) 储物点的物品全部运到储物点 \(x\) 的花费

每次查询独立

输出描述

对于每个询问输出一个数表示答案

答案对 \(1000000007\) 取模

示例1

输入

5 5
2 3 4 5
1 2 3 4 5
1 1 5
3 1 5
2 3 3
3 3 3
1 5 5

输出

125
72
9
0
70

备注

对于\(100\%\) 的数据\(n , m \leq 200000\) , \(0 \leq a_i,b_i \leq 2000000000\) 。

题解

思路

知识点:前缀和。

考虑三种情况 \(x \geq r\) , \(x \leq l\) , \(l < x < r\) 的花费 \(P_{l,r}\) 。

\(dist\) 的性质:\(dist(i,j) = dist(1,j)-dist(1,i)\)

  1. \(x \geq r\)

    \[P_{l,r} = \sum_{i=l}^{r} b_i \cdot dist(x,i) = \sum_{i=l}^r b_i \cdot (dist(1,x) - dist(1,i)) = dist(1,x) \sum_{i=l}^r b_i - \sum_{i=l}^r b_i \cdot dist(1,i)
    \]
  2. \(x \leq l\)

    \[P_{l,r} = \sum_{i=l}^{r} b_i \cdot dist(x,i) = \sum_{i=l}^r b_i \cdot (dist(1,i) - dist(1,x)) = \sum_{i=l}^r b_i \cdot dist(1,i) - dist(1,x) \sum_{i=l}^r b_i
    \]
  3. \(l \leq x \leq r\)

    \[\begin{aligned}
    P_{l,r} &= \sum_{i=l}^{r} b_i \cdot dist(x,i)\\
    &= \sum_{i=l}^x b_i \cdot (dist(1,x) - dist(1,i)) + \sum_{i=x+1}^r b_i \cdot (dist(1,i) - dist(1,x))\\
    &= dist(1,x) \sum_{i=l}^x b_i - \sum_{i=l}^x b_i \cdot dist(1,i) + \sum_{i=x+1}^r b_i \cdot dist(1,i) - dist(1,x) \sum_{i=x+1}^r b_i
    \end{aligned}
    \]

我们发现其中反复用到 \(dist(1,i)\) , \(\sum_{i=a}^b b_i\),\(\sum_{i=a}^b b_i \cdot dist(1,i)\)。

\(dist(1,i)\) 可以用 \(a_i\) 前缀和维护;\(\sum_{i=a}^b b_i\) 可以用 \(b_i\) 前缀和维护;\(\sum_{i=a}^b b_i \cdot dist(1,i)\) 可以在 \(a_i\) 前缀和的基础上在计算 \(b_i\) 前缀和的过程维护。

时间复杂度 \(O(n+m)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

const int mod = 1000000007;

long long a[200007],b[200007],ab[200007];

int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
for(int i = 2;i<=n;i++){
cin>>a[i];
a[i] = (a[i] + a[i-1])%mod;
}
for(int i = 1;i<=n;i++){
cin>>b[i];
ab[i] = (ab[i-1]+(a[i]%mod*b[i]%mod)%mod)%mod;
b[i] = (b[i] + b[i-1])%mod;
}
for(int i = 0;i<m;i++){
int x,l,r;
cin>>x>>l>>r;
if(x<=l){
cout<<(
(ab[r]-ab[l-1]+mod)%mod
- (b[r]-b[l-1]+mod)%mod*a[x]%mod%mod
+ mod
)%mod
<<'\n';
}
else if(x>=r){
cout<<(
(b[r]-b[l-1]+mod)%mod*a[x]%mod%mod
- (ab[r]-ab[l-1]+mod)%mod
+ mod
)%mod
<<'\n';
}
else{
cout<<(
(ab[r]-ab[x-1]+mod)%mod
- (b[r]-b[x-1]+mod)%mod*a[x]%mod%mod
+ (b[x]-b[l-1]+mod)%mod*a[x]%mod%mod
- (ab[x]-ab[l-1]+mod)%mod
+ 2*mod
)%mod
<<'\n';
}
}
return 0;
}

NC14683 储物点的距离的更多相关文章

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

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

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

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

  3. OJ题解记录计划

    容错声明: ①题目选自https://acm.ecnu.edu.cn/,不再检查题目删改情况 ②所有代码仅代表个人AC提交,不保证解法无误 E0001  A+B Problem First AC: 2 ...

  4. iOS之计算上次日期距离现在多久, 如 xx 小时前、xx 分钟前等

    /**  *  计算上次日期距离现在多久  *  *  @param lastTime    上次日期(需要和格式对应)  *  @param format1     上次日期格式  *  @para ...

  5. 挑子学习笔记:对数似然距离(Log-Likelihood Distance)

    转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/log-likelihood_distance.html 本文是“挑子”在学习对数似然距离过程中的笔记摘录,文 ...

  6. 字符串编辑距离(Levenshtein距离)算法

    基本介绍 Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric).我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个 ...

  7. [LeetCode] Rearrange String k Distance Apart 按距离为k隔离重排字符串

    Given a non-empty string str and an integer k, rearrange the string such that the same characters ar ...

  8. [LeetCode] Shortest Word Distance III 最短单词距离之三

    This is a follow up of Shortest Word Distance. The only difference is now word1 could be the same as ...

  9. [LeetCode] Shortest Word Distance II 最短单词距离之二

    This is a follow up of Shortest Word Distance. The only difference is now you are given the list of ...

随机推荐

  1. 你能知道的或者不知道的shell变量都在这里

    第2章 shell变量讲解 2.1 shell中的变量讲解 2.1.1 什么是shell变量 变量的本质就是内存中的一块区域 变量名 位置 变量是脚本中经常会使用的内容信息 变量可以在脚本中直接使用 ...

  2. @Transactional的使用与失效

    @Transactinonal 注解在方法抛出RuntimeException类及其子类时.Error类及其子类时会回滚当前事务,使sql不提交: 只能作用于public的方法:写在类上时,代表给该类 ...

  3. XCTF练习题---MISC---Training-Stegano-1

    XCTF练习题---MISC---Training-Stegano-1 flag:steganoI 解题步骤: 1.观察题目,下载附件 2.打开下载的图片文件,发现就是一个点,修改文件扩展名,还是说查 ...

  4. MySQL常用数据类型及细节

    目录 1 整数类型 1.1 可选属性 1.1.1 M 1.1.2 UNSIGNED 1.1.3 ZEROFILL 2 浮点类型 2.1 精度误差 3 定点数类型 3.1 数据精度说明 3.2 类型介绍 ...

  5. ucore lab1 操作系统启动过程 学习笔记

    开头赞美THU给我们提供了这么棒的资源.难是真的难,好也是真的好.这种广查资料,反复推敲,反复思考从通电后第一条代码搞起来理顺一个操作系统源码的感觉是真的爽. 1. 操作系统镜像文件ucore.img ...

  6. Linux强制用户首次登录修改密码

    一个执着于技术的公众号 地方 前言 Linux强制用户首次登陆修改密码,这应该是RHCE认证中用户管理部分, 属于很基础的内容了.可是我忘记了,所以就有了下面的记录~ 实验过程 1.创建用户并设置登录 ...

  7. spring 拦截器流程 HandlerInterceptor AsyncHandlerInterceptor HandlerInterceptorAdapter

    HandlerInterceptor源码 3种方法: preHandle:拦截于请求刚进入时,进行判断,需要boolean返回值,如果返回true将继续执行,如果返回false,将不进行执行.一般用于 ...

  8. 1 Mybatis动态SQL

    Mybatis动态SQL 1. 注解开发 ​ 我们也可以使用注解的形式来进行开发,用注解来替换掉xml. 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从 ...

  9. 弃用!Github 上用了 Git.io 缩址服务的都注意了

    GitHub 是面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub.对程序员来说,GitHub 可以说是开源精神之所系.在 GitHub 任何职业程 ...

  10. extcon驱动及其在USB驱动中的应用

    extcon,是External Connector的简称,用于抽象外部连接器,比如说Audio Jack.USB MicroB/TypeC接口等.它的原型是Android的switch-class驱 ...