UVA 1451 Average(斜率优化)

来源:互联网 发布:活动报名系统源码 编辑:程序博客网 时间:2024/06/09 18:59

题解紫书第八章例题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;}


0 0
原创粉丝点击