uva 1451(树形结合)

Posted 发牌员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva 1451(树形结合)相关的知识,希望对你有一定的参考价值。

求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(树形结合)的主要内容,如果未能解决你的问题,请参考以下文章

uva 1451 数形结合

UVa 1451 Average -斜率优化

UVA 1451Average

UVA1451 Average

UVa 1451 Average (斜率优化)

uva 1451 平均值