码迷,mamicode.com
首页 > 其他好文 > 详细

uva 1451(树形结合)

时间:2017-08-19 11:11:26      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:clu   algo   str   return   names   can   ring   etc   getc   

求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(树形结合)

标签:clu   algo   str   return   names   can   ring   etc   getc   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!