T322380 [梦熊-四月-T8] 序列 求助
  • 板块学术版
  • 楼主Shadow_T
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/5/1 16:36
  • 上次更新2023/10/23 17:01:13
查看原帖
T322380 [梦熊-四月-T8] 序列 求助
734379
Shadow_T楼主2023/5/1 16:36

T322380 [梦熊-四月-T8] 序列

#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[500005];
int dps[500005];
int dp[500005];
int dpf[500005];
int dpfs[500005];
int f[500005];
signed main()
{
    int n,m,y=0,l=0,l1=0;
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        if(a[i]<0) dp[-a[i]]+=a[i],dps[abs(a[i])]++,dpf[-a[i]]+=a[i],dpfs[0]++;
        else dp[0]+=a[i],dps[0]++,dpf[-a[i]]+=a[i],dpfs[-a[i]]++;
        if(a[i]<0) l=max(l,-a[i]);
        else l1=max(l1,a[i]);
    }
    for(int i=1;i<=l;i++)
    dp[i]=dp[i-1]+dp[i],dps[i]=dps[i-1]+dps[i];
    for(int i=1;i<=l1;i++)
    dpf[i]=dpf[i-1]+dpf[i],dpfs[i]=dpfs[i-1]+dpfs[i];
    int op,x;
    for(int i=1;i<=m;i++)
    {
        scanf("%lld",&op);
        if(op==1)
        {
            scanf("%lld",&x);
            y+=x;
        }
        if(op==2)
        {
            if(y>l)
            printf("%lld\n",dp[l]+y*dps[l]);
            if(y<0)
            {
                if(y<-l1)
                printf("0\n");
                else printf("%lld",dpf[y]+y*dpfs[y]);
            } 
            if(y>=0&&y<=l) printf("%lld\n",dp[y]+y*dps[y]);
        }
    }
}

赛后订正,没法验证,已过样例,求大佬纠错

2023/5/1 16:36
加载中...