P3932 浮游大陆的68号岛

P3932 浮游大陆的68号岛

题意

第二行 n1 个数,第 i 个数表示第 i 个储物点与第 i+1 个储物点的距离

n 个储物点,每个储物点 ix 个东西,要运到储物点 j,代价为

x×dist(i,j)

dist就是仓库间的距离。

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

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

对于100%的数据 ,n,m200000;ai,bi<=2109

您的答案需要对19260817取模。

解法

首先把题意转换成数学形式化语言:

对于一次查询,我们的花费是:

i=lr|preiprex|×ai

其中 prei 表示储物点 1 到储物点 i 的距离。

发现有绝对值,那么就需要我们对 x 的大小进行分类讨论。

  1. xl

此时 prexprei,所以直接去掉绝对值即可:

i=lr(preiprex)×ai=i=lrprei×aiprex×i=lrai

我们设 preaiprei×ai 的前缀和,aaki=1kai

则式子变为:

(prearpreal1)prex×(aaraal1)

可以 O(1) 计算。

  1. xr

1的情况同理,可以得到计算式为:

prex×(aaraal1)(prearpreal1)

  1. l<x<r

答案可以看成:

i=lx(prexprei)×ai+i=xr(preiprex)×ai

化简后可以得到:

(preaxpreal1)+prex×(aaxaal1)+(prearpreax1)+prex×(aaraax1)

那么我们只要预处理出 prei×aiaidisi,的前缀和就可以了。

code:

#include<iostream>
#include<algorithm>
using namespace std;
const int MOD = 19260817;
const int MAXN = 2e5 + 1;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;}

int n,m;
int d[MAXN];
int a[MAXN];
long long prea[MAXN],pre[MAXN];
long long aaa[MAXN];
int xx,ll,rr;
int ans = 0;
int solve(int x,int l,int r){
	ans = 0;
	if(x <= l){
		ans = ((ans + prea[r] - prea[l - 1]) % MOD + MOD) % MOD;
		ans = (((ans - pre[x] * aaa[r]) % MOD + MOD) % MOD + pre[x] * aaa[l - 1]) % MOD;
	}else if(x >= r){
		ans = ((ans + pre[x] * (aaa[r] - aaa[l - 1])) % MOD + MOD) % MOD;
		ans = ((ans - (prea[r] - prea[l - 1])) % MOD + MOD) % MOD;
	}else{
		ans = ((ans + pre[x] * aaa[x] - pre[x] * aaa[l - 1] % MOD) + MOD) % MOD;
		ans = ((ans - (prea[x] - prea[l - 1])) % MOD + MOD) % MOD;
		
		ans = ((ans + prea[r] - prea[x - 1]) % MOD + MOD) % MOD;
		ans = ((((ans - pre[x] * aaa[r]) % MOD + MOD) + pre[x] * aaa[x - 1]) % MOD + MOD) % MOD;
	}
	return ans;
}
int i;
signed main(){
	n = read();m = read();
	for(i = 1;i < n;i++) d[i] = read(),d[i] %= MOD;
	for(i = 1;i <= n;i++) a[i] = read(),a[i] %= MOD;
	for(i = 1;i <= n;i++) aaa[i] = (aaa[i - 1] + a[i]) % MOD;
	for(i = 1;i <= n;i++) pre[i] = (pre[i - 1] + d[i - 1]) % MOD;
	for(i = 1;i <= n;i++) prea[i] = (prea[i - 1] + (pre[i] * a[i])) % MOD;
	for(i = 1;i <= m;i++){
		xx = read(),ll = read(),rr = read();
		write(solve(xx,ll,rr));
		printf("\n");
	}
	return 0;
}
posted @   wyl123ly  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示