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. YOLO系列梳理(三)YOLOv5

    ​  前言 YOLOv5 是在 YOLOv4 出来之后没多久就横空出世了.今天笔者介绍一下 YOLOv5 的相关知识.目前 YOLOv5 发布了新的版本,6.0版本.在这里,YOLOv5 也在5.0基 ...

  2. ThreadLocal的原理及产生的问题

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. ThreadLocal的原理 特点 ThreadLocal和Sychro ...

  3. ABP应用开发(Step by Step)-上篇

    本文主要通过逐步构建一个CRUD示例程序来介绍 ABP 框架的基础知识.它涉及到应用开发的多个方面.在本章结束时,您将了解ABP 框架的基本开发方式.建议入门人员学习,老手不要浪费您宝贵时间.  创建 ...

  4. Django视图函数:CBV与FBV (ps:补充装饰器)

    CBV 基于类的视图  FBV 基于函数的视图 CBV: 1 项目目录下: 2 urlpatterns = [ 3 path('login1/',views.Login.as_view()) #.as ...

  5. 1.11 Linux的主要应用领域有哪些?

    与Windows操作系统软件一样,Linux 也是一个操作系统软件.但与Windows不同的是,Linux是一套开放源代码程序的,并可以自由传播的类UNIX操作系统软件,随着信息技术的更新变化,Lin ...

  6. API 工程化分享

    概要 本文是学习B站毛剑老师的<API 工程化分享>的学习笔记,分享了 gRPC 中的 Proto 管理方式,Proto 分仓源码方式,Proto 独立同步方式,Proto git sub ...

  7. Spark在Local环境下的使用

    ①    将 spark-3.0.0-bin-hadoop3.2.tgz 文件上传到 Linux (cd /opt/module路径下)并解压缩 ②    修改spark-3.0.0-bin-hado ...

  8. Java开发学习(一)----初识Spring及其核心概念

    一. Spring系统架构 1.1 系统架构图 Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基. Spring Framework的发展也经历了很多版本的变更,每 ...

  9. 拭目以待!JNPF .NET将更新.NET 6技术,同时上线 3.4.1 版本

    2022年5月30日,福建引迈即将上线JNPF开发平台的.NET 6版本,在产品性能上做了深度优化,且极大的提升了工作效率,加强了对云服务的改进升级,全面提升用户的使用体验. JNPF是一个以PaaS ...

  10. 从零开始学YC-Framework之鉴权

    一.YC-Framework鉴权是基于哪一个开源框架做的? YC-Framework鉴权主要基于Dromara开源社区组织下的Sa-Token. 1.什么是Sa-Token? Sa-Token是一个轻 ...