original link - http://codeforces.com/problemset/problem/1220/F

题意:

对出一个序列,你可以对其循环左移,问循环左移几次后,这个序列构造出的笛卡尔树层数最少。

解析:

我们可以先拎起最小的点,那么左边xxx,右边n−1−xn-1-xn−1−x。一边的长度为iii的树可以从长度为i−1i-1i−1的树得到。所以就是一边维护笛卡尔树,一边记录答案。

用dpdpdp记录每个点左儿子的最深层数,假设新进入一个没有左儿子的点,层数就是当前栈的大小。如果有左儿子,那么dp=max(dpson+1)dp=max(dp_{son}+1)dp=max(dpson​+1)。

代码:

/**  Author : Jk_Chen*    Date : 2019-09-20-11.05.10*/
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define per(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pill pair<int, int>
#define fi first
#define se second
#define debug(x) cerr<<#x<<" = "<<x<<'\n';
const LL mod=1e9+7;
const int maxn=2e5+9;
LL rd(){ LL ans=0; char last=' ',ch=getchar();while(!(ch>='0' && ch<='9'))last=ch,ch=getchar();while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();if(last=='-')ans=-ans; return ans;
}
/*_________________________________________________________begin*/int tmp[maxn];
int a[maxn];
int sta[maxn],top,val[maxn];int dpl[maxn],dpr[maxn];void init(int n,int *dp){top=0;int mx=0;rep(i,1,n){int ma=0;while(top&&a[sta[top]]>a[i]){ma=max(ma,val[top]);top--;}sta[++top]=i;if(ma==0){val[top]=top;}else{val[top]=ma+1;}dp[i]=(mx=max(mx,val[top]));}
}int main(){int n=rd();if(n==1)return 0*printf("%d %d\n",1,0);int mi=1e9,rt;rep(i,1,n){tmp[i]=rd();if(tmp[i]<mi)mi=tmp[i],rt=i;}for(int i=1,j=rt-1;i<n;i++,j--){if(j<1)j+=n;a[i]=tmp[j];}init(n-1,dpl);for(int i=1,j=rt+1;i<n;i++,j++){if(j>n)j-=n;a[i]=tmp[j];}init(n-1,dpr);int ans=1e9,__;rep(i,0,n-1){if(ans>1+max(dpl[i],dpr[n-1-i])){ans=1+max(dpl[i],dpr[n-1-i]);__=rt-(i+1);}}if(__<0)__+=n;printf("%d %d\n",ans,__);
}

1220F - Gardener Alex(笛卡尔树)相关推荐

  1. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

  2. [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...

  3. 洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在一个数对 ( i , j ) 如果满足 a[ i ] * a[ j ] <=max( a[ i ] ~ a[ j ] ),则称其 ...

  4. 牛客多校3 - Sort the Strings Revision(笛卡尔树+分治)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数字串 s[ 0 ],每个位置的赋值初始时为 s[ i ] = i % 10 ( i ∈ [ 0 , n - 1 ] ),现在有一个长度为 n 的排 ...

  5. 牛客 - sequence(笛卡尔树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...

  6. POJ - 2559 Largest Rectangle in a Histogram(笛卡尔树,单调栈实现)

    题目链接:点击查看 题目大意:给出一排高度不同,宽度都为 1 的矩形,问拼起来后最大的矩形面积是多少 题目分析:普通做法是用单调栈直接维护,我一直觉得单调栈处理这种矩形问题都比较抽象,也可能是我太菜了 ...

  7. POJ - 2201 Cartesian Tree(笛卡尔树-单调栈/暴跳父亲)

    题目链接:点击查看 题目大意:给出n个节点的key和val,构造出其笛卡尔树的原型 笛卡尔树的定义: 所谓笛卡尔树,就是将给定的n个二元组(key,val)建成一棵树.使得: 如果只关注key,那么这 ...

  8. HDU1506(天然的笛卡尔树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意:给定一个统计直方图,n个矩形条,每个矩形条宽1,高0-10^9,求最大矩形面积. 分析:天然的 ...

  9. POJ1785(笛卡尔树的构造)

    题目:http://poj.org/problem?id=1785 题意:构造笛卡尔树,这里是最大堆构造,然后以广义表的形式输出这棵笛卡尔树. #include <iostream> #i ...

最新文章

  1. html标签的赋值与取值
  2. 科学家都解决不了的5个“简单”算法,你不来看看?
  3. 苦修月余,斩获bigo、腾讯offer,面经奉上!
  4. matlab中表示拉普拉斯分布_CHAPT1:场论;电磁学和微波学的基本的数学手段和表示...
  5. Android中的任务栈
  6. 【C 语言】字符串模型 ( 字符串翻转模型 )
  7. shell中字符串基本用法
  8. Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 二进制拆位+树型dp
  9. Shell(11)——awk(1)
  10. linux cocos2dx 配置文件,Linux开发cocos2dx程序环境搭建
  11. 教你使用 IDEA 配置和运行vue项目
  12. Meteor:用户账号管理添加密码和微博weibo账号系统支持
  13. 小程序入门学习07--动态设置标题、转发
  14. python 下载图片到内存卡_python-23:将图片下载到本地
  15. c# redies 安装 和使用
  16. CentOS 6.2 + CUPS + AirPrint for iOS
  17. VUE源码解析(持续更新)
  18. 技嘉服务器主板装系统,技嘉主板bios设置图解教程
  19. 玩游戏提示计算机内存不足,Win10玩吃鸡游戏提示“虚拟内存不足”怎么办?
  20. 计算机怎样设置桌面照片,怎么把一张照片设置成适合自己电脑桌面的壁纸

热门文章

  1. kubernetes二进宫系列——Kubernetes TLS BootStrapping流程引导分析
  2. macOS系统安装软件提示已损坏无法打开
  3. windows8 更新与升级
  4. 手机上的设计师:这个电子画册制作小程序让你随时随地创作
  5. 前列腺癌的发病率统计及诊断方法
  6. NKOJ P3631 密码锁
  7. 给我五分钟,给你一片“云”
  8. web前端包括哪些技术?
  9. 口碑网重出江湖一年多,现在成啥样了?
  10. dota2已连接协调服务器,正在登陆中的解决办法