蒟蒻玄关QAQ
查看原帖
蒟蒻玄关QAQ
817925
whileAK楼主2023/10/28 14:22

80分WA,还有救么QAQ

using namespace std;
typedef long long ll; 
int n,k;
ll a[1000006],u=0,cnt=0,ans=0;
priority_queue< pair<ll,int> >q;
bool l=true;
struct lian{
	int fr,nxt;
}c[1000006];
bool b[1000006]={};
int main(){
	scanf("%d%d",&n,&k);
	for(int i(1);i<=n;++i){
		scanf("%lld",&a[i]);
	}
	int p=1;
	while(a[p]==0)++p;
	a[p]>=0?l=true:l=false;
	while(p<=n){
		if(l){
			while(a[p]>=0&&p<=n){
				u+=a[p];++p;
			}
			l=false;a[++cnt]=u;u=0;
		}
		else{
			while(a[p]<=0&&p<=n){
				u+=a[p];++p;
			}
			l=true;a[++cnt]=u;u=0;
		}
	}
	for(int i(1);i<=cnt;++i){
		c[i].fr=i-1,c[i].nxt=i+1;
		if(a[i]>0)ans+=a[i],--k,q.push(make_pair(-a[i],i));
		else q.push(make_pair(a[i],i));
	}
	c[0].nxt=0;c[0].fr=0;c[cnt+1].fr=0;c[cnt+1].nxt=0;a[0]=a[cnt+1]=0;
	while(k<0){
		while(b[q.top().second])q.pop();
		u=q.top().first,p=q.top().second;q.pop();
		if((!c[p].fr||!c[p].nxt)&&a[p]<=0)continue;
		ans+=u;++k;
		a[p]+=a[c[p].nxt]+a[c[p].fr];q.push(make_pair(-abs(a[p]),p));
		b[c[p].fr]=b[c[p].nxt]=true;a[c[p].fr]=a[c[p].nxt]=0;
		c[p].fr=c[c[p].fr].fr;c[p].nxt=c[c[p].nxt].nxt;c[c[p].fr].nxt=p;c[c[p].nxt].fr=p;
		c[0].nxt=0;c[0].fr=0;c[cnt+1].fr=0;c[cnt+1].nxt=0;
	}
	printf("%lld",ans);
	return 0;
}
2023/10/28 14:22
加载中...