首页 > 其他分享 >CF1220F Gardener Alex 题解--zhengjun

CF1220F Gardener Alex 题解--zhengjun

时间:2023-07-14 12:44:23浏览次数:45  
标签:max Alex int 题解 top stk zhengjun ans now

发现根节点一定是 \(1\),所以考虑两边的子树深度,然后发现只需要考虑一段后缀或前缀的深度即可。

所以循环位移后,可以从中间往两边构建笛卡尔树,实时维护深度即可。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+10;
int n,a[N],ans[N];
int top,stk[N],f[N];
int main(){
	scanf("%d",&n);
	if(n==1)return puts("1 0"),0;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	int cur=min_element(a+1,a+1+n)-a;
	rotate(a+1,a+cur,a+1+n);
	for(int i=1,x=0;i<=n;i++){
		int now=0;
		for(;top&&a[stk[top]]>a[i];top--)now=max(now+1,f[stk[top]]);
		stk[++top]=i,f[i]=now+1,x=max(x,top+now);
		ans[(cur-(n-i+1)+n)%n]=x;
	}
	rotate(a+1,a+2,a+1+n);
	memset(f,0,sizeof f);
	for(int i=n,x=top=0;i>=1;i--){
		int now=0;
		for(;top&&a[stk[top]]>a[i];top--)now=max(now+1,f[stk[top]]);
		stk[++top]=i,f[i]=now+1,x=max(x,top+now);
		int id=(cur-(n-i+1)+n)%n;
		ans[id]=max(ans[id],x);
	}
	int id=min_element(ans,ans+n)-ans;
	cout<<ans[id]<<' '<<id;
	return 0;
}

标签:max,Alex,int,题解,top,stk,zhengjun,ans,now
From: https://www.cnblogs.com/A-zjzj/p/17553402.html

相关文章

  • CF1175F The Number of Subpermutations 对自己的警告--zhengjun
    太久没见过启发式合并了,然后没想出做法。首先笛卡尔树建出来。然后直接枚举跨过\(mid\)的长度为\(a_{mid}\)的区间,RMQ\(O(1)\)验证即可。发现这样的区间个数不超过左右区间大小的较小值,时间复杂度:\(O(n\logn)\)。代码#include<bits/stdc++.h>usingnamespacestd;us......
  • P5979 [PA2014] Druzyny 总结--zhengjun
    思维妙妙题。首先发现\(d\)的限制满足单调性,所以可以转化为\(l\gep_r\)的限制。注意:\(p\)是单调不降的然后就是\(p_r\lel\ler,\max\limits_{i=l}^r\{c_i\}\ler-l+1\)。这个\(\max\)想到转化到笛卡尔树上操作。然而这题要需要一个dp,所以考虑类似cdq分治一样......
  • CF732E Sockets 题解
    功率是\(x\)的插座插入一个适配器后功率是\(y\),功率是\(y\)的插座插入一个适配器后功率是\(z\),那么相当于功率是\(x\)的插座插入两个适配器。一个电脑可以用功率小的插座插入较少的适配器表达,也可以用功率大的插座插入较多的适配器表达。这里功率大的插座必然能表达出功......
  • 题解 [NOIP2015 提高组] 运输计划
    题目链接闲话:虽说是紫题,但慢慢想还是完全没有问题的。由于\(m\)个运输计划同时开始,所以耗费时间就是最慢的飞船耗费的时间(即最长时间)。考虑到题目让求最短时间,也就是最长的最短,可以二分。考虑二分最长时间(记作\(k\)),那么将所有路径分成两类,一类是原来耗费的时间就小于等于\(......
  • QOJ 6504. CCPC Final 2022 D Flower's Land 2题解
    QOJ6504.CCPCFinal2022DFlower'sLand2题解题意简述给你一个只含\(0,1,2\)的序列,相邻两个相同的数字可以直接消掉。询问包含两种区间所有数\(+1\)并对\(3\)取模。求一段区间能否用上述消除方式消完。样例输入8901211012245236168168236......
  • CF1290E Cartesian Tree 注意点--zhengjun
    解题思路容易想到从小到大加数,维护每个点的子树大小。可转化为维护每个点为\(\max\)时的\([L,R]\)区间。然后需要写一个支持【区间+1】、【区间取min】、单点加入、全局查询。上个吉司机线段树即可。注意点吉司机线段树下推\(fi\)的标记的时候要注意\(fi\)的变化......
  • yarn : 无法加载文件 E:\nodejs\yarn.ps1,因为在此系统上禁止运行脚本。问题解决
    1.在电脑的开始菜单中,搜索PowerShell ,然后以管理员身份运行,如下所示:2.以管理员身份运行后,会出现命令窗口,接下来,输入命令get-ExecutionPolicy 查看权限,会看到它的返回值是 Restricted ,意思是当前是禁用的。3.执行命令:set-ExecutionPolicyRemoteSigned,没有报错就......
  • CF1846D Rudolph and Christmas Tree 题解
    Decription一颗圣诞树由\(n\)个底边为\(d\),高度为\(h\)的等腰三角形组成,每个三角形以\(y\)轴为对称轴,底边均平行于\(x\)轴,三角形有可能重叠。给出\(n,d,h\)以及每个三角形底边与\(x\)轴的距离,求该圣诞树的面积。Solution如图,这是一棵圣诞树,其由两部分组成,完整......
  • NOI2021 题解
    [NOI2021]轻重边转化一下题意:每次给一条链染色,查一条链从\(x\)到\(y\)有几条边两端颜色相同。那这个随便树剖线段树就好了。也可以LCT,码量可能要小点。#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>usingnamespace......
  • 题解 最大加权矩阵
    题目链接虽然是一道橙题,但还是蕴含了重要算法思想——降维思想。如果是一维形式,即最大子段和,我们采取先求前缀和,并固定右端点,减去左边最小的办法求。对于这题,若固定了上下边界,则可以利用列的前缀和将其“压缩”为一维形式,再采取“最大子段和”的方式求解。如下面一个二维矩阵:......