CF1156E Special Segments of Permutation
时间:2019-09-15
本文章向大家介绍CF1156E Special Segments of Permutation,主要包括CF1156E Special Segments of Permutation使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
思路:笛卡尔树?(好像并不一定要建出来,但是可以更好理解)
提交:2次
错因:没有判左右儿子是否为空来回溯导致它T了
题解:
建出笛卡尔树,考虑如何计算答案:
先预处理每一个值出现的位置 \(pos[]\);
对于每一个有左右儿子的点,设他在原序列中的值为 \(mx\),根据笛卡尔树的性质,他比自己的子树中的任何一个元素都大 。这样, 我们遍历他的轻儿子中的元素 \(vl\) ,查询 \(pos[mx-vl]\) 是否在重子树中。
其实可以不建树,直接求出每个点作为最大值能够向左右扩展的区间,枚举小的区间就够了。
复杂度 \(O(nlogn)\) ,原因是类似树剖,每个点最多只会向上跳 \(logn\) 条轻边;而一个点被计算,只有在枚举轻子树的时候;其实类似dsu on tree。
当然,不建树的做法的复杂度虽然解释不同,但本质都是一样的、
代码:
#include<bits/stdc++.h>
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
} const int N=250010;
int n,rt,a[N],pos[N],ans;
struct node {int ls,rs,sz,l,r;} t[N];
#define ls(tr) t[tr].ls
#define rs(tr) t[tr].rs
#define sz(tr) t[tr].sz
#define l(tr) t[tr].l
#define r(tr) t[tr].r
int stk[N],top;
inline void calc(int tr,int rn,int mx) {
for(R i=l(tr);i<=r(tr);++i)
ans+=(pos[mx-a[i]]>=l(rn)&&pos[mx-a[i]]<=r(rn));
}
inline void dfs(int tr) {
sz(tr)=1,l(tr)=r(tr)=tr;
if(ls(tr)) dfs(ls(tr)),l(tr)=l(ls(tr));
if(rs(tr)) dfs(rs(tr)),r(tr)=r(rs(tr));
if(!ls(tr)||!rs(tr)) return ;
sz(tr)=sz(ls(tr))+sz(rs(tr));
if(sz(ls(tr))<sz(rs(tr))) calc(ls(tr),rs(tr),a[tr]);
else calc(rs(tr),ls(tr),a[tr]);
}
inline void main() {
n=g(); for(R i=1;i<=n;++i) a[i]=g(),pos[a[i]]=i;
stk[++top]=0,a[0]=1e9;
for(R i=1;i<=n;++i) { R lst=0;
while(a[stk[top]]<a[i]) lst=stk[top],--top;
ls(i)=lst,rs(stk[top])=i; stk[++top]=i;
} rt=stk[2];
dfs(rt); printf("%d\n",ans);
}
} signed main() {Luitaryi::main(); return 0;}
2019.09.15
61
原文地址:https://www.cnblogs.com/Jackpei/p/11525095.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 腾讯云录音文件识别请求和结果查询
- 【Kubernetes】kubectl top 如何使用
- js数组方法,常用数组Api的基本使用
- java jsp实现网络考试系统(mysql)
- 实操:数据万象语音转文字
- python智能图片识别系统(图片切割、图片识别、区别标识)
- 【Kubernetes】部署 metrics-server 后无法使用 top 命令
- 使用java计算数组方差和标准差
- jzy3D从入门到弃坑_2 使用jzy3D0.9画2D散点图
- jzy3D从入门到弃坑_3 使用jzy3D0.9画2D散点图--多条线条
- maven安装和应用
- 论文研读-多目标自适应memetic算法
- 一起来学matlab-matlab学习笔记13函数 13_1 函数返回值
- 一起来学matlab-matlab学习笔记13函数 13_2 匿名函数
- 一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