题目链接


我采取了分别考虑的方式来解该问题,也就是将x和l、r的位置进行考虑了进去。

于是,我定义了如下几个数组,分别表示:

  1. pre[x]包括x的前面的所有的货物都运送到x所需的花费
  2. suff[x]包括x的后面的所有的货都运送到x所需的花费
  3. ans[x]所有点的货物都运送到x所需的花费
  4. dis[x]表示x点到1号点的距离
  5. psiz[x]包括x的前面的所有的货物的前缀和
  6. ssiz[x]包括x的后面的所有的货物的后缀和
  • x < l时候

这时候,答案其实可以考虑称用l的后缀答案减去r+1的后缀答案,然后还少减了r+1的后缀部分到l上的贡献,然后在加上这部分,就求得了[l, r]所有货物都运到l上时候的花费了,然后就是货物数量乘以l到x的距离就可以了。

  • x > r时候

与上面类似,只是此时反过来了而已,式子就变成了:

  • l ≤ x ≤ r时候

因为我们已经求出来了其余所有点到x时候的答案了,那么用这个答案减去小于l的点到x的答案,再减去大于r的点到x的答案不就是答案了嘛。

左边要减去的部分:

右边要减去的部分:

用ans[x]减去这两个答案即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define eps 1e-8
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(x, y) make_pair(x, y)
#define Min_3(a, b, c) min(a, min(b, c))
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const ll mod = 1e9 + 7;
const int maxN = 2e5 + 7;
int N, M;
ll a[maxN], b[maxN], dis[maxN], psiz[maxN], ssiz[maxN], pre[maxN], suff[maxN], ans[maxN];
int main()
{scanf("%d%d", &N, &M);dis[1] = 0;for(int i=2; i<=N; i++){scanf("%lld", &a[i]);a[i] %= mod;dis[i] = (dis[i - 1] + a[i]) % mod;}psiz[0] = 0; pre[0] = 0;for(int i=1; i<=N; i++){scanf("%lld", &b[i]);b[i] %= mod;psiz[i] = (psiz[i - 1] + b[i]) % mod;pre[i] = (pre[i - 1] + psiz[i - 1] * a[i]) % mod;}ssiz[N + 1] = 0; suff[N + 1] = 0;for(int i=N; i>=1; i--){ssiz[i] = (ssiz[i + 1] + b[i]) % mod;suff[i] = (suff[i + 1] + ssiz[i + 1] * a[i + 1]) % mod;}ans[1] = 0;for(int i=2; i<=N; i++) ans[1] = (ans[1] + dis[i] * b[i] % mod) % mod;for(int i=2; i<=N; i++){ans[i] = (ans[i - 1] + psiz[i - 1] * a[i] % mod - ssiz[i] * a[i] % mod + mod) % mod;}int x, l, r;ll sum, tmp_L, tmp_R;while(M--){scanf("%d%d%d", &x, &l, &r);sum = 0;if(x < l){sum = suff[l];tmp_L = (suff[r + 1] + ssiz[r + 1] * (dis[r + 1] - dis[l] + mod) % mod) % mod;sum = (sum - tmp_L + mod) % mod;sum = (sum + (ssiz[l] - ssiz[r + 1] + mod) % mod * (dis[l] - dis[x] + mod) % mod + mod) % mod;}else if(x > r){sum = pre[r];tmp_L = pre[l - 1] + psiz[l - 1] * (dis[r] - dis[l - 1] + mod) % mod;sum = (sum - tmp_L + mod) % mod;sum = (sum + (psiz[r] - psiz[l - 1] + mod) % mod * (dis[x] - dis[r] + mod) % mod + mod) % mod;}else{sum = ans[x];tmp_L = (pre[l - 1] + psiz[l - 1] * (dis[x] - dis[l - 1] + mod) % mod + mod) % mod;tmp_R = (suff[r + 1] + ssiz[r + 1] * (dis[r + 1] - dis[x] + mod) % mod + mod) % mod;sum = (sum - tmp_L - tmp_R + mod + mod) % mod;}printf("%lld\n", sum);}return 0;
}

