CF1220F
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的更多相关文章
- 单调栈+线段树——cf1220F
首先考虑初始排列,pi会让周围所有比其大的元素深度+1,所以要求每个点的深度,只要其被覆盖了几次即可 这个覆盖可以通过处理每个元素的左右边界(单调栈O(n))+线段树区间更新(Ologn(n))来做 ...
- 在$CF$水题の记录
CF1158C CF1163E update after CF1173 很好,我!expert!掉rating了!! 成为pupil指日可待== 下次要记得合理安排时间== ps.一道题都没写的\(a ...
随机推荐
- 百度分布式配置管理平台-Disconf
Disconf介绍 全称:Distributed Configuration Management Platform,即分布式配置管理平台. Disconf专注于各种分布式系统配置管理的通用组件和通用 ...
- Php 十六进制短浮点数转十进制,带符号位
/** * 十六进制浮点型转为十进制 * @param String $strHex 十六进制浮点数 * @return 十进制 */ public static function hexToDecF ...
- SpringMVC学习(2):经典的HelloWorld实现
前一篇简单介绍了Spring MVC的一些知识,下面就要开始学习如何把Spring MVC运用到具体的项目中去. 首先还是从一个简单的Hello World项目说起: 我机器的开发环境为: Ubunt ...
- Centos,tomcat
1.下载tomcat9.0,解压,配置 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.21/bin/apa ...
- 联想think system sr550信息
带外管理口 默认IP地址:192.168.70.125 默认用户名密码 USERID PASSW0RD 0是数字0
- Sass--伪类嵌套
其实伪类嵌套和属性嵌套非常类似,只不过他需要借助`&`符号一起配合使用. a { &:link, &:visited { color: blue; } &:hover ...
- MD5文件去重
//计算文件的MD5码 private string getMD5Hash(string pathName) { string strResult = ""; string str ...
- C语言集成开发环境使用小记
时隔6年,我又重操C语言,是什么让我如此再下定决心?就是不想让自己所学过的知识就此荒废了,我重新以一个C语言初学者的身份(当然,稍稍有点基础,以前的知识忘得没这么快^_^)温故C语言,学习了几天,果真 ...
- boost库:多线程
1.线程管理 最重要的一个类是boost::thread,是在boost/thread.hpp里定义的,用来创建一个新线程. #include <boost/thread.hpp> #in ...
- php str_shuffle()函数 语法
php str_shuffle()函数 语法 str_shuffle()函数怎么用? php str_shuffle()函数用于随机的打乱字符串中所有字符,语法是str_shuffle(string) ...