考虑使用平衡树维护该序列,操作显然可以用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. Hadoop面试题总结(三)——MapReduce

    1.谈谈Hadoop序列化和反序列化及自定义bean对象实现序列化? 1)序列化和反序列化 (1)序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输. (2) ...

  2. 试题 算法训练 最大最小公倍数 java题解

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数 ...

  3. python中函数里面冒号和函数后面的箭头是什么含义

    函数里参数后的冒号其实是参数的类型建议,但是只是建议,就算你不按约定传也不会报错.而后面的箭头,则是函数返回值的类型建议.  

  4. python的虚拟环境Anaconda使用

    Anaconda 使用conda常用命令   1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是否安装以及当前conda的版本. 2.conda常用的命令. 1)con ...

  5. mil,mm与inch之间的转换

    inch:英寸 mil:密耳 mm:毫米 cm:厘米 1mil=0.0254mm=25.4um 1mm=39.37mil 1inch=1000mil=25.4mm=2.54cm(公分) /////// ...

  6. HDMI之TMDS通道

    HDMI标准继续沿用了和DVI相同的,由Silicon Image公司发明的TMDS(Time Minimized Differential Signal)最小化传输差分信号传输技术.TMDS是一种微 ...

  7. SpringCloud微服务实战——搭建企业级开发框架(十):使用Nacos分布式配置中心

    随着业务的发展.微服务架构的升级,服务的数量.程序的配置日益增多(各种微服务.各种服务器地址.各种参数),传统的配置文件方式和数据库的方式已无法满足开发人员对配置管理的要求: 安全性:配置跟随源代码保 ...

  8. caffe的idx1-ubyte和idx1-ubyte文件转换成图片文件和文本文件

    train-images-idx3-ubyte : training set images train-labels-idx1-ubyte   : training set labels t10k-i ...

  9. OAuth 2.0 的探险之旅

    前言 OAuth 2.0 全称是 Open Authorization 2.0, 是用于授权(authorization)的行业标准协议. OAuth 2.0 专注于客户端开发人员的简单性,同时为 W ...

  10. if语句和switch语句的选择与区别

    if语句和Switch语句的选择 if 结构 基本if选择结构: 处理单一或组合条件的情况 if-else选择结构:处理简单的条件分支情况 多重if选择结构:处理复杂的条件分支情况 嵌套if选择结构: ...