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. IE兼容模式下样式分离错乱,求CSS高手

    IE正常模式下访问正常 兼容模式右边图片切换区域样式错乱,求CSS高手! 详细参考网址:www.javams.com

  2. C++中的类型转换函数

    1,转换构造函数可以将普通的基础类型转换为当前的类类型,也有能力将其它类类 型的对象转换为当前的类类型: 2,问题: 1,类类型是否能够类型转换到普通类型? 1,可以的: 3,类型转换函数: 1,C+ ...

  3. 对python中的__name__的理解

    一开始学习python的时候,不理解python中的__name__的用途,一致感觉__name__的返回结果就是__main__ 今天系统的看了一下,才理解过来,__name__真正的用处是用在使用 ...

  4. Groovy学习:第五章 学习回顾groovy

    一.groovy是什么 简单地说,Groovy 是下一代的java语言,跟java一样,它也运行在 JVM 中. 作为跑在JVM中的另一种语言,groovy语法与 Java 语言的语法很相似.同时,G ...

  5. CentOS 7 virtualenv创建python3与python2的环境&&运行项目

    (一)安装virtualenv  可以 yum -y install python-virtualenv  或者pip install python-virtualenv (二)在希望的路径下,创建e ...

  6. JDBC中如何进行事务处理?

    Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务:当事务完成后用commit()显式提交事务:如果在事务处理过程中发生异常则通过rollb ...

  7. jquery 选项卡切换 带背景图片

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  8. css3 实现可以中英切换的导航条

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  9. 简易的Master-Worker框架

    Master-Worker模式是一种使用多线程进行数据处理的结构,多个worker进程协作处理用户请求,master进程负责维护worker进程,并整合最终处理结果 主要参与者 Worker:用于实际 ...

  10. [CSP-S模拟测试]:E(贪心)

    题目传送门(内部题48) 输入格式 第一行一个整数$n$.接下来$n$行每行两个整数$x_i,y_i$. 输出格式 一行一个整数表示答案. 样例 样例输入$1$: 23 72 5 样例输出$1$: 样 ...