• 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;
    }
    
    
  • 相关阅读:
    int、bigint、smallint 和 tinyint
    SQL Server 2005中修改 Server Collation的方法
    BCP 数据导入问题 Unix系统中的文本文件换行符引发的问题
    如何在不提升用户权限的情况下,使普通用户执行xp_cmdshell存储过程
    【转】分析SQL Server计划缓存
    很多年过去了
    SQL日志收缩
    【转】sql server 测试中一些常看的指标和清除缓存的方法
    反射相关
    js获取UserControl内容,避免拼html的麻烦
  • 原文地址:https://www.cnblogs.com/Duan2baka/p/8674392.html
Copyright © 2020-2023  润新知