储物点的距离【前缀和】相关推荐

  1. 牛客网【每日一题】5月15日题目 储物点的距离

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

  2. 牛客练习赛 8 (1~n约数和)(前缀和好题)(加边得连通图)(容斥原理)

    A 题目描述 给个n,求1到n的所有数的约数个数的和~ 输入描述: 第一行一个正整数n 输出描述: 输出一个整数,表示答案 示例1 输入 3 输出 5 说明 样例解释: 1有1个约数1 2有2个约数1 ...

  3. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

  4. [学习笔记]圆方树广义圆方树

    引入 偶尔,我们会遇到一些要在无向图/仙人掌上做的问题,这些问题如果在树上就会比较方便,那么我们就开始考虑能不能把原图等效成一棵树,然后就可以方便地乱搞了? 圆方树就是一种将无向图/仙人掌变成树的数据 ...

  5. P4381 [IOI2008]Island

    P4381 [IOI2008]Island 题意: 给你一棵基环树森林,求出基环树的直径之和. 题解: 对于基环树,我们将环看作根,那么直径有两种情况:: 1.不经过环,也就是环上某个点的子树内部,对 ...

  6. [HDU 6157]The Karting(DP)

    [HDU 6157]The Karting description solution 先用前缀和求出di:1→id_i:1\rightarrow idi​:1→i 的距离 前缀和满足:若在iii点进行 ...

  7. P3575-[POI2014]DOO-Around the world【环形dp】

    正题 题目大意:https://www.luogu.org/problemnew/show/P3575 题目大意 一个环,上面有若干个点,若干个询问xxx. 表示上一个降落点和下一个降落点距离不能超过 ...

  8. 算法工程师思维导图—数据结构与算法

    卖萌屋的妹子们(划掉)作者团整理的算法工程师思维导图,求职/自我提升/查漏补缺神器.该手册一共分为数据结构与算法.数学基础.统计机器学习和深度学习四个部分. 点击这里查看具体使用指南.该手册有两种获取 ...

  9. [洛谷P5068][Ynoi2015]我回来了

    题目大意:给你一张$n(n\leqslant10^3)$个点$m(m\leqslant10^5)$个点的无向无权图,多组询问,每次询问给你一些二元组$(x_i,y_i)$,求有多少个$u$于至少一个二 ...

最新文章

  1. shell中十种实现自加的方法
  2. 一步步写自己SqlHelper类库(五):Command对象
  3. JavaScript初学者编程题(8)
  4. 中北大学c语言程序设计作业答案,2016年中北大学软件学院程序设计基础考研复试题库...
  5. linux无法下载ftp,linux 不能下载怎么办
  6. Elasticsearch整理笔记(三)
  7. How-to: Build VPP FD.IO with Mellanox DPDK PMD on top CentOS 7.7 with inbox drivers.
  8. 吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
  9. Failed to start Zabbix Agent.
  10. SpriteBuilder改变布局后App运行出错代码排查
  11. 【洛谷 P3979】遥远的国度【树链剖分、换根】
  12. 读《华为研发》第2版
  13. 云服务器怎么安装声音驱动_GPU云服务器如何安装NVIDIA Tesla驱动
  14. 做到这五点,才算是好用户体验 -- 转自周鸿祎在UPA用户体验大会上的演讲
  15. 分享md5解密站源代码,简单的代码就可以实现md5解密
  16. windows 7 开机错误 未能连接到一个Windows服务
  17. JavaScript学习笔记03【基础——对象(RegExp、Global)】
  18. Excel插入XactiveX提示出错“不能插入对象”解决
  19. [数据清洗]-混乱的邮编数据
  20. Android程序员最大的悲哀是什么?,2021最新Android知识体系总结

热门文章

  1. Android平台招商银行“一网通”支付对接采坑记
  2. 8255控制交通灯实验 c语言 main,交通灯控制实验
  3. Numpy读取csv文件
  4. LVS负载均衡群集——NAT地址转换
  5. js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
  6. IDEA修改创建多级package包结构样式
  7. python计算等差数列_python 等差数列末项计算方式
  8. mtp android7,Android7.0修改手机型号,mtp名称等
  9. win10系统要求配置_观察者系统还原游戏配置要求高吗?Observer: System Redux硬件一览!...
  10. HTML观鸟网小练习