洛谷 3932 Chtholly!

这里写图片描述
洛谷上居然有Chtholly 的题,不刷完我都不好意思说自己是珂学家!
如果有天你去到斯卡布罗集市,请代我向世界上最幸福的女孩问好。

题目描述:

有一天小妖精们又在做游戏。这个游戏是这样的。

妖精仓库的储物点可以看做在一个数轴上。每一个储物点会有一些东西,同时他们之间存在距离。

每次他们会选出一个小妖精,然后剩下的人找到区间[l,r][l,r]储物点的所有东西,清点完毕之后问她,把这个区间内所有储物点的东西运到另外一个仓库的代价是多少?

比如储物点ii有xx个东西,要运到储物点jj,代价为

x \times \mathrm{dist}( i , j )x×dist(i,j)
dist就是仓库间的距离。

当然啦,由于小妖精们不会算很大的数字,因此您的答案需要对19260817取模。

输入输出格式

输入格式:
第一行两个数表示n,mn,m
第二行n-1n−1个数,第ii个数表示第ii个储物点与第i+1i+1个储物点的距离

第三行nn个数,表示每个储物点的东西个数

之后mm行每行三个数x l r

表示查询要把区间[l,r][l,r]储物点的物品全部运到储物点x的花费

输出格式:
对于每个询问输出一个数表示答案

输入输出样例

输入样例#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
输出样例#1: 复制
125
72
9
0
70
说明

对于30%的数据,n , m \le 1000n,m≤1000
对于另外20%的数据,所有储物点间的距离都为1

对于另外20%的数据,所有储物点的物品数都为1

对于100%的数据 , n , m \le 200000 ; a_i , b_i <= 2\cdot 10^9n,m≤200000;a

分析:把式子拆开不难看出可以前缀和优化,于是预处理,然后随便搞搞。注意一定取mod要勤快,能取的地方都取,这样很稳。

# include <iostream>
# include <cstdio>
# include <cmath>
# include <list>
# include <cstring>
# include <map>
# include <ctime>
# include <algorithm>
# include <queue>
using namespace std;
typedef long long ll;
int read(){
    register int f=1,i=0;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {i=(i<<3)+(i<<1)+ch-'0';ch=getchar();}
    return f*i;
}
const int N=200005;
const int mod=19260817;
ll a[N],b[N],d[N],w[N],dw[N];
int n,m,l,r,x; 
inline ll MIU(int l,int r){
    return (d[r]%mod-d[l-1]%mod+mod)%mod;
}
inline ll MIUS(int l,int r){
    return (dw[r]%mod-dw[l-1]%mod+mod)%mod;
}
int main(){
    freopen("lx.in","r",stdin);
    n=read(),m=read();
    for(int i=2;i<=n;++i) a[i]=read(),a[i]=(a[i]%mod+a[i-1])%mod;
    for(int i=1;i<=n;++i) b[i]=read(),w[i]=b[i]*a[i];
    for(int i=1;i<=n;++i) d[i]=(d[i-1]+b[i])%mod,dw[i]=(dw[i-1]+w[i])%mod;
    for(int i=1;i<=m;++i)
    {
        x=read(),l=read(),r=read();
        if(x<=l){cout<<(MIUS(l,r)-MIU(l,r)*a[x]%mod+mod)%mod<<endl;continue;}
        if(x>=r){cout<<(MIU(l,r)*a[x]%mod-MIUS(l,r)+mod)%mod<<endl;continue;}
        if(x>l&&x<r){cout<<((a[x]*(MIU(l,x-1)-MIU(x+1,r)+mod)%mod)%mod+
        (MIUS(x+1,r)-MIUS(l,x-1)+mod)%mod)%mod<<endl;continue;}
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值