考虑使用平衡树维护该序列,操作显然可以用fhq treap的分裂+合并来实现

进一步的,问题即变为维护哪些信息来支持push up的操作(并判定是否存在$a_{i}<a_{j}<a_{k}$),容易想到去维护区间最大值/最小值、最大的$a_{i}$/最小的$a_{j}$满足存在$a_{i}<a_{j}$、内部是否存在$a_{i}<a_{j}<a_{k}$

第一和三个信息都可以轻松的合并,而第二个信息合并时要找到左侧右侧最大值的前驱,显然并不能维护

若已经存在$a_{i}<a_{j}<a_{k}$时,该信息可以不维护;若不存在$a_{i}<a_{j}<a_{k}$时,左侧比右侧最大值小的数必然构成一个递减序列,其中最大的(前驱)即是最靠左的,以此查询即可

单次合并为$o(\log n)$,那么平衡树的复杂度即为$o(\log^{2}n)$

时间复杂度为$o(n\log^{2}n+q\log^{2}n)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 120005
4 int n,m,rt,l,r,x,val[N],sz[N],rnd[N],mx[N],mn[N],vis[N],Mx[N],Mn[N],ch[N][2];
5 int query_pre(int k,int x){
6 if (!k)return 0;
7 if (mn[ch[k][0]]<x)return query_pre(ch[k][0],x);
8 if (val[k]<x)return val[k];
9 return query_pre(ch[k][1],x);
10 }
11 int query_nex(int k,int x){
12 if (!k)return n+1;
13 if (mx[ch[k][1]]>x)return query_nex(ch[k][1],x);
14 if (val[k]>x)return val[k];
15 return query_nex(ch[k][0],x);
16 }
17 void up(int k){
18 sz[k]=sz[ch[k][0]]+sz[ch[k][1]]+1;
19 mx[k]=max(max(mx[ch[k][0]],val[k]),mx[ch[k][1]]);
20 mn[k]=min(min(mn[ch[k][0]],val[k]),mn[ch[k][1]]);
21 vis[k]=(vis[ch[k][0]]|vis[ch[k][1]]);
22 vis[k]|=(Mn[ch[k][0]]<max(val[k],mx[ch[k][1]]));
23 vis[k]|=(min(val[k],mn[ch[k][0]])<Mx[ch[k][1]]);
24 vis[k]|=((mn[ch[k][0]]<val[k])&&(val[k]<mx[ch[k][1]]));
25 if (vis[k])return;
26 Mx[k]=max(Mx[ch[k][0]],Mx[ch[k][1]]);
27 Mx[k]=max(Mx[k],query_pre(ch[k][0],max(val[k],mx[ch[k][1]])));
28 if (val[k]<mx[ch[k][1]])Mx[k]=max(Mx[k],val[k]);
29 Mn[k]=min(Mn[ch[k][0]],Mn[ch[k][1]]);
30 Mn[k]=min(Mn[k],query_nex(ch[k][1],min(val[k],mn[ch[k][0]])));
31 if (mn[ch[k][0]]<val[k])Mn[k]=min(Mn[k],val[k]);
32 }
33 int merge(int x,int y){
34 if ((!x)||(!y))return x+y;
35 int k;
36 if (rnd[x]<rnd[y]){
37 k=x;
38 ch[k][1]=merge(ch[k][1],y);
39 }
40 else{
41 k=y;
42 ch[k][0]=merge(x,ch[k][0]);
43 }
44 up(k);
45 return k;
46 }
47 void split(int k,int &x,int &y,int z){
48 if (!k){
49 x=y=0;
50 return;
51 }
52 if (z<=sz[ch[k][0]]){
53 y=k;
54 split(ch[k][0],x,ch[y][0],z);
55 up(y);
56 }
57 else{
58 x=k;
59 split(ch[k][1],ch[x][1],y,z-sz[ch[k][0]]-1);
60 up(x);
61 }
62 }
63 int main(){
64 srand(time(0));
65 scanf("%d",&n);
66 memset(mn,0x3f,sizeof(mn));
67 memset(Mn,0x3f,sizeof(Mn));
68 for(int i=1;i<=n;i++){
69 scanf("%d",&val[i]);
70 sz[i]=1,rnd[i]=rand(),mx[i]=mn[i]=val[i];
71 rt=merge(rt,i);
72 }
73 scanf("%d",&m);
74 for(int i=1;i<=m;i++){
75 scanf("%d%d%d",&l,&r,&x);
76 int rtl,rtr,rt1,rt2;
77 split(rt,rtl,rt,l-1),split(rt,rt,rtr,r-l+1);
78 split(rt,rt1,rt2,(r-l+1)-x),rt=merge(rt2,rt1);
79 rt=merge(merge(rtl,rt),rtr);
80 if (vis[rt])printf("YES\n");
81 else printf("NO\n");
82 }
83 return 0;
84 }

