比赛 |
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();
}