Submission #1313138

#TimeUsernameProblemLanguageResultExecution timeMemory
1313138boclobanchatFeast (NOI19_feast)C++20
22 / 100
70 ms101232 KiB
#include<bits/stdc++.h>
using namespace std;
struct node
{
	long long sum,prefl,prefr,fsum;
	int posl,posr,fl,fr;
};
const int MAXN=3e5+5;
const int INF=1e9;
long long A[MAXN];
node merge1(node a,node b)
{
	node c;
	c.sum=a.sum+b.sum;
	if(a.prefl<a.sum+b.prefl) c.prefl=a.sum+b.prefl,c.posl=b.posl;
	else c.prefl=a.prefl,c.posl=a.posl;
	if(b.prefr<b.sum+a.prefr) c.prefr=b.sum+a.prefr,c.posr=a.posr;
	else c.prefr=b.prefr,c.posr=b.posr;
	if(a.fsum<b.fsum) c.fsum=b.fsum,c.fl=b.fl,c.fr=b.fr;
	else c.fsum=a.fsum,c.fl=a.fl,c.fr=a.fr;
	if(c.fsum<a.prefr+b.prefl) c.fsum=a.prefr+b.prefl,c.fl=a.posr,c.fr=b.posl;
	return c;
}
node merge2(node a,node b)
{
	node c;
	c.sum=a.sum+b.sum;
	if(a.prefl>a.sum+b.prefl) c.prefl=a.sum+b.prefl,c.posl=b.posl;
	else c.prefl=a.prefl,c.posl=a.posl;
	if(b.prefr>b.sum+a.prefr) c.prefr=b.sum+a.prefr,c.posr=a.posr;
	else c.prefr=b.prefr,c.posr=b.posr;
	if(a.fsum>b.fsum) c.fsum=b.fsum,c.fl=b.fl,c.fr=b.fr;
	else c.fsum=a.fsum,c.fl=a.fl,c.fr=a.fr;
	if(c.fsum>a.prefr+b.prefl) c.fsum=a.prefr+b.prefl,c.fl=a.posr,c.fr=b.posl;
	return c;
}
pair<node,node> seg[MAXN*4];
bool lazy[MAXN*4];
void flipnode(node& res)
{
	res={-res.sum,-res.prefl,-res.prefr,-res.fsum,res.posl,res.posr,res.fl,res.fr};
}
void flip(int pos)
{
	swap(seg[pos].first,seg[pos].second);
	flipnode(seg[pos].first);
	flipnode(seg[pos].second);
}
void down(int pos)
{
	if(lazy[pos])
	{
		flip(pos*2);
		flip(pos*2+1);
		lazy[pos*2]^=1,lazy[pos*2+1]^=1,lazy[pos]=0;
	}
}
void build(int l,int r,int pos)
{
	if(l==r)
	{
		seg[pos].first={A[l],max(0LL,A[l]),max(0LL,A[l]),max(0LL,A[l]),l,l,l,l};
		seg[pos].second={INF,0,0,0,l,l,l,l};
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,pos*2);
	build(mid+1,r,pos*2+1);
	seg[pos].first=merge1(seg[pos*2].first,seg[pos*2+1].first);
	seg[pos].second=merge2(seg[pos*2].second,seg[pos*2+1].second);
}
void update(int l,int r,int u,int v,int pos)
{
	if(v<l||r<u) return ;
	if(u<=l&&r<=v)
	{
		flip(pos);
		lazy[pos]^=1;
		return ;
	}
	int mid=(l+r)/2;
	down(pos);
	update(l,mid,u,v,pos*2);
	update(mid+1,r,u,v,pos*2+1);
	seg[pos].first=merge1(seg[pos*2].first,seg[pos*2+1].first);
	seg[pos].second=merge2(seg[pos*2].second,seg[pos*2+1].second);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,k;
	cin>>n>>k;
	long long ans=0;
	for(int i=1;i<=n;i++) cin>>A[i];
	build(1,n,1);
	for(int i=1;i<=k;i++)
	{
		int l=seg[1].first.fl,r=seg[1].first.fr;
		int u=seg[1].second.fl,v=seg[1].second.fr;
		if(max(seg[1].first.fsum,seg[1].second.fsum)==0) break;
		if(seg[1].first.fsum>seg[1].second.fsum)
		{
			ans+=seg[1].first.fsum;
			update(1,n,l,r,1);
		}
		else
		{
			ans+=seg[1].second.fsum;
			update(1,n,u,v,1);
		}
	}
	cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...