题解
关于题面……
主要原因:题目又是图片又是文字。
根本原因:作者太懒了。
导致后果:自己戳一下链接吧。
利用前缀和优化就好了呀。
设
为
的距离 ,
为第 i 个点的物品数。
L 到 R 的物品放到 x(设 L ≤ R ≤ x)。
那么答案为
等于
这两项前者是可对
数组作前缀和,再乘
后者可以预处理为
数组,
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=2e5+5,MOD=19260817;
int n,m;
LL a[maxn],p[maxn],s[maxn];
int read()
{
int ret=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
int getR(int L,int R,int x)
{
return (p[x-1]*(a[R]-a[L-1]+MOD)%MOD-(s[R]-s[L-1]+MOD)%MOD+MOD)%MOD;
}
int getL(int L,int R,int x)
{
return ((s[R]-s[L-1]+MOD)%MOD-p[x-1]*(a[R]-a[L-1]+MOD)%MOD+MOD)%MOD;
}
int main()
{
n=read(),m=read();
for (int i=1;i< n;i++) p[i]=read();
for (int i=1;i<n;i++) p[i]=(p[i]+p[i-1])%MOD;
for (int i=1;i<=n;i++) a[i]=read(),s[i]=(s[i-1]+a[i]*p[i-1]%MOD)%MOD,a[i]=(a[i]+a[i-1])%MOD;
for (int i=1;i<=m;i++)
{
int x=read(),L=read(),R=read();
if (x>=R) printf("%d\n",getR(L,R,x));else
if (x<=L) printf("%d\n",getL(L,R,x));else
printf("%d\n",(getR(L,x,x)+getL(x,R,x))%MOD);
}
return 0;
}