[gym102412D]The Jump from Height of Self-importance to Height of IQ Level
考虑使用平衡树维护该序列,操作显然可以用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的更多相关文章
- [页面滚动到底部]jquery $(window).height()取值等于$(document).height()的问题
问题现象:JSP中头部引用了某个head.jsp,在videoList.jsp中生成片段时如下 实际最终生成的HTML如下: <!DOCTYPE html>没有解析到,原因找到了,先想办法 ...
- height:100% 布局
常常会碰到需要填满整个浏览器,并且自适应高度的需求.首先肯定会想到给容器设定height:100%,但是会没有效果.原因是body没有高度,所以百分比无法生效. 解决方案:给html,body,标签都 ...
- height与line-height的深入理解及应用
转载:原文地址:http://www.zhangxinxu.com/wordpress/?p=384 一.前言 前两天在腾讯ISD团队博客上看到一篇翻译的文章"深入理解css 行高" ...
- (document).height()、$(document).scrollTop()
(document).height().$(document).scrollTop(),有需要的朋友可以参考下. jQuery(window).height()代表了当前可见区域的大小,而jQuery ...
- 解决在onCreate()过程中获取View的width和Height为0的4种方法
很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWid ...
- 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( ...
- 按要求编写一个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 ...
- 按要求编写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; ...
- height:100%不起作用(无效),div全屏
当父容器是body时,height:100%不起作用(无效),解决办法:在css代码段中添加 html, body{ margin:0; height:100%; } 实现div全屏的时候需要上面那段 ...
随机推荐
- 题解 [AGC017C] Snuke and Spells
题目传送门 Description 有 \(n\) 个球排在一起,每个球有颜色 \(a_i\),若当前有 \(k\) 个球,则会将所有 \(a_i=k\) 的球删掉.有 \(m\) 次查询,每次将 \ ...
- Java读取属性配置文件-properties
在项目开发中,我们难免将一些可变的参数放在程序以外,作为一个单独的文件,即配置文件,这样方便项目在不同的使用环境部署时.或者说需要不同时,可以通过简单配置这些程序以外的文件来修改程序里的变量. 常用的 ...
- iostream 操作符
iostream 操作符 Input/output manipulators - cppreference.com
- Java:锁笔记
Java:锁笔记 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. Java 锁之公平锁和非公平锁 公平锁 是指多个线程按照申请锁的顺序来获取锁,类似于排队买 ...
- FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2
既然我们已经有了所有的安全流程,就让我们来使用 JWT 令牌和安全哈希密码让应用程序真正地安全. 关于 JWT 它是一个将 JSON 对象编码为密集且没有空格的长字符串的标准.字符串看起来像这样: e ...
- 2021.8.13考试总结[NOIP模拟38]
T1 a 入阵曲.枚举矩形上下界,之后从左到右扫一遍.用树状数组维护前缀和加特判可以$A$,更保险要脸的做法是双指针扫,因为前缀和单调不减. $code:$ 1 #include<bits/st ...
- [luogu2973]driving out the piggies 驱逐猪猡【高斯消元+概率DP】
看到题面的那一刻,我是绝望的ORZ 图论加概率期望加好像不沾边的高斯消元???我人直接傻掉 还没学过概率期望的我果断向题解屈服了(然后还是傻掉了两节课来找线性方程.. Description 奶牛们建 ...
- Python课程笔记(二)
1.格式化输出 print("%d %d %s" % (15, 3.14, 12.8)) 对比C语言 printf("%d,%d,%s",15, 3.14, 1 ...
- Oracle 11g 新建用户
create user XXXuser identified by XXXpassword;--创建用户XXXuser,设置初始密码XXXpassword alter user XXXuser ide ...
- 『动善时』JMeter基础 — 56、JMeter使用命令行模式生成HTML测试报告
目录 1.自动生成HTML图形化报告 2.使用已有的测试结果文件生成HTML报告 3.HTML图形化报告内容详解 (1)Dashboard页面:(重点查看) (2)Charts页面:(辅助分析) 4. ...