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. lvm 磁盘扩容

    LVM磁盘管理 一.LVM简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘 ...

  2. Java接口自动化测试实战笔记

    综述 代码管理工具Git 测试框架 TestNG 测试报告 Mock 接口框架 HTTP 协议接口 测试框架 HttpClient SprintBoot 自动化测试开发 数据持久层框架 MyBatis ...

  3. Java的动态代理Proxy

    概念梳理: 1.什么是动态代理? 答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实.代理一般会实现它所表示的实际对象的接口.代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际 ...

  4. 理解 TCP/IP 三次握手与四次挥手

    TCP建立连接为什么是三次握手,而不是两次或四次? TCP,名为传输控制协议,是一种可靠的传输层协议,IP协议号为6. 顺便说一句,原则上任何数据传输都无法确保绝对可靠,三次握手只是确保可靠的基本需要 ...

  5. 【记录】MongoDB

    什么情况建议使用MongoDB? 1:满足对数据库的高并发读写 2:对海量数据的高效存储和访问 3:对数据库高扩展性和高可用性 4:灵活的数据结构,满足数据结构不固定的场景 5:应用需要2000-30 ...

  6. Codeforces 356D 倍增优化背包

    题目链接:http://codeforces.com/contest/356/problem/D 思路(官方题解):http://codeforces.com/blog/entry/9210 此题需要 ...

  7. Vue-cli使用prerender-spa-plugin插件预渲染和配置cdn

    参考:https://www.jianshu.com/p/6a4c0b281e7f 使用vue-cli打包项目一般为spa项目,众所周知单页面应用不利于SEO,有ssr和预渲染两种解决方案,这里我们只 ...

  8. SVN连接不上仓库,问题之一

    如果之前用过SVN,在新的地址上用,发现一直连不上,报错.有可能是因为默认使用了之前的地址,所以没弹出输账号和密码的弹框. 解决方法就是:把之前的链接地址全部清除掉. 右键找到SVN里面的  Sett ...

  9. IDEA使用Maven搭建JavaWeb项目

    1. 新建项目 2. 填写项目坐标信息 3. 手动生效pom.xml 4. 添加maven常用配置 1) 设置项目统一编码 <!-- 设置编码 --> <properties> ...

  10. makefile 中的patsubst

    1. wildcard:扩展通配符 2. notdir:去除路径 3. patsubst:替换通配符 若有一个makefile如下: src=$(wildcard *.c ./sub/*.c) dir ...