[gym102412D]The Jump from Height of Self-importance to Height of IQ Level的更多相关文章

  1. [页面滚动到底部]jquery $(window).height()取值等于$(document).height()的问题

    问题现象:JSP中头部引用了某个head.jsp,在videoList.jsp中生成片段时如下 实际最终生成的HTML如下: <!DOCTYPE html>没有解析到,原因找到了,先想办法 ...

  2. height:100% 布局

    常常会碰到需要填满整个浏览器,并且自适应高度的需求.首先肯定会想到给容器设定height:100%,但是会没有效果.原因是body没有高度,所以百分比无法生效. 解决方案:给html,body,标签都 ...

  3. height与line-height的深入理解及应用

    转载:原文地址:http://www.zhangxinxu.com/wordpress/?p=384 一.前言 前两天在腾讯ISD团队博客上看到一篇翻译的文章"深入理解css 行高" ...

  4. (document).height()、$(document).scrollTop()

    (document).height().$(document).scrollTop(),有需要的朋友可以参考下. jQuery(window).height()代表了当前可见区域的大小,而jQuery ...

  5. 解决在onCreate()过程中获取View的width和Height为0的4种方法

    很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWid ...

  6. 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

    package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...

  7. 按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有确定位

    package com.hanqi.test; public class Rect { ; ; public double getWidth() { return width; } public vo ...

  8. 按要求编写Java应用程序: (1)编写西游记人物类(XiYouJiRenWu) 其中属性有:身高(height),名字(name),武器(weapon) 方法有:显示名字(printName),显示武器(printWeapon) (2)在主类的main方法中创建二个对象:zhuBaJie,sunWuKong。并分别为他 们的两个属性(name,weapon)赋值,最后分别调用printName,

    package com.hanqi.test; public class xiyoujirenwu { private double height;// 身高 private String name; ...

  9. height:100%不起作用(无效),div全屏

    当父容器是body时,height:100%不起作用(无效),解决办法:在css代码段中添加 html, body{ margin:0; height:100%; } 实现div全屏的时候需要上面那段 ...

随机推荐

  1. 遇到括号就是栈(bushi)

    CF508E Arthur and Brackets 我在赛场上想都没想直接DP \(O(n^3)\)过了 但别人说正解是栈+贪心 讲讲DP \(bool\) \(dp[i][j]\)表示从第i对括号 ...

  2. bash手册

    目录 bash手册 man命令 man man 分页程序(page) Linux手册页惯用的节名 Linux手册页的内容区域 查看命令在Linux手册页中的区域 info页面 help帮助 bash手 ...

  3. NOIP模拟80

    学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...

  4. 关于keras框架的介绍以及操作使用

    Keras 是一个 Python 深度学习框架,可以方便地定义和训练几乎所有类型的深度学习模型.Keras 最开始是为研究人员开发的,其目的在于快速实验.我们可以进入网站主页 - Keras 中文文档 ...

  5. DataX的安装及使用

    DataX的安装及使用 目录 DataX的安装及使用 DataX的安装 DataX的使用 stream2stream 编写配置文件stream2stream.json 执行同步任务 执行结果 mysq ...

  6. C/C++ 数据类型 表示最大 最小数值 探讨

    C/C++中存储数字格式有整型和浮点型 字符型数据本质上也是以整型存储 整型 对于整型数据,最大值最小值很好计算 先确定对应数据型在本地所占用的字节数,同一数据型由于系统或者编译器的不同,所占字节不同 ...

  7. kiyv Button参数属性

    from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.app import ...

  8. 服务器端的GPU使用

    服务器端的GPU使用 查看GPU信息 查看nvidia GPU信息: # 输入指令 lspci | grep -i nvidia # 结果如下: # 04:00.0 3D controller: NV ...

  9. 记一次关于pdf 下载需求变更到 pdf 在线预览

    背景: 之前的需求是根据接口中提供的Blob数据实现PDF下载,已实现代码如下: 1 const url = window.URL.createObjectURL(newBlob([response. ...

  10. BUAA 软工 | 从计算机技术中探索艺术之路

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 掌握软件开发方法学和工程学知识 这个作业在哪个具体方面帮 ...