uva 1451 - Average 数形结合

简介:

     数形结合那篇论文的例题,维护一个下凸队列,一开始为了省事,用了栈,但是原理上有问题,因为有可能正好起点为上凸点的情况,WA了好多次……


/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int org[100005],l,r;
struct node
{
    int v,ind;
    node(int a,int b)
    {
        v=a;
        ind=b;
    }
    node(){}
};
node q[100005];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,L;
        scanf("%d%d",&n,&L);
        while(getchar()!='\n');
        int i;
        int now=0;
        int aa=0,ab=0;
        for(i=1;i<=n;i++)
        {
            if(getchar()=='1')now++;
            org[i]=now;
        }
        r=0;
        q[r++]=node(0,-1);
        q[r++]=node(0,0);
        l=1;
        int ta=-1,tb=0;
        for(int k=L;k<=n;k++)
        {
            i=k-L;
            while(l<r-1&&(((org[i]-q[r-2].v)*(i-q[r-1].ind))-(org[i]-q[r-1].v)*(i-q[r-2].ind))>=0)
               r--;
            q[r++]=node(org[i],i);
            while(l<r-1&&(((org[k]-q[l+1].v)*(k-q[l].ind))-(org[k]-q[l].v)*(k-q[l+1].ind))>=0)
               l++;
            if(((org[k]-q[l].v)*tb-ta*(k-q[l].ind))>0||(((org[k]-q[l].v)*tb-ta*(k-q[l].ind))==0&&(k-q[l].ind)<(ab-aa+1)))
            {
                aa=q[l].ind+1;
                ab=k;
                ta=(org[k]-q[l].v);
                tb=(k-q[l].ind);
            }
        }
        printf("%d %d\n",aa,ab);
    }
}


目录
相关文章
UVa11565 - Simple Equations
UVa11565 - Simple Equations
54 0
uva167 The Sultan's Successors
uva167 The Sultan's Successors
49 0
HDU-1057,A New Growth Industry(理解题意)
HDU-1057,A New Growth Industry(理解题意)
概率论 --- Uva 11181 Probability|Given
Uva 11181 Probability|Given  Problem's Link:   http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18546   Mean:  n个人去逛超市,第i个人会购买东西的概率是Pi。
1023 0
|
人工智能 iOS开发
uva 10137 The trip
/* The trip 注意特殊数据的处理,误差不超过0.01即可。 */#include&lt;iostream&gt; #include&lt;cstdio&gt; using namespace std; double a[1005]; int main() { // freopen("./pcio/110103.inp","r",stdin); int n,i;
949 0

热门文章

最新文章