• BZOJ[1367][Baltic2004]Sequence 可并堆


    先考虑两种特殊情况:
    ①若\(t_1<t_2<t_3<…<t_n\)
    则对于每一个\(z_i=t_i\),此时最小\(R\)\(0\)
    ②若\(t_1>t_2>t_3>…>t_n\)
    则对于每一个\(z_i=(t_1…t_n)\)的中位数,此时\(R\)最小,
    下面是我瞎证明的过程:
    这里写图片描述
    对于情况②,我们对每一个\(z_i\)取中位数(红色部分),则\(R\)为这些绿色部分


    这里写图片描述
    如改变所取的值(如图,取较大于中位数的数),则会发现前面的数减少了棕色部分,后面的数减小了紫色部分,发现这两部分事实上是相等的,前后的总和并没有改变,但R值却多了中间的那一部分(画圈部分),得证,偶数情况与其类似,在此不做赘述


    我们可以将原序列分割成许多单调递减的序列,这些序列所有数都取他们的中位数
    但是我们要求的是上升序列而不是不下降序列,所以需要将输入的\(t_i\)处理成\(t_i-i\)


    首先我们把\(a_k+_1\)作为一个新区间直接加入队尾,令\(w_m+_1=a_k+_1\),然后不断检查队尾两个区间的中位数\(w_m\)\(w_m+_1\),如果\(w_m>w_m+_1\),我们需要将最后两个区间合并,并找出新区间的最优解(也就是序列a中,下标在这个新区间内的各项的中位数)。重复这个合并过程,直至\(w_1≤w_2≤…≤w_m\)时结束,然后继续处理下一个数。


    代码如下:

    #include<algorithm>
    #include<cstdlib>
    #include<cstdio>
    #define N 1000600
    using namespace std;
    int size[N],ch[N][2],a[N],root[N],l[N],r[N],tot[N],top,n;
    long long ans=0ll;
    int merge(int x,int y){
        if(!x) return y;if(!y) return x;
        if(a[x]<a[y]) swap(x,y);
        ch[x][1]=merge(ch[x][1],y);
        size[x]=size[ch[x][1]]+size[ch[x][0]]+1;
        swap(ch[x][0],ch[x][1]);
    return x;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",a+i),a[i]-=i;//要求单调递增
        for(int i=1;i<=n;i++){//root:这段区间的中位数
            l[++top]=r[top]=root[top]=i;//l:这段区间包含的最左边的点,r:这段区间包含的最右边的点
            tot[top]=size[i]=1;//tot:这个区间包含多少个数 size:
            while(top>1&&a[root[top-1]]>a[root[top]]){
                r[--top]=r[top+1]; tot[top]+=tot[top+1];
                root[top]=merge(root[top],root[top+1]);//将这个点合并到上一个序列里
                //下面的过程是将中位数调到堆顶(不断删除堆顶)
                while(size[root[top]]*2>tot[top]+1) root[top]=merge(ch[root[top]][0],ch[root[top]][1]);
            }
        }
        for(int i=1;i<=top;i++)
            for(int j=l[i];j<=r[i];j++)
                ans+=(long long)abs(a[j]-a[root[i]]);
    return printf("%lld",ans),0;
    }
    
    
  • 相关阅读:
    Exchange 2013与 Office Web Apps 整合
    SharePoint2013 以其他用户登录和修改AD域用户密码 功能
    sharepoint 2010 自定义页面布局
    sharepoint 2010 记录管理 对象模型
    SharePoint2010 对象模型 关联列表
    在SharePoint Server 2010中更改“我的网站”
    xenapp 6.5 客户端插件第一次安装总是跳到官网
    如何解决在Windows Server 2008 R2 上安装证书服务重启后出现 CertificationAuthority 91错误事件
    在Win7 Hyper-v虚拟机中挂接真实机的声卡
    win8 中如何删除 共享文件夹 用户名和密码
  • 原文地址:https://www.cnblogs.com/Duan2baka/p/8674392.html
Copyright © 2020-2023  润新知