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. Revit二次开发之创建风管

      在Revit中,风管用于连接管件,风道末端和机械设备,今天简单尝试了下使用RevitAPI创建风管,现分享下我的方法.   风管从类型上可分为三类:一般风管,软风管和风管占位符:从形状上也分为三类 ...

  2. Spring的3级缓存和循环引用的理解

    此处是我自己的一个理解,防止以后忘记,如若那个地方理解不对,欢迎指出. 一.背景 在我们写代码的过程中一般会使用 @Autowired 来注入另外的一个对象,但有些时候发生了 循环依赖,但是我们的代码 ...

  3. Linux 30岁,这些年经历了什么?

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 3月19日,Linux基金会在Twitter上发布推文宣布,其小企鹅的标志"Tux& ...

  4. python爬取豆瓣电影Top250(附完整源代码)

    初学爬虫,学习一下三方库的使用以及简单静态网页的分析.就跟着视频写了一个爬取豆瓣Top250排行榜的爬虫. 网页分析 我个人感觉写爬虫最重要的就是分析网页,找到网页的规律,找到自己需要内容所在的地方, ...

  5. 【Hadoop】10、Flume组件

    目录 Flume组件安装配置 1.下载和解压 Flume 2.Flume 组件部署 3.使用 Flume 发送和接受信息 Flume组件安装配置 1.下载和解压 Flume # 传Flume安装包 [ ...

  6. OAuth2密码模式已死,最先进的Spring Cloud认证授权方案在这里

    旧的Spring Security OAuth2停止维护已经有一段时间了,99%的Spring Cloud微服务项目还在使用这些旧的体系,严重青黄不接.很多同学都在寻找新的解决方案,甚至还有念念不忘密 ...

  7. 吊炸天,Spring Security还有这种用法!

    在用Spring Security项目开发中,有时候需要放通某一个接口时,我们需要在配置中把接口地址配置上,这样做有时候显得麻烦,而且不够优雅.我们能不能通过一个注解的方式,在需要放通的接口上加上该注 ...

  8. 好客租房31-事件绑定this指向(bind)

    事件this指向bind 利用ES5中bind方法 将事件处理程序中的this和组件实例绑定在一起 //导入react     import React from 'react'           ...

  9. 记一次生产事故的排查与优化——Java服务假死

    一.现象 在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应.关于该服务的基本功能如下: 1.该服务是一个后台刷新指示器的服务,即该服务会将用户需要的指示器数据提前计算好,放入 ...

  10. 详解SQL操作的窗口函数

    摘要:窗口函数是聚集函数的延伸,是更高级的SQL语言操作,主要用于AP场景下对数据进行一些分析.汇总.排序的功能. 本文分享自华为云社区<GaussDB(DWS) SQL进阶之SQL操作之窗口函 ...