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 ...
随机推荐
- 【mySQL】left join、right join和join的区别
哈,好久没更新文章了,今天来说说关于mySQL那些年的小事.说到mySQL啊,用了挺久的了,但是有个问题一直在困扰着我,就是left join.join.right join和inner join等等 ...
- [心得]Ubuntu無法ssh登入
裝好ssh後,發覺無法用root登入,可是sshd_config接正確. 後來發現原因在於,Ubuntu沒有root帳號,但是可以透過sudo -s拿到root權限. su root 密碼怎樣打也行不 ...
- Dijkstra的优先队列
模板 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> ...
- go语言从例子开始之Example16.函数递归
Go 支持 递归.这里是一个经典的阶乘示例. Example: package main import "fmt" func fact(n int) int{ //先设置退出条件 ...
- 转帖 Java生成和操作Excel文件
JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...
- mongodb增删改查基础语法
转载:https://blog.csdn.net/u012206617/article/details/91047239 1. use DataBaseName 切换/创建数据库use mydb 2. ...
- js插件-简单拖拽
前端开发的时候,有好多地方用到拖拽效果,当然 http://jqueryui.com/draggable/ 是个不错的选择,but 我是个打破砂锅问到底的人,抽点时间用js小小的实现了类似的插件,话 ...
- 【InnoDB】插入缓存,两次写,自适应hash索引
InnoDB存储引擎的关键特性包括插入缓冲.两次写(double write).自适应哈希索引(adaptive hash index).这些特性为InnoDB存储引擎带来了更好的性能和更高的可靠性. ...
- Linux CentOS-7.4-x86_64(原版) 百度网盘下载
因为CentOS-7-x86_64-DVD-1804.iso 镜像文件4.16G,超出了上传百度网盘的单个文件大小限制(4G), 所以这里先现将ISO镜像文件压缩成RAR包,然后上传网盘. 使用的话, ...
- 设置当内容超出div(文字长度超出div宽度)出现滚动条
overflow 一共有5个属性. 1.overflow:auto:内容会被修剪,超出设置的宽高后会出现滚动条 2.overflow:scroll;内容会被修剪,不管内容是否超出,都会出现滚动条的位置 ...