萌新求助,CF的E,RE on 8
  • 板块学术版
  • 楼主donghanwen1225
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/1/10 21:53
  • 上次更新2023/10/24 04:49:18
查看原帖
萌新求助,CF的E,RE on 8
153687
donghanwen1225楼主2023/1/10 21:53

孩子心态爆炸了,code:

#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
typedef long long ll;
int t,n;ll a[1000005],num[1000005],pre[1000005],nxt[1000005];
struct node{ll p,v;};
bool operator <(const node &x,const node &y){if(x.v!=y.v)return x.v<y.v;return x.p<y.p;}
multiset<node> q;
ll mabs(ll x){return x<0?-x:x;}
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i=1;i<=n;i++) cin>>a[i];
		int now=1,cnt=0;
		while(a[now]==0&&now<=n) now++;
		while(now<=n)
		{
			int od=now;ll tmp=a[od];
			while(now+1<=n&&1ll*a[od]*a[now+1]>=0) now++,tmp+=a[now];
			num[++cnt]=mabs(tmp);now++;
		}
//		cout<<cnt<<endl;for(int i=1;i<=cnt;i++) cout<<num[i]<<" ";cout<<endl;
		ll curs=0,ans=0;
		for(int i=1;i<=cnt;i++) q.insert({i,num[i]}),pre[i]=i-1,nxt[i]=i+1;
		nxt[0]=1;pre[cnt+1]=cnt;
		for(int i=1;i<=cnt;i++)
		{
			if(!q.size()) break;
			auto dq=q.begin();
//			cout<<(*dq).p<<" "<<(*dq).v<<endl;
			ans+=(*dq).v-curs;curs=(*dq).v;q.erase(dq);
			int p=(*dq).p;num[p]=0;
			if(pre[p]==0||nxt[p]==cnt+1)
			{
				pre[nxt[p]]=pre[p];
				nxt[pre[p]]=nxt[p];
				continue;
			}
			// del pre,add nxt
			auto d1=q.find({pre[p],num[pre[p]]});q.erase(d1);
			auto d2=q.find({nxt[p],num[nxt[p]]});q.erase(d2);
			num[nxt[p]]+=num[pre[p]]-curs;num[pre[p]]=0;
			q.insert({nxt[p],num[nxt[p]]});
			nxt[pre[pre[p]]]=nxt[p];
			pre[nxt[p]]=pre[pre[p]];
		}
		cout<<ans<<endl;
		for(int i=1;i<=n;i++) a[i]=0;
		for(int i=0;i<=cnt+1;i++) pre[i]=nxt[i]=num[i]=0;q.clear();
	}
	return 0;
}
2023/1/10 21:53
加载中...