ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NC14683 储物点距离

2022-05-09 03:01:24  阅读:126  来源: 互联网

标签:dist cdot 储物点 sum 距离 leq NC14683 mod


NC14683 储物点距离

题目

题目描述

一个数轴,每一个储物点会有一些东西,同时它们之间存在距离。
每次给个区间 \([l,r]\) ,查询把这个区间内所有储物点的东西运到另外一个储物点的代价是多少?
比如储物点 \(i\) 有 \(x\) 个东西,要运到储物点 \(j\) ,代价为 \(x \cdot dist( i , j )\)
\(dist\) 就是储物点间的距离。

输入描述

第一行两个数表示 \(n\) , \(m\)第二行 \(n-1\) 个数,第i个数表示第 \(i\) 个储物点与第 \(i+1\) 个储物点的距离 \(a_i\) 第三行 \(n\) 个数,表示每个储物点的东西个数 \(b_i\) 之后 \(m\) 行每行三个数 \(x\) , \(l\) , \(r\)。
表示查询要把区间 \([l,r]\) 储物点的物品全部运到储物点 \(x\) 的花费
每次查询独立

输出描述

对于每个询问输出一个数表示答案
答案对 \(1000000007\) 取模

示例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

备注

对于\(100\%\) 的数据\(n , m \leq 200000\) , \(0 \leq a_i,b_i \leq 2000000000\) 。

题解

思路

考虑三种情况 \(x \geq r\) , \(x \leq l\) , \(l < x < r\) 的花费 \(P_{l,r}\) 。

\(dist\) 的性质:\(dist(i,j) = dist(1,j)-dist(1,i)\)

  1. \(x \geq r\)

    \(P_{l,r} = \sum_{i=l}^{r} b_i \cdot dist(x,i) = \sum_{i=l}^r b_i \cdot (dist(1,x) - dist(1,i)) = dist(1,x) \sum_{i=l}^r b_i - \sum_{i=l}^r b_i \cdot dist(1,i)\)

  2. \(x \leq l\)

    \(P_{l,r} = \sum_{i=l}^{r} b_i \cdot dist(x,i) = \sum_{i=l}^r b_i \cdot (dist(1,i) - dist(1,x)) = \sum_{i=l}^r b_i \cdot dist(1,i) - dist(1,x) \sum_{i=l}^r b_i\)

  3. \(l \leq x \leq r\)

    \(\begin{aligned} P_{l,r} &= \sum_{i=l}^{r} b_i \cdot dist(x,i)\\ &= \sum_{i=l}^x b_i \cdot (dist(1,x) - dist(1,i)) + \sum_{i=x+1}^r b_i \cdot (dist(1,i) - dist(1,x))\\ &= dist(1,x) \sum_{i=l}^x b_i - \sum_{i=l}^x b_i \cdot dist(1,i) + \sum_{i=x+1}^r b_i \cdot dist(1,i) - dist(1,x) \sum_{i=x+1}^r b_i \end{aligned}\)

我们发现其中反复用到 \(dist(1,i)\) , \(\sum_{i=a}^b b_i\),\(\sum_{i=a}^b b_i \cdot dist(1,i)\)。

\(dist(1,i)\) 可以用 \(a_i\) 前缀和维护;\(\sum_{i=a}^b b_i\) 可以用 \(b_i\) 前缀和维护;\(\sum_{i=a}^b b_i \cdot dist(1,i)\) 可以在 \(a_i\) 前缀和的基础上在计算 \(b_i\) 前缀和的过程维护。

代码

#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;
}

标签:dist,cdot,储物点,sum,距离,leq,NC14683,mod
来源: https://www.cnblogs.com/BlankYang/p/16247767.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有