不成熟的梦想家 (未熟DREAMER)

题目背景
どんな未来かは 誰もまだ知らない

那是个任谁也不会知晓的未来

でも楽しくなるはずだよ

但应该会充满乐趣吧

みんなとなら乗りこえられる

只要大伙儿同在 就能跨越难关

これからなんだねお互いがんばろうよ

现在才正要开始 彼此互相加油吧

どんな未来かは 誰もまだ知らない

那是个任谁也不会知晓的未来

でも楽しくしたホントに

不过真心期望能够充满着乐趣

みんなとなら無理したくなる

只要大伙儿同在 就会想将顾虑抛诸脑后

成長したいなまだまだ未熟DREAMER

愿能有所成长 如今还只是尚未成熟的梦想家

Aqours的成员终于到齐了。

今天,是我们全员在一起的第一场演唱会。

大家都好好练习过了,相信一定会表现得很出色的。

不过,每个人的唱功也要尽量地接近才可以呢,如果太突出或者太落后,也是会影响表现的样子。

所以我们从隔壁的学园都市借来了一个发明,可以改变我们成员的唱功呢。

题目描述
我们Aqours的成员共有N+1人,他们会列成一队。

他们的唱功以A[0]到A[N]表示,A[i](0\le i \le N)(0≤i≤N)均给出。

学园都市的机器可以改变队列中连续多个成员的唱功值,并将其加上一个数Z,当然当Z是负数的时候就变成减去了。

我打算一共使用这个机器Q次,每次把第X到第Y号(1\le X,Y\le10^61≤X,Y≤106)的成员都加上Z点唱功值。

而我们队伍的魅力值B,是这么算的:

一开始B=0,然后从第1号到第N号成员,

当A_{i-1}<A_iAi−1​<Ai​:B = B-S\dot|A_{i-1} - A_i|B=B−S∣˙​Ai−1​−Ai​∣
当A_{i-1}>A_iAi−1​>Ai​:B = B+T\dot|A_{i-1} - A_i|B=B+T∣˙​Ai−1​−Ai​∣ 其中S和T是LoveLive组委会给我们的常数。
果然,我是バカチカ(笨蛋千歌)呢,所以作为领导我永远排在队伍的开头,唱功永远是0,机器也不会改到我头上呢。

你能帮我们算算,我每次使用完这个机器之后,成员的魅力B是多少吗?

输入格式
第一行4个整数,N,Q,S,T,各个变量在描述中已经解释

接下来N+1行,每行一个数整数Ai,其中A0=0

接下来Q行,每行3个整数,X,Y,Z各个变量在描述中已经解释

输出格式
Q个整数,表示答案。

输入输出样例
输入 #1复制
4 3 2 3
0
5
2
4
6
1 2 1
3 4 -3
1 4 2
输出 #1复制
-9
-1
-5
说明/提示
30% 的数据 N,Q\le 2000N,Q≤2000,

另外20% 的数据 S=TS=T

100%的数据 N,Q\le 200000N,Q≤200000;1\le S,T,A_i\le10^61≤S,T,Ai​≤106;|Z|\le 10^6∣Z∣≤106 请注意可能需要使用int64,cin/cout可能超时。

样例解释:

第一次变化后,

A 0 6 3 4 6

B -12 -3 -5 -9

以下是彩蛋
没有。

哪来的那么多彩蛋?

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll s1,s2;
ll dif[300001];
ll get(ll t)
{
    if(t>0)return -s1*t;
    else return -s2*t;
}
int main()
{
    int num,query;
    scanf("%d%d%lld%lld",&num,&query,&s1,&s2);
    vector<int>v;
    for(int i=0;i<=num;i++)
    {
        int z;
        scanf("%d",&z);
        v.push_back(z);
    }
    ll ans=0;
    for(int i=0;i<num;i++)
    {
        dif[i]=v[i+1]-v[i];
        ans+=get(dif[i]);
    }
    for(int i=0;i<query;i++)
    {
        int za,zb,zc;
        scanf("%d%d%d",&za,&zb,&zc);
        ans-=get(dif[za-1]);
        dif[za-1]+=zc;
        ans+=get(dif[za-1]);
        if(zb!=num)
        {
            ans-=get(dif[zb]);
            dif[zb]-=zc;
            ans+=get(dif[zb]);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值