考虑使用平衡树维护该序列,操作显然可以用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. 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

    通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...

  2. 在Windows Server 2012R2离线安装.net framework3.5

    最近新装了一台Windows Server 2012 R2的服务器,安装数据库时,出现了提示安装不上 .net framework3.5的情况,经过网络上多次的资料查找及反复试验终于找到了一个可以解决 ...

  3. mysql创建用户及赋予某用户权限(附带基础查看表内容)

    首先登陆mysql 一:show databases;  展示所有数据库(root用户下) 二:use xxx (数据库名)使用use选择数据库 三:show xxx   查看数据库中的表 四:des ...

  4. 基于nginx实现私有yum仓库

    基于本地光盘的源 server端IP:10.0.0.79 nginx使用默认路径.端口 yum install nginx -y #更改以root运行 sed -i '/^user/s/nginx/r ...

  5. SharkCTF2021 bbpop题记

    一道挺好的web. 做完这一题,感觉php序列化(甚至魔术方法)之类的有点开始玩明白了. 题面很长: 预备知识: PHP类的方法中,有一部分以下划线开头的"魔术方法".不同于普通方 ...

  6. 【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)

    前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶.老师讲得太好了. Java内存模型,感觉以前学得比较抽象.很繁杂,抽象. 这次试着系统一点跟着2个老师学习 ...

  7. QG-2019-AAAI-Improving Neural Question Generation using Answer Separation

    Improving Neural Question Generation using Answer Separation 本篇是2019年发表在AAAI上的一篇文章.该文章在基础的seq2seq模型的 ...

  8. [软工顶级理解组] Beta阶段测试报告

    在测试过程中发现了多少Bug? 测试阶段发现并已修复的bug: 尚且存在,但是难以解决或者不影响使用的bug: 计算重修课程的时候,如果重修课程的课程号和原课程号不同,则GPA计算会出现误差.但我们无 ...

  9. java中生成和验证jwt

    在这篇文章中主要记录一下在Java中如何使用 java 代码生成jwt token,主要是使用jjwt来生成和验证jwt,关于什么是JWT,以及JWT可以干什么不做详解. jwt的格式: base64 ...

  10. WPF_05_路由事件

    路由事件 WPF用更高级的路由事件替换普通的.NET事件.路由事件具有更强传播能力,可在元素树中向上冒泡和向下隧道传播,并沿着传播路径被事件处理程序处理.与依赖属性一样,路由事件由只读的静态字段表示, ...