90分求助
查看原帖
90分求助
263374
FanYongchen楼主2021/9/9 21:53
#include <iostream>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
#define ms(x,y) memset(x,y,sizeof(x))
#define mc(x,y) memcpy(x,y,sizeof(x))
#define int long long
int n,q,s,t;
int a[2000005],c[2000005]={0};
signed main()
{
    clock_t t1=clock();
#ifdef LOCAL
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif

//==================================
    cin>>n>>q>>s>>t;
    int B=0;
    for(int i=0;i<=n;i++)
    {
        cin>>a[i];
        if(i==0) continue;
        if(a[i-1]<a[i]) B-=s*(a[i]-a[i-1]);
        else B+=t*(a[i-1]-a[i]);
    }
    // cout<<B<<"\n";
    while(q--)
    {
        int x,y,z;
        cin>>x>>y>>z;
        if(a[x-1]+c[x-1]<a[x]+c[x]) B+=s*(a[x]+c[x]-a[x-1]-c[x-1]);
        else B+=t*(a[x]+c[x]-a[x-1]-c[x-1]);
        c[x]+=z;
        if(a[x-1]+c[x-1]<a[x]+c[x]) B-=s*(a[x]+c[x]-a[x-1]-c[x-1]);
        else B-=t*(a[x]+c[x]-a[x-1]-c[x-1]);
        if(y<n)
        {
            if(a[y]+c[y]<a[y+1]+c[y+1]) B-=s*(a[y]+c[y]-a[y+1]-c[y+1]);
            else B-=t*(a[y]+c[y]-a[y+1]-c[y+1]);
            c[y+1]-=z;
            if(a[y]+c[y]<a[y+1]+c[y+1]) B+=s*(a[y]+c[y]-a[y+1]-c[y+1]);
            else B+=t*(a[y]+c[y]-a[y+1]-c[y+1]);
        }
        cout<<B<<"\n";
    }
//==================================

    cerr<<"Time used:"<<clock()-t1<<"ms"<<"\n";
    return 0;
}
/*
题解里大部分都是直接求出差分数组然后操作
这里我把差分数组单独分开来算了
*/
2021/9/9 21:53
加载中...