思路:笛卡尔树?(好像并不一定要建出来,但是可以更好理解)

提交: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

最新文章

  1. win7 无法修改时区和时间
  2. runtime学习笔记
  3. SQL Server2008窗口计算
  4. POJ 1127 Jack Straws(计算几何)
  5. 《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限
  6. TNS-01251: Cannot set trace/log directory under ADR
  7. MVC 3个重要的描述对象之ControllerDescriptor
  8. JavaScript高级程序设计:第五章
  9. PHP随机函数【上】
  10. Idea导包与打包
  11. python 中文件输入输出及os模块对文件系统的操作
  12. IDC:UPS(不间断电源)
  13. SpringBoot初探
  14. Anaconda+django写出第一个web app(八)
  15. springboot集成mybatis及mybatis generator工具使用
  16. linux 目录操作命令 mkdir、rmdir、cd -、cp、scp、mv、rm
  17. 通俗地讲Node.js是什么
  18. linux上的mysql配置过程
  19. js数组排序 reverse()和sort()方法的使用
  20. shell 条件语句

热门文章

  1. Word 查找替换高级玩法系列之 -- 查找文档中的叠字
  2. Python--字典的一些用法dict.items()
  3. Python习题005
  4. java中的自动装箱和拆箱
  5. 2019牛客多校一 H. XOR (线性基)
  6. Unity插件研究-EasyTouch V5
  7. (四)resultMap、sql片段与动态SQL
  8. dotnetcore下解压zip文件,解决中文文件名乱码问题
  9. vue中子组件的created、mounted钩子中获取不到props中的值问题
  10. [NOIP2018模拟赛10.23]发呆报告