比赛 20110414 评测结果 WWWWWWWWWWWWTTT
题目名称 奶牛的跳格子游戏 最终得分 0
用户昵称 Citron酱 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-04-14 10:07:39
显示代码纯文本
#include <fstream>
#include <cstdlib>

#define I_F "hop.in"
#define O_F "hop.out"
#define MAXn 250000

using namespace std;

long long ans;
long s[MAXn];
long d[MAXn];
bool f[MAXn]={false};
long long dy[MAXn];
long n,k,m;

void Input();
inline void Swap(long&,long&);
inline long long Max(long long,long long);
long long Dynap();
void Qsort(long,long);
void Interval(long,long&,long&,long&,long&);
inline void Cut(long);
void Search();
void Output();

int main()
{
	Input();
	if (k==1)
		if (s[0]>0)
			ans=s[0];
		else
			ans=0;
	else if (k==2)
		ans=Dynap();
	else
		Qsort(0,m-1),
		Search();
	Output();
}

void Input()
{
	ifstream fin(I_F);
	fin>>n>>k;
	for (long i=0; i<n; i++)
	{
		fin>>s[i],
		ans+=s[i];
		if (s[i]<0)
			d[m++]=i;
	}
	fin.close();
}

inline void Swap(long &a, long &b)
{
	long t=a;
	a=b;
	b=t;
}

inline long long Max(long long a, long long b)
{
	return (a>b)?a:b;
}

long long Dynap()
{
	dy[0]=s[0];
	for (long i=1; i<n; i++)
		dy[i]=dy[i-1]+s[i];
	
	long long t=0;
	for (long i=0; i<n; i++)
		t=Max(t,dy[i]);
	return t;
}

void Qsort(long l, long r)
{
	long x=d[l+rand()%(r-l+1)];
	long i=l, j=r;
	do
	{
		while (s[d[i]]<s[x]) i++;
		while (s[d[j]]>s[x]) j--;
		if (i<=j)
			Swap(d[i++],d[j--]);
	} while (i<j);
	if (l<j) Qsort(l,j);
	if (i<r) Qsort(i,r);
}

void Interval(long x, long &l, long &r, long &cl, long &cr)
{
	for (l=x-1; (l>=0)&&(f[l]); l--);
	l++;
	for (r=x+1; (r<n)&&(f[r]); r++);
	r--;
	for (cl=1; (l-cl>=0)&&(!f[l-cl]); cl++);
	cl--;
	for (cr=1; (r+cr<n)&&(!f[r+cr]); cr++);
	cr--;
}

inline void Cut(long x)
{
	f[x]=true,
	ans-=(s[x]<0)?(-s[x]):s[x];
}

void Search()
{
	long l,r,cl,cr;
	#define CL ((cl>1)||(cl==0))
	#define CR ((cr>1)||(cr==0))
	#define FL ((r-l+1)<k-1)
	for (long i=0; i<m; i++)
	{
		Interval(d[i],l,r,cl,cr);
		if (FL&&CL&&CR)
			Cut(d[i]);
		else if (((r-l+1)<k-2)&&CR&&(cl==1)&&((s[l-1]<-s[d[i]])))
			Cut(d[i]),
			Cut(l-1);
		else if (((r-l+1)<k-2)&&CL&&(cr==1)&&(s[r+1]<-s[d[i]]))
			Cut(d[i]),
			Cut(r+1);
		else if (((r-l+1)<k-3)&&(cl==1)&&(cr==1)&&(s[l-1]+s[r-1]<-s[d[i]]))
		{
			Cut(d[i]);
			Cut(l-1);
			Cut(r+1);
		}
	}
}

void Output()
{
	ofstream fout(O_F);
	fout<<ans<<'\n';
	fout.close();
}