zoukankan      html  css  js  c++  java
  • Luogu P4331 [BOI2004]Sequence 数字序列

    思维题OrzOrz;

    为了方便思考(想不到),我们可以把 (a_i) 减去 (i) ,把严格递增的条件转化为非严格递增的条件。

    首先如果 (a) 递增,我们取 (b_i=a_i) 即可;若 (a) 递减,我们取 (b)(a) 的中位数即可(均分纸牌)。

    而这道题可以运用类似的方法:我们先把每一个元素当做独立的一段,即假设 (b_i=a_i) ;若 (b_{i-1}leq b_i) 则是合法的;若 (b_{i-1}> b_i) 则我们把 (i) 扔进上一段即可;于是会产生很多段(此时不一定),我们只需要用可并堆维护中位数即可。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #define R register int
    #define ll long long
    using namespace std;
    namespace Luitaryi {
    inline int g() { R x=0,f=1;
      register char s; while(!isdigit(s=getchar())) f=s=='-'?-1:f;
      do x=x*10+(s^48); while(isdigit(s=getchar())); return x*f;
    } const int N=1000010;
    int n; int ans[N]; ll anss;
    int ls[N],rs[N],d[N],vl[N];
    inline int merge(int x,int y) {
      if(!x||!y) return x+y;
      if(vl[x]<vl[y]) swap(x,y);
      rs[x]=merge(rs[x],y);
      if(d[ls[x]]<d[rs[x]]) swap(ls[x],rs[x]);
      d[x]=d[rs[x]]+1; return x;
    }
    struct node {int l,r,rt,sz;}stk[N]; int top;
    inline void main() {
      d[0]=-1;
      n=g();
      for(R i=1;i<=n;++i) vl[i]=g()-i;
      for(R i=1;i<=n;++i) {
        ++top,stk[top].l=stk[top].r=i,stk[top].rt=i,stk[top].sz=1;
        while(top&&vl[stk[top-1].rt]>vl[stk[top].rt]) {
          --top;
          stk[top].rt=merge(stk[top].rt,stk[top+1].rt);
          stk[top].r=stk[top+1].r;
          stk[top].sz+=stk[top+1].sz;
          while(stk[top].sz>(stk[top].r-stk[top].l+2)/2) {
            --stk[top].sz;
            stk[top].rt=merge(ls[stk[top].rt],rs[stk[top].rt]);
          }
        }
      } 
      for(R i=1;i<=top;++i)
        for(R j=stk[i].l;j<=stk[i].r;++j) 
          ans[j]=vl[stk[i].rt],anss+=abs(vl[j]-ans[j]);
      printf("%lld
    ",anss);
      for(R i=1;i<=n;++i) printf("%d ",ans[i]+i);
    }
    } signed main() {Luitaryi::main(); return 0;}
    

    2020.01.19

  • 相关阅读:
    char 转string
    博客,记忆的图谱。
    history
    openstack Icehouse发布
    数据库常用命令
    nagios
    screen
    openstack 流量控制
    sublime 3
    磁盘类型
  • 原文地址:https://www.cnblogs.com/Jackpei/p/12215312.html
Copyright © 2011-2022 走看看