NC14683 储物点的距离
题目
题目描述
一个数轴,每一个储物点会有一些东西,同时它们之间存在距离。
每次给个区间 ,查询把这个区间内所有储物点的东西运到另外一个储物点的代价是多少?
比如储物点 有 个东西,要运到储物点 ,代价为
就是储物点间的距离。
输入描述
第一行两个数表示 , 第二行 个数,第i个数表示第 个储物点与第 个储物点的距离 第三行 个数,表示每个储物点的东西个数 之后 行每行三个数 , , 。
表示查询要把区间 储物点的物品全部运到储物点 的花费
每次查询独立
输出描述
对于每个询问输出一个数表示答案
答案对 取模
示例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
备注
对于 的数据 , 。
题解
知识点:枚举,前缀和。
考虑三种情况 , , 的花费 。
的性质:
我们发现其中反复用到 , ,。
可以用 前缀和维护; 可以用 前缀和维护; 可以在 前缀和的基础上在计算 前缀和的过程维护。
时间复杂度
空间复杂度
代码
#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; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16247767.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