CF1220F

把整棵树分成1的左边和1的右边两部分

最优情况两边子树深度的差一定可以是一

如果还可以是2,也可以通过把多的那一边的点往另一边移使他变成1

如果往一个端点加点,一定不会使这一边变优,也不会使另一边变劣

所以可以二分去找这个区间


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

const int M = 2000011*2;
int n,m,k,a[M/4],mn[M],pos1,pos2;

void built(int now,int l,int r)
{
    if(l==r)
    {
        mn[now]=l;
        return ;
    }
    int mid=(l+r)>>1;
    built(now*2,l,mid); built(now*2+1,mid+1,r);
    if(a[mn[now*2]]<a[mn[now*2+1]]) mn[now]=mn[now*2];
    else mn[now]=mn[now*2+1];
}

int ask(int now,int l,int r,int L,int R)
{
    if(l>=L && r<=R) return mn[now];
    int mid=(l+r)>>1,tmp=0,k;
    if(L<=mid) tmp=ask(now*2,l,mid,L,R);
    if(R>mid)
    {
        k=ask(now*2+1,mid+1,r,L,R);
        if(!tmp || a[k]<a[tmp]) tmp=k;
    }
    return tmp;
}

int dfs(int l,int r)
{
    if(l>r) return 0;
    if(l==r) return 1;
    int x=ask(1,1,n+n+n,l,r);
    return max(dfs(l,x-1),dfs(x+1,r))+1;
}

int check(int l,int r)
{
    int x;
    if(r>=pos2) x=pos2;
    else x=pos1;
    int y=dfs(l,x-1)-dfs(x+1,r);
    return y;

}

int main()
{
    scanf("%d",&n); memset(mn,0x3f,sizeof(mn));
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i+n]=a[i+n+n]=a[i];
    for(int i=1;i<=n;i++) if(a[i]==1) pos1=i, pos2=i+n;
    built(1,1,n+n+n);
    int l=pos1,r=pos2-1,mid,tmp=0;
    while(l<=r)
    {
        mid=(l+r)>>1;
        if(check(mid,mid+n-1)>=0) tmp=mid, l=mid+1;
        else r=mid-1;
    }
    printf("%d %d",dfs(tmp,tmp+n-1),(tmp-1)%n);

}

CF1220F的更多相关文章

  1. 单调栈+线段树——cf1220F

     首先考虑初始排列,pi会让周围所有比其大的元素深度+1,所以要求每个点的深度,只要其被覆盖了几次即可 这个覆盖可以通过处理每个元素的左右边界(单调栈O(n))+线段树区间更新(Ologn(n))来做 ...

  2. 在$CF$水题の记录

    CF1158C CF1163E update after CF1173 很好,我!expert!掉rating了!! 成为pupil指日可待== 下次要记得合理安排时间== ps.一道题都没写的\(a ...

随机推荐

  1. golang的数据类型之布尔类型

    1)布尔类型也叫 bool类型,bool类型数据只允许取值true或false2)bool类型占1个字节.3)bool类型适于逻辑运算,一般用于程序流程控制4)不可以0或非0的整数替代false和tr ...

  2. 解决MVC中textarea出现多余空格的问题

    public static MvcHtmlString FixedTextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> ...

  3. docker的入门简介

    可能写的不是很完美,需要大家指正修改和意见(谢谢合作) docker的入门: docker的好处: 1.更快交付你的应用(Faster delivery of your applications) 2 ...

  4. Linux操作练习

    打印显示当前时间,格式是:20181209211008 [root@Centos7 ~]#date "+%Y%m%d%H%M%S" 实现晚上20:30自动关机 [root@Cent ...

  5. 数据索引文件idx

    数据索引文件idx 数据索引文件idx 数据索引文件idx

  6. python 环境变量的配置

    1. 打开python安装目录 2.将python.exe重名为python3.exe 3.在环境变量的path中,添加python3的目录 4.将pip.exe的目录页添加到path中,即可完成环境 ...

  7. ivew Upload 上传时附带的额外参数

    <Upload action="/api/device/importData" :data="uploadData" :before-upload=&qu ...

  8. MYSQL中判断函数有哪些

    新建一张客户表,如下:sex:1-男,2-女,3-未知:level是客户的级别:1-超级VIP客户,2-VIP客户,3-普通客户 方式一:case函数:流程控制函数 用法一: CASE express ...

  9. boost pointer container

    1. boost::ptr_vector #include <boost/ptr_container/ptr_vector.hpp> #include <iostream> i ...

  10. shell 根据路径获取文件名和目录

    path=/dir1/dir2/dir3/test.txt echo ${path##*/} 获取文件名 test.txtecho ${path##*.} 获取后缀 txt #不带后缀的文件名temp ...