LG-P3932 浮游大陆的68号岛

P3932 浮游大陆的68号岛

题解
关于题面……
主要原因:题目又是图片又是文字。
根本原因:作者太懒了。
导致后果:自己戳一下链接吧。

利用前缀和优化就好了呀。

p [ i ] 1 > i + 1 的距离 , a [ i ] 为第 i 个点的物品数。
L 到 R 的物品放到 x(设 L ≤ R ≤ x)。
那么答案为 i = L R 1 a [ i ] × ( p [ x 1 ] p [ i 1 ] )
等于 i = L R 1 a [ i ] × p [ x 1 ] i = L R 1 a [ i ] × p [ i 1 ]
这两项前者是可对 a 数组作前缀和,再乘 p [ x 1 ]
后者可以预处理为 s 数组, s [ i ] = s [ i 1 ] + a [ i ] × p [ i 1 ]

代码

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

猜你喜欢

转载自blog.csdn.net/xu0_zy/article/details/80671959