P1484 种树

dalao

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
	int pos;
	long long val;
	bool operator < (const node &b) const 
	{
		return val<b.val;
	}
};
priority_queue<node> q;
long long read()
{
	long long s=0,f=1;
	char in=getchar();
	while(in<'0'||in>'9')
	{
		if(in=='-')
			f=-1;
		in=getchar();
	}
	while(in>='0'&&in<='9')
	{
		s=(s<<1)+(s<<3)+in-'0';
		in=getchar();
	}
	return s*f;
}
long long value[500100];
long long data[500100];
long long lef[500100];
long long righ[500100];
bool vis[500100];
int main()
{
	long long n=read(),k=read();
	for(int i=1;i<=n;i++)
	{
		data[i]=read();
		lef[i]=i-1;
		righ[i]=i+1;
	}
	lef[n+1]=n;
	righ[0]=1;
	node pas;
	for(int i=1;i<=n;i++)
	{
		pas.pos=i;
		pas.val=data[i];
		q.push(pas);
	}
	long long ans=0;
	while(k--)
	{
		while(vis[q.top().pos])
			q.pop();
		pas=q.top();
		q.pop();
		if(pas.val<0)
			break;
		ans+=pas.val;
		data[pas.pos]=data[lef[pas.pos]]+data[righ[pas.pos]]-data[pas.pos];
		pas.val=data[pas.pos];
		vis[lef[pas.pos]]=vis[righ[pas.pos]]=true;
		lef[pas.pos]=lef[lef[pas.pos]];
		righ[lef[pas.pos]]=pas.pos;
		righ[pas.pos]=righ[righ[pas.pos]];
		lef[righ[pas.pos]]=pas.pos;
		q.push(pas);
	}
	printf("%lld",ans);
}
posted @ 2018-04-18 21:32  Lance1ot  阅读(113)  评论(0编辑  收藏  举报