您的位置:首页 > 其它

高效算法设计专项:LA 4726

2013-05-20 21:25 393 查看
这是一道斜率优化的题目。在《浅谈数形结合思想在信息学竞赛中的应用》中有较为详细的解释,对于细节的实现还是没有完全体会,只能说是似懂非懂。这里我就不班门弄斧了,还是去仔细研究那篇论文吧。

#include <iostream>
#include <cstdio>
using namespace std;
#define M 100010
int n,l;
char d[M];
int q[M],s[M];
int main()
{
freopen("in.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
cin>>n>>l>>d;
s[0]=0;
for(int i=1;i<=n;i++)
{
if(d[i-1]=='1') s[i]=s[i-1]+1;
else s[i]=s[i-1];
}
int head=0,tail=-1;
int beg=1,end=l;
int a=s[l]-s[0],b=l;
for(int i=l;i<=n;i++)
{
int tmp=i-l;
while(head<tail&&(s[tmp]-s[q[tail]])*(q[tail]-q[tail-1])<=(s[q[tail]]-s[q[tail-1]])*(tmp-q[tail])) tail--;
q[++tail]=tmp;
while(head<tail&&(s[i]-s[q[head]])*(i-q[head+1])<=(s[i]-s[q[head+1]])*(i-q[head])) head++;
if((s[i]-s[q[head]])*b==a*(i-q[head])&&b>i-q[head])
{
a=s[i]-s[q[head]];
b=i-q[head];
beg=q[head]+1;
end=i;
}
else if((s[i]-s[q[head]])*b>a*(i-q[head]))
{
a=s[i]-s[q[head]];
b=i-q[head];
beg=q[head]+1;
end=i;
}
}
cout<<beg<<" "<<end<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: