超时一个点,为什么?
查看原帖
超时一个点,为什么?
48247
scy278174241楼主2023/12/27 01:01
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,int> PLI;
const int N=1e6+10;
LL a[N];
int L[N],R[N],del[N];
priority_queue<PLI,vector<PLI>,greater<PLI>> q;
void remove(int x)
{
    L[R[x]]=L[x];
    R[L[x]]=R[x];
    del[x]=1;
}
template<typename T>void qr(T &x)
{
	x=0;int f=1;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(; isdigit(c);c=getchar()) x=x*10+c-48;
	x=x*f;
}
int main()
{
    int n,m;qr(n);qr(m);
    int k=0;
    for(int i=1;i<=n;i++)
	{
        LL x;qr(x);
        if(x!=0)
		{
            if(!k||a[k]*x<0)a[++k]=x;
            else a[k]+=x;
        }
    }
    n=k;
    LL ans=0;int cnt=0;
    for(int i=1;i<=n;i++)
	{
        L[i]=i-1,R[i]=i+1;
        q.push({abs(a[i]),i});
        if(a[i]>0)ans+=a[i],cnt++;
    }
    memset(del,0,sizeof(del));
    while(cnt>m)
	{
        while(del[q.top().second])q.pop();
        int x=q.top().second;q.pop();
        if(a[x]>0||(L[x]!=0&&R[x]!=n+1))
		{
            ans-=abs(a[x]);
            a[x]+=a[L[x]]+a[R[x]];
            q.push({abs(a[x]),x});
			remove(L[x]);
			remove(R[x]);
            cnt--;
        }
    }
    printf("%lld",ans);
    return 0;
}
2023/12/27 01:01
加载中...