您的位置:首页 > 其它

UVA 1451 Average(斜率优化)

2016-10-14 22:59 423 查看
题解紫书第八章例题8。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define ss(x) scanf("%d",&x)
const int maxn=100000+10;
int f[maxn],q[maxn];
char s[maxn];
int n,L;
int compare_average(int x1,int x2,int x3,int x4) {return (f[x2]-f[x1-1])*(x4-x3+1)-(f[x4]-f[x3-1])*(x2-x1+1);}
int main()
{
int kase;
ss(kase);
while(kase--)
{
ss(n);ss(L);
scanf("%s",s+1);
f[0]=0;
rep(i,1,n) f[i]=f[i-1]+s[i]-'0';
int i=0,j=0,ansL=0,ansR=L;
rep(t,L,n)
{
while(j-i>1&&compare_average(q[j-2],t-L,q[j-1],t-L)>=0) j--;//先放进队列里,然后再调整跳出队列。
q[j++]=t-L+1;
while(j-i>1&&compare_average(q[i],t,q[i+1],t)<=0) i++;
int c=compare_average(q[i],t,ansL,ansR);
if(c>0||(c==0&&t-q[i]<ansR-ansL)){
ansL=q[i],ansR=t;
}
}
printf("%d %d\n",ansL,ansR);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: