求调,链表+优先队列 贪心 甚至拍不出来
查看原帖
求调,链表+优先队列 贪心 甚至拍不出来
450743
XOOR楼主2024/5/22 17:25
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;

int n,m,k,ans;
int a[N],b[N],l[N],r[N];
bitset<N> vis;
struct node{
	int x,f,pos;
	bool friend operator < (node a,node b){
		return a.x>b.x;
	}
};
priority_queue<node> q;

void delet(int x,int opt){
	if(opt){//+
		b[x]=b[l[x]]+b[r[x]]-b[x];
		q.push((node){-b[x],0,x});
	}else{//-
		b[x]=b[l[x]]+b[r[x]]+b[x];
		q.push((node){b[x],1,x});
	}
	vis[l[x]]=vis[r[x]]=1;
	r[l[l[x]]]=x,l[r[r[x]]]=x;
	l[x]=l[l[x]],r[x]=r[r[x]];
	return ;
}

int main(){
//	freopen("in.in","r",stdin);
//	freopen("out.out","w",stdout);
	scanf("%d%d",&n,&k);int maxn;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	int L=1,R=n;
	for(int i=1;i<=n;i++,L++) if(a[i]>=0) break ;
	for(int i=n;i>=L;i--,R--) if(a[i]>=0) break ;
	int last=0;m=1;
	for(int i=L;i<=R;i++){
		if(a[i]>=0){ if(last<0) m++;b[m]+=a[i];}
		else if(a[i]<0){ if(last>=0) m++;b[m]+=a[i];}
		last=a[i];
	}
	int cnt=0;
	for(int i=1;i<=m;i++){
		l[i]=i-1,r[i]=i+1;
		if(b[i]<0) q.push((node){-b[i],0,i});//-
		else q.push((node){b[i],1,i}),cnt++,ans+=b[i];//+
	}
	r[m]=0;
	while(cnt>k){
		auto t=q.top();q.pop();
		if(vis[t.pos]) continue ;
		if(t.f==1){//+
			ans-=t.x;
			delet(t.pos,1);
		}else{//-
			ans-=t.x;
			delet(t.pos,0);
		}
		cnt--;
	}
	printf("%d",ans);
	return 0;
}
/*
*/
2024/5/22 17:25
加载中...