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. 百度分布式配置管理平台-Disconf

    Disconf介绍 全称:Distributed Configuration Management Platform,即分布式配置管理平台. Disconf专注于各种分布式系统配置管理的通用组件和通用 ...

  2. Php 十六进制短浮点数转十进制,带符号位

    /** * 十六进制浮点型转为十进制 * @param String $strHex 十六进制浮点数 * @return 十进制 */ public static function hexToDecF ...

  3. SpringMVC学习(2):经典的HelloWorld实现

    前一篇简单介绍了Spring MVC的一些知识,下面就要开始学习如何把Spring MVC运用到具体的项目中去. 首先还是从一个简单的Hello World项目说起: 我机器的开发环境为: Ubunt ...

  4. Centos,tomcat

    1.下载tomcat9.0,解压,配置 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.21/bin/apa ...

  5. 联想think system sr550信息

    带外管理口 默认IP地址:192.168.70.125 默认用户名密码 USERID PASSW0RD    0是数字0

  6. Sass--伪类嵌套

    其实伪类嵌套和属性嵌套非常类似,只不过他需要借助`&`符号一起配合使用. a { &:link, &:visited { color: blue; } &:hover ...

  7. MD5文件去重

    //计算文件的MD5码 private string getMD5Hash(string pathName) { string strResult = ""; string str ...

  8. C语言集成开发环境使用小记

    时隔6年,我又重操C语言,是什么让我如此再下定决心?就是不想让自己所学过的知识就此荒废了,我重新以一个C语言初学者的身份(当然,稍稍有点基础,以前的知识忘得没这么快^_^)温故C语言,学习了几天,果真 ...

  9. boost库:多线程

    1.线程管理 最重要的一个类是boost::thread,是在boost/thread.hpp里定义的,用来创建一个新线程. #include <boost/thread.hpp> #in ...

  10. php str_shuffle()函数 语法

    php str_shuffle()函数 语法 str_shuffle()函数怎么用? php str_shuffle()函数用于随机的打乱字符串中所有字符,语法是str_shuffle(string) ...