首页 > 其他 > 详细

uva 1451(树形结合)

时间:2017-08-19 10:30:20      阅读:254      评论:0      收藏:0      [点我收藏+]

求y/x的最大,其实就是求斜率最大

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100000+10;
char ss[maxn];
int sum[maxn],q[maxn];
int n,m,t;
int solve(int x1,int x2,int x3,int x4)
{
     return (sum[x2]-sum[x1])*(x4-x3)-(sum[x4]-sum[x3])*(x2-x1);
}
int main()
{
     scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
         getchar();
          scanf("%s",ss+1);
          getchar();
      sum[0]=0;
      for(int i=1;i<=n;i++)
        sum[i]=sum[i-1]+ss[i]-0;//求前缀和,也就是y
      int i=0,j=0;
      int ll=0,rr=m;
       for(int l=m;l<=n;l++)//以l结尾的点
       {
             while(i<j-1&&solve(q[j-2],q[j-1],q[j-1],l-m)>0) j--;//维护前端,使其出现凹形
             q[j++]=l-m;
             while(i<j-1&&solve(q[i],l,q[i+1],l)<=0) i++;//找到以l为结尾的凹形的切线,前面的点都不要
              int mm=solve(ll,rr,q[i],l);
              if(mm<0||m==0&&(l-q[i]<rr-ll))//如果斜率更大,则取更大的
              {
                  rr=l;
                  ll=q[i];
              }
       }
      printf("%d %d\n",ll+1,rr);
    }
    return 0;
}

 

uva 1451(树形结合)

原文:http://www.cnblogs.com/Wangwanxiang/p/7395569.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!