NOIP模拟 聚会(前缀和)

今天就补下昨天的坑,考的是一脸懵啊。

【题目描述】

在成都的一条街道上,一共有 N 户人家,每个家庭有 Xi 个人,他们和谐的生活在一起,作为全国和谐街道,他们经常会小范围组织活动,每次活动会选择一户作为聚点,并要求某些家庭参加,为了方便通知,村长每次邀请位置连续的家庭。因为每户人数不同,每个家庭之间有一定距离,村长希望你计算出每次邀请的家庭的移动代价。第 i 个家庭移动到家庭j的代价是Xi*dis(i,j) ,dis(i,j)表示i到j的距离,村长一共安排了m次聚会,每次邀请[Li,Ri]的家庭参加 。

【输入格式】

第一行两个数表示 n,m

第二行 n-1 个数,第 i 个数表示第 i 个家庭与第 i+1 个家庭的距离 Di

第三行 n 个数,表示每个家庭的人数 Xi

之后 m 行每行三个数 x l r,表示查询要把区间 [l,r]的家庭移动到 x 点的代价和

【输出格式】

对于每个询问输出一个数表示答案,对 19260817 取模

【样例输入】

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

【备注】

对于 30%的数据, n,m≤1000

对于另外 20%的数据,所有家庭间的距离都为 1

对于另外 20%的数据,所有家庭人数都为 1

对于 100%的数据 , n,m≤200000;Xi,Di <=2*10^9

【题目分析】

取模真是让人精力憔悴。。。

对于N,M<=1000,暴力枚举,用绝对值表示距离,注意开long long即可,注意开long long即可,注意开long long即可,预计得分30 分 ;

距离为1和人数为1就是在提醒正解写法,下面给出正解:

首先我们记dis[i]为1到i的距离,显然,如果x<=l的话,它的ans就由下面这个式子得到:

如果x>=r的话,就将上面这个式子取反即可,如果x在l,r之间,就将其分为l,x-1和x+1,r两部分。

所以只需记录距离、人数以及pi与dis[i]乘积的前缀和即可。

【代码~】

#include<iostream>   
#include<cstdio>   
using namespace std;   
typedef long long LL;   
const LL MOD=19260817;   
const int MAXN=200010;   
   
int n,m;
LL d[MAXN],a[MAXN];    
LL sum_a[MAXN],sum_d[MAXN],sum_mul[MAXN];   
   
LL calc_ans(int x,int l,int r,bool left) 
{   
    if(l>r) 
	  return 0;   
    LL ans1=((sum_a[r]-sum_a[l-1])%MOD+MOD)%MOD;   
    ans1=ans1*sum_d[x]%MOD;
    LL ans2=((sum_mul[r]-sum_mul[l-1])%MOD+MOD)%MOD;   
    if(!left) 
	  swap(ans1, ans2);   
    return ((ans1-ans2)%MOD+MOD)%MOD;   
}   
   
int main() 
{   
    scanf("%d%d",&n,&m);   
    for(int i=2;i<=n;i++) 
	{   
        scanf("%lld",&d[i]);   
        sum_d[i]=(sum_d[i-1]+(d[i]%=MOD))%MOD;   
    }   
    for(int i=1;i<=n;i++) 
	{   
        scanf("%lld",&a[i]);   
        sum_a[i]=(sum_a[i-1]+(a[i] %= MOD))%MOD;   
        sum_mul[i]=(sum_mul[i-1]+a[i]*sum_d[i]%MOD)%MOD;   
    }   
    for(int i=1,x,l,r;i<=m;i++) 
	{
        scanf("%d%d%d",&x,&l,&r);   
        LL ans1=calc_ans(x,l,min(r,x-1),true);   
        LL ans2=calc_ans(x,max(l,x+1),r,false);   
        printf("%lld\n",(ans1+ans2)%MOD);   
    }   
    return 0;   
}   

猜你喜欢

转载自blog.csdn.net/g21glf/article/details/82932041