链接:

文章目录

  • 题目描述
  • 题解:
  • 代码:
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

一个数轴,每一个储物点会有一些东西,同时它们之间存在距离。
每次给个区间[l,r],查询把这个区间内所有储物点的东西运到另外一个储物点的代价是多少? 比如储物点i有x个东西,要运到储物点j,代价为x* dist( i , j ) dist就是储物点间的距离。

输入描述:

第一行两个数表示n,m

第二行n-1个数,第i个数表示第i个储物点与第i+1个储物点的距离ai

第三行n个数,表示每个储物点的东西个数bi

之后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 <= 200000 , 0 <= ai,bi <= 2000000000

题解:

先要意识到给的距离是两个相邻的储物点的距离,我们可以据此先维护一个距离的前缀和,这样我们就可以求任意两点之间的距离。
同理,每个储物点都是存有物品的,也用前缀和来维护,这就可以求出某个区间内物品的总数量。
我们还需要用一个数组c来记录,给定区间[l,r]内所有商品距离1号仓库的总和,c[i]=c[i-1]+a[i]*b[i],
a,b,c分别代表上面三个的前缀和
有什么用呢?接着往下看

如果所给x在[l,r]的右边,也就是x>=r,当x从i变为i+1,相当于整个区间内的物品都多移动了一段距离,长度为len(i,i+1),那我们就可从i点答案的基础上直接改,从答案基础上加上[l,r]的物品数量 * len(i,i+1),也就是 ( b [ r ] - b [ l - 1 ] ) * ( a [ x ] ) - ( c [ r ] - c[ l - 1 ] )
怎么理解:[l,r]这个区间内所有物品全部从起始点移动到x点,[1,l-1]这一块是多移动了,比如看l点,从1 ~ l 再从l ~ x ,其中1~l是多移动的部分,就要剪除,l点物品总量*所有物品移动到点1的距离,这不正是我们求得c,所以减去( c [ r ] - c[ l - 1 ] )

如果x在[l,r]的左侧,也就是x<=r,当x从i变为i+1,就是和上面反过来,少移动了一段距离,距离为len(i,i+1),答案就是( c [ r ] - c[ l - 1 ] ) - ( b [ r ] - b [ l - 1 ] ) * ( a [ x ] )

如果x在[l,r]中间,你就把[l,r]分成两个区域,然后[l.x]与[x+1,r]用上面的方法对待
对了,别忘了取模

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const ll mod=1e9+7;ll a[maxn],b[maxn],c[maxn];
ll getr(ll x,ll l,ll r)//当x在右边
{ll ans=(((b[r]-b[l-1])*a[x]%mod-((c[r]-c[l-1])%mod+mod)%mod)%mod+mod)%mod;return ans;
}
ll getl(ll x,ll l,ll r)//x在左边
{ll ans=(((c[r]-c[l-1])%mod+mod)%mod-((b[r]-b[l-1])*a[x]%mod)%mod+mod)%mod;return ans;
}
ll x,l,r;
ll sum;
int main()
{int n,m;cin>>n>>m;for(int i=2;i<=n;i++){cin>>a[i];a[i]=(a[i-1]+a[i])%mod;}for(int i=1;i<=n;i++){cin>>b[i];c[i]=(c[i-1]+a[i]*b[i]%mod)%mod;b[i]=(b[i]+b[i-1])%mod;}while(m--){sum=0;cin>>x>>l>>r;if(r<=x){sum=getr(x,l,r);}else if(l>=x){sum=getl(x,l,r);}else {sum+=getr(x,l,x)+getl(x,x+1,r);}printf("%lld\n",sum%mod);}return 0;
}

牛客网【每日一题】5月15日题目 储物点的距离相关推荐

  1. 牛客网 每日一题 7月23日题目精讲—wpy的请求

    来源:牛客网: 文章目录 wpy的请求 题解: 代码: wpy的请求 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge ...

  2. 2021-09-02牛客网每日10题--前端

    3 ng-class是做什么用的? 给元素绑定类名 eg:用法①: // An highlighted block <div ng-class="{'A':isA,'B':isB,'C ...

  3. 牛客网SQL刷题笔记(MySQL)

    牛客网SQL刷题笔记(MySQL) 此博客集合LeetCode.牛客网常见的题型及其解法,侵删 目录 牛客网SQL刷题笔记(MySQL) 类型1:查找排名第几的数据 SQL2 查找入职员工时间排名倒数 ...

  4. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类...

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概 ...

  5. 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...

    不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...

  6. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  7. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  8. 牛客网Veirlog刷题答案目录(持续更新)

    牛客网Veirlog刷题答案目录(持续更新) 基础篇 进阶篇 基础篇 1.VL1--四选一多路选择器 2.VL2--异步复位的串联T触发器 3.VL3--奇偶校验 4.VL4--移位运算与乘法 5.V ...

  9. 牛客网刷算法题的输入输出(C++)

    内容简述 该篇文章将对牛客网刷题中关于输入输出的一些问题作一个总结.每年互联网公司的招聘都必不可少会有算法题,因此平时很多人都会去一些刷题网站进行刷题来学习.这里面用的比较多的刷题网站是leetcod ...

最新文章

  1. 影响架构决策的非功能性需求
  2. Nginx的入门详解
  3. 如何将Oracle卸载干净
  4. 水库河道应急广播系统解决方案
  5. Basic4IOS B4I开发原生iOS,Visual Studio中编程
  6. 圣彼得堡三大教堂_2020年9大最佳教堂网站建设者(适合初学者)
  7. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.0
  8. 六、外部中断控制LED灯开关
  9. 部分安卓机型无法打开公众号/http链接,部分安卓机型无法打开公众号/http链接白屏
  10. vue-cli3打包时图片压缩处理
  11. c语言指针一步错步步错,一步错步步错,可是到底错在哪里
  12. S32K144烧写程序记录
  13. 瞰见|迷失的开源乌托邦
  14. LaTex 连字符多篇连续引用
  15. mbps和MB/s是怎么换算的
  16. 谈谈Oracle日志文件的INVALID状态(上)
  17. 背后的力量| 推动智慧医院建设 华云数据为重庆华玺医院构建一体化医疗支撑平台
  18. Python写掷骰子的游戏
  19. javascript输出换行
  20. 帮我写个完整的discuz DIY幻灯片模板 加上css和js

热门文章

  1. 如何快速解剖数据背后隐藏的信息
  2. php psr 编码规范_PHP之PSR-4规范:自动加载
  3. python34怎么安装_简明Python3教程 4.安装
  4. 构造函数怎么在主函数调用_C++ 虚基类及其派生类构造函数(学习笔记:第7章 12)...
  5. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...
  6. python中的成员运算符是干嘛的_在Python中使用成员运算符的示例
  7. java string底层实现_Java-学习日记(Shell与String底层原理)
  8. linux truncate文件,linux系统编程:用truncate调整文件大小
  9. php html asp .net iis tomcat,iis+apache+tomcat 整合共享80口 支持ASP .NET JSP PHP全能WEB服务...
  10. c语言——什么时候使用getchar()读取换行符