zoukankan      html  css  js  c++  java
  • poj3666&&bzoj1592

    题解:

    和bzoj1367差不多

    然后a[i]-i不用加

    然后我再另一个地方加了这句话

    然后poj ac,bzoj wa

    poj数据水啊

    代码:

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=1000005;
    long long ans,ans1,ans2;
    int rt[N],cnt,r[N],c[N][2],dist[N],val[N],tot,size[N],n,a[N],l[N];
    int merge(int x,int y)
    {
        if (!x||!y)return x+y;
        if (val[x]<val[y])swap(x,y);
        c[x][1]=merge(c[x][1],y);
        size[x]=size[c[x][0]]+size[c[x][1]]+1;
        if (dist[c[x][0]]<dist[c[x][1]])swap(c[x][0],c[x][1]);
        dist[x]=dist[c[x][1]]+1;
        return x;
    }
    void pop(int &x){x=merge(c[x][0],c[x][1]);}
    int newnode(int x)
    {
        val[++tot]=x;
        size[tot]=1;
        c[tot][0]=c[tot][1]=dist[tot]=0;
        return tot;
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)scanf("%d",&a[i]);
        for (int i=1;i<=n;i++)
         {
             rt[++cnt]=newnode(a[i]);
             l[cnt]=r[cnt]=i;
             while (cnt>1&&val[rt[cnt-1]]>val[rt[cnt]])
              {
                 cnt--;
                rt[cnt]=merge(rt[cnt],rt[cnt+1]);
                r[cnt]=r[cnt+1];
                while (size[rt[cnt]]*2>r[cnt]-l[cnt]+2)pop(rt[cnt]);
             } 
         }
        for (int i=1;i<=cnt;i++)
         {
             int t=val[rt[i]];
             for (int j=l[i];j<=r[i];j++)
             ans1+=abs(t-a[j]);
         }
        ans=ans1; 
        memset(val,0,sizeof val);
        memset(rt,0,sizeof rt);
        memset(c,0,sizeof c);
        memset(dist,0,sizeof dist); 
        memset(l,0,sizeof l);
        memset(r,0,sizeof r);
        memset(size,0,sizeof size);
        tot=cnt=0;
        for (int i=1;i<=n/2;i++)swap(a[i],a[n-i+1]);
        for (int i=1;i<=n;i++)
         {
             rt[++cnt]=newnode(a[i]);
             l[cnt]=r[cnt]=i;
             while (cnt>1&&val[rt[cnt-1]]>val[rt[cnt]])
              {
                 cnt--;
                rt[cnt]=merge(rt[cnt],rt[cnt+1]);
                r[cnt]=r[cnt+1];
                while (size[rt[cnt]]*2>r[cnt]-l[cnt]+2)pop(rt[cnt]);
             } 
         }
        for (int i=1;i<=cnt;i++)
         {
             int t=val[rt[i]];
             for (int j=l[i];j<=r[i];j++)
             ans2+=abs(t-a[j]);
         }     
        ans=min(ans,ans2); 
        printf("%lld",ans); 
    }
  • 相关阅读:
    基于微软平台IIS/ASP.NET开发的大型网站
    谈谈用ASP.NET开发的大型网站有哪些架构方式(成本)
    微软Expression Blend基础教程系列
    Silverlight类库介绍FJCore
    Blend基础数据绑定
    Windows Embedded 版 Silverlight “Cashmere”
    Blend基础动画
    Blend基础控件与用户控件
    Silverlight 4 新特性归纳整理
    SQL经典短小代码收集
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8053320.html
Copyright © 2011-2022 走看看