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. bstToDoublyList

    bstToDoublyList */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} ...

  2. windows修改docker的默认存放位置

    docker默认存储到c盘,我需要移动到其他盘. 参考了网上很多资料,结果要么移动不了,要么重启docker就回到c盘了. 最后参考docker的官方论坛,找到了解决方案.https://forums ...

  3. ollvm 新增字符串加密功能

    好久没弄ollvm了,可以继续了,今天给ollvm新增了一个pass,用来加密字符串,这个pass是从别的库里面扒出来的. 本文是基于在Windows 上使用VS2017编译出来的ollvm,在这个基 ...

  4. 轻松上手nodeJs爬取想要页面的数据

    开始之前请先确保自己安装了Node.js环境!!!!!!!! 1.在项目文件夹安装两个必须的依赖包 npm install superagent -S SuperAgent(官网是这样解释的) --- ...

  5. elasticsearch Java High Level REST 相关操作封装

    pox.xml文件添加以下内容 <dependency> <groupId>org.elasticsearch.client</groupId> <artif ...

  6. springboot中xml配置之@ImportResource

    springboot中进行相关的配置往往有java配置和xml配置两种方式. 使用java的方式配置只需要使用@configuration注解即可,而使用xml的方式配置的话需要使用@ImportRe ...

  7. 【转载】linux查看端口状态相关命令

    具体命令移步:https://www.cnblogs.com/cxbhakim/p/9353383.html

  8. 你(可能)不知道的 web api

    转自奇舞周刊 简介 作为前端er,我们的工作与web是分不开的,随着HTML5的日益壮大,浏览器自带的webapi也随着增多.本篇文章主要选取了几个有趣且有用的webapi进行介绍,分别介绍其用法.用 ...

  9. ERROR 2003 (HY000): Can't connect to MySQL server on '129.28.149.240' (111) mysql 无法远程连接

    环境: ubuntu  mysql 一. 查看端口 可以看到mysql监控的是本机Ip root@jiang:/etc/mysql/mysql.conf.d# netstat -apn|grep 33 ...

  10. C语言数组,指针小案例

    /* ============================================================================ Name : hello.c Autho ...