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. 安全开发运维必备,如何进行Nginx代理Web服务器性能优化与安全加固配置,看这篇指南就够了

    本章目录 1.引言 1.1 目的 1.2 目标范围 1.3 读者对象 2.参考说明 2.1 帮助参考 2.2 参数说明 3.3 模块说明 3.服务优化 3.1 系统内核 3.2 编译优化 3.3 性能 ...

  2. 2021.08.09 P5658 括号树(树形结构)

    2021.08.09 P5658 括号树(树形结构) [P5658 CSP-S2019] 括号树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 太长,在链接中. 分析及代码 ...

  3. 2021.07.23 P3275 糖果(差分约束)

    2021.07.23 P3275 糖果(差分约束) [P3275 SCOI2011]糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.为了满足更多更多约束条件,合适地 ...

  4. JMeter如何设置中文

    打开Option => Choose Language => Chinese

  5. 通过代码解释什么是API,什么是SDK?

    这个问题说来惭愧,读书时找实习面的第一家公司,问的第一个问题就是这个. 当时我没能说清楚,回去之后就上百度查.结果查了很久还是看不懂,然后就把这个问题搁置了. 谁知道毕业正式工作后,又再一次地面对了这 ...

  6. Linux 常见必备

    一.学习Linux须知常识 1.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应用程序,比 ...

  7. RestFul和控制器

    RestFul和控制器 控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中 ...

  8. Nginx代理websocket为什么要这样做?

    Nginx反向代理websocket 示例: http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } s ...

  9. 技术管理进阶——技术Leader如何拒绝业务方?

    原创不易,求分享.求一键三连 前段时间,有个粉丝在群里问了一个问题: 今天对接一个业务团队,要我帮他导数据,这种工作又臭又烦又没成长,而且边界模糊谁做都可以,我很想拒绝他,但又怕引起对方不满,大家有什 ...

  10. 解决 js aysnc await try-catch 地狱