洛谷-不成熟的梦想家

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

思路:

参考“树状数组数据结构”博客,这道题是明显的区间修改,单点查询类型。只不过是将单点查询变了个意思,每次查询队伍的魅力值。队伍的魅力值是由原数列所有元素计算的来的,可以算得上是单点查询。当前的魅力值和上一次的魅力值相比,差异的原因是修改区间的左边界和右边界造成的,在此维护差分数组即可。当前的魅力值因此就可以由上次的魅力值以O(1)的复杂度推出。

此题的数据量是2*10^5,计算魅力值时使用O(logn)的算法也可以,也就是用树状数组也能过。但是是用树状数组就没什么意思了,代码变得复杂。树状数组存储原数列的差分值即可。每当查询当前魅力值时计算左右边界的差分即可。

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
#define ll long long
ll ar[200002];

int main() {
	int N, Q;
	ll B = 0, S, T;
	scanf("%d %d %ld %ld", &N, &Q, &S, &T);
	int x, l, r, y, k;
	
	scanf("%d", &x);
	for(int i = 1; i <= N; i ++) {
		y = x;
		scanf("%d", &x);
		ar[i] = x - y;
		B += x > y ? (-1) * S * (x - y) : T * (y - x);
	}
	ll lastValL, lastValR, nowValL, nowValR;
	for(int i = 0; i < Q; i ++) {
		scanf("%d %d %d", &l, &r, &k);
		lastValL = ar[l] > 0 ? (-1) * S * abs(ar[l]) : T * abs(ar[l]);
		nowValL = ar[l] + k > 0 ? (-1) * S * abs(ar[l] + k) : T * abs(ar[l] + k);
		B += nowValL - lastValL;
		lastValR = r + 1 > N ? 0 : ar[r + 1] > 0 ? (-1) * S * abs(ar[r + 1]) : T * abs(ar[r + 1]);
		nowValR = r + 1 > N ? 0 : ar[r + 1] - k > 0 ? (-1) * S * (ar[r + 1] - k) : T * abs(ar[r + 1] - k);
		B += nowValR - lastValR;
		ar[l] += k;
		ar[r + 1] -= k;
		printf("%ld\n", B);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vanghua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值