储物点的距离【前缀和】
题目链接
我采取了分别考虑的方式来解该问题,也就是将x和l、r的位置进行考虑了进去。
于是,我定义了如下几个数组,分别表示:
- pre[x]包括x的前面的所有的货物都运送到x所需的花费
- suff[x]包括x的后面的所有的货都运送到x所需的花费
- ans[x]所有点的货物都运送到x所需的花费
- dis[x]表示x点到1号点的距离
- psiz[x]包括x的前面的所有的货物的前缀和
- 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;
}
储物点的距离【前缀和】相关推荐
- 牛客网【每日一题】5月15日题目 储物点的距离
链接: 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 ...
- 牛客练习赛 8 (1~n约数和)(前缀和好题)(加边得连通图)(容斥原理)
A 题目描述 给个n,求1到n的所有数的约数个数的和~ 输入描述: 第一行一个正整数n 输出描述: 输出一个整数,表示答案 示例1 输入 3 输出 5 说明 样例解释: 1有1个约数1 2有2个约数1 ...
- 洛谷or牛客数据结构+算法
栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...
- [学习笔记]圆方树广义圆方树
引入 偶尔,我们会遇到一些要在无向图/仙人掌上做的问题,这些问题如果在树上就会比较方便,那么我们就开始考虑能不能把原图等效成一棵树,然后就可以方便地乱搞了? 圆方树就是一种将无向图/仙人掌变成树的数据 ...
- P4381 [IOI2008]Island
P4381 [IOI2008]Island 题意: 给你一棵基环树森林,求出基环树的直径之和. 题解: 对于基环树,我们将环看作根,那么直径有两种情况:: 1.不经过环,也就是环上某个点的子树内部,对 ...
- [HDU 6157]The Karting(DP)
[HDU 6157]The Karting description solution 先用前缀和求出di:1→id_i:1\rightarrow idi:1→i 的距离 前缀和满足:若在iii点进行 ...
- P3575-[POI2014]DOO-Around the world【环形dp】
正题 题目大意:https://www.luogu.org/problemnew/show/P3575 题目大意 一个环,上面有若干个点,若干个询问xxx. 表示上一个降落点和下一个降落点距离不能超过 ...
- 算法工程师思维导图—数据结构与算法
卖萌屋的妹子们(划掉)作者团整理的算法工程师思维导图,求职/自我提升/查漏补缺神器.该手册一共分为数据结构与算法.数学基础.统计机器学习和深度学习四个部分. 点击这里查看具体使用指南.该手册有两种获取 ...
- [洛谷P5068][Ynoi2015]我回来了
题目大意:给你一张$n(n\leqslant10^3)$个点$m(m\leqslant10^5)$个点的无向无权图,多组询问,每次询问给你一些二元组$(x_i,y_i)$,求有多少个$u$于至少一个二 ...
最新文章
- shell中十种实现自加的方法
- 一步步写自己SqlHelper类库(五):Command对象
- JavaScript初学者编程题(8)
- 中北大学c语言程序设计作业答案,2016年中北大学软件学院程序设计基础考研复试题库...
- linux无法下载ftp,linux 不能下载怎么办
- Elasticsearch整理笔记(三)
- How-to: Build VPP FD.IO with Mellanox DPDK PMD on top CentOS 7.7 with inbox drivers.
- 吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
- Failed to start Zabbix Agent.
- SpriteBuilder改变布局后App运行出错代码排查
- 【洛谷 P3979】遥远的国度【树链剖分、换根】
- 读《华为研发》第2版
- 云服务器怎么安装声音驱动_GPU云服务器如何安装NVIDIA Tesla驱动
- 做到这五点,才算是好用户体验 -- 转自周鸿祎在UPA用户体验大会上的演讲
- 分享md5解密站源代码,简单的代码就可以实现md5解密
- windows 7 开机错误 未能连接到一个Windows服务
- JavaScript学习笔记03【基础——对象(RegExp、Global)】
- Excel插入XactiveX提示出错“不能插入对象”解决
- [数据清洗]-混乱的邮编数据
- Android程序员最大的悲哀是什么?,2021最新Android知识体系总结
热门文章
- Android平台招商银行“一网通”支付对接采坑记
- 8255控制交通灯实验 c语言 main,交通灯控制实验
- Numpy读取csv文件
- LVS负载均衡群集——NAT地址转换
- js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
- IDEA修改创建多级package包结构样式
- python计算等差数列_python 等差数列末项计算方式
- mtp android7,Android7.0修改手机型号,mtp名称等
- win10系统要求配置_观察者系统还原游戏配置要求高吗?Observer: System Redux硬件一览!...
- HTML观鸟网小练习