【每日一题】30.储物点的距离 (区间处理,前缀和/线段树//树状数组)
补题链接:Here
算法涉及:前缀和,思维
一个数轴,每一个储物点会有一些东西,同时它们之间存在距离。
每次给个区间
比如储物
dist(i, j) = abs(i - j)
就是储物点间的距离。
【解题思路】
对于一个区间
对于最终点
-
,那么上面式子里的绝对值去掉得到 -
,那么上面式子里的绝对值去掉得到 -
, 那么对区间 分别做上述的操作即可
观察发现可以维护两个前缀和,
- 最后万分提醒,取模、取模再取模。。。Debug 超久
using ll = long long;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
ll a[N], b[N], c[N], sum[N];
void solve() {
int n, m;
cin >> n >> m;
for (int i = 2; i <= n; ++i) {
cin >> a[i]; // n - 1个数,第i个数表示第i个储物点与第i+1个储物点的距离ai
a[i] = (a[i - 1] + a[i]) % mod;
}
for (int i = 1; i <= n; ++i) {
cin >> b[i]; // 每个储物点的东西个数bi
c[i] = (a[i] * b[i]) % mod;
b[i] = (b[i] + b[i - 1]) % mod;
sum[i] = (sum[i - 1] + c[i]) % mod;
}
int l, r, x;
while (m--) {
cin >> x >> l >> r;
ll ans = 0;
if (x >= r) { // 情况 1
ans = a[x] * ((b[r] - b[l - 1] + mod) % mod) % mod;
ans = (ans - ((sum[r] - sum[l - 1] + mod) % mod) + mod) % mod;
ans = (ans + mod) % mod;
cout << ans << "\n";
} else if (l >= x) { // 情况 2
ans = (sum[r] - sum[l - 1] + mod) % mod;
ans = (ans - a[x] * ((b[r] - b[l - 1] + mod) % mod) + mod) % mod;
ans = (ans + mod) % mod;
cout << ans << "\n";
} else { // 情况 3
ll ans1 = (sum[r] - sum[x - 1] + mod) % mod;
ans1 = (ans1 - (a[x] * ((b[r] - b[x - 1]) + mod % mod)) + mod) % mod;
ans1 = (ans1 + mod) % mod;
ll ans2 = (a[x] * ((b[x - 1] - b[l - 1] + mod) % mod)) % mod;
ans2 = (ans2 - ((sum[x - 1] - sum[l - 1] + mod) % mod) + mod) % mod;
ans2 = (ans2 + mod) % mod;
cout << (ans1 + ans2) % mod << "\n";
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
2020-05-20 POJ:1511 Invitation Cards(双向搜索最短路径)
2020-05-20 ACM:快读读入技巧