【每日一题】【5月15日】储物点的距离

储物点的距离

https://ac.nowcoder.com/acm/problem/14683

题意:

给定一维数轴上 个点之间的距离 ,每个点储存一些货物
每次询问将一段区间 的货物全部移动到点 的代价和。
储物点 个货物,全部移动到点 的代价为

解法:

前缀和。

先根据 之间的关系分情况讨论。

先写下第一种情况的计算式:




则:

故只需要做三个前缀和数组 。就可以 计算出答案。

对于第二种情况:

计算式正好是情况一的计算式的相反数。

对于第三种情况,可以将区间拆分为 ,分别为情况二和情况一,分开计算然后求和就可以了。

Code:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const int N = 2e5 + 5;
ll a[N], b[N], c[N], n, m;
ll calc(int x, int l, int r) {
    return ((c[r] - c[l - 1] - (b[r] - b[l - 1]) * a[x]) % mod + mod) % mod;
}
int main() {
    cin >> n >> m;
    for(int i = 2; i <= n; i++) {
        int x; cin >> x;
        a[i] = (x + a[i - 1]) % mod;
    }
    for(int i = 1; i <= n; i++) {
        int x; cin >> x;
        b[i] = (x + b[i - 1]) % mod;
        c[i] = (x * a[i] + c[i - 1]) % mod;
    }
    while(m--) {
        int x, l, r, ans; cin >> x >> l >> r;
        if(x <= l) ans = calc(x, l, r);
        else if(x >= r) ans = (mod - calc(x, l, r)) % mod;
        else ans = (calc(x, x, r) + mod - calc(x, l, x - 1)) % mod;
        cout << ans << endl;
    }
    return 0;
}
全部评论

相关推荐

专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
道九生:兄弟,牛客又不是黑客,还能钻你电脑里看简历吗
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务