很容易的一道题目。大概。不过我空间计算失误MLE了 我草草的计算了一下没想到GG了。

关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了。

题目没有明确指出 在任意时刻数组长度为有限制什么的 况且这道题也不卡空间 nlogn或者再大一倍的空间都是可以过的。

但是 我仍然作死写了两个队列 进行空间的回收 (我也不知道我在干什么。

(可能完全觉得好玩吧)

开的空间大小:\(\frac{10\cdot 30\cdot 500000\cdot 4}{1000000}=600MB\)

所以GG了。 值得一提的是考试的时候没有多想直接主席树+可持久化trie了。

其实光可持久化trie树也是可以求区间第k大和区间<=x的数的个数的。

const int MAXN=500010;
int n,m,maxx,id,ans,mark;
int a[MAXN];
int rt1[MAXN],rt2[MAXN],pos1[MAXN*20],pos2[MAXN*20];
struct wy{int l,r,sum;}t[MAXN*20];
struct jl{int c[2],sz;}s[MAXN*30];
queue<int>q1,q2;
inline int getnum1()
{
int w=q1.front();q1.pop();
l(w)=r(w)=sum(w)=0;
return w;
}
inline int getnum2()
{
int w=q2.front();q2.pop();
sz(w)=s[w].c[0]=s[w].c[1]=0;
return w;
}
inline void insert(int &p,int las,int l,int r,int x)
{
p=getnum1();pos1[p]=id;t[p]=t[las];
if(l==r){++sum(p);return;}
int mid=(l+r)>>1;
if(x<=mid)insert(l(p),l(las),l,mid,x);
else insert(r(p),r(las),mid+1,r,x);
sum(p)=sum(l(p))+sum(r(p));
}
inline void build(int &p,int las,int depth,int x)
{
p=getnum2();pos2[p]=id;s[p]=s[las];
if(!depth){++sz(p);return;}
int w=(x&(1<<(depth-1)))?1:0;
build(s[p].c[w],s[las].c[w],depth-1,x);
sz(p)=sz(s[p].c[0])+sz(s[p].c[1]);
}
inline void ask1(int p,int las,int depth,int x)
{
if(!depth)return;
int w=(x&(1<<(depth-1)))?1:0;
if(sz(s[p].c[w^1])-sz(s[las].c[w^1])>0)
{
if(w^1)ans=ans|(1<<(depth-1));
ask1(s[p].c[w^1],s[las].c[w^1],depth-1,x);
}
else
{
if(w)ans=ans|(1<<(depth-1));
ask1(s[p].c[w],s[las].c[w],depth-1,x);
}
}
inline void del1(int &p)
{
if(!p)return;
if(pos1[p]==mark)
{
del1(l(p));
del1(r(p));
q1.push(p);p=0;
}
return;
}
inline void del2(int &p)
{
if(!p)return;
if(pos2[p]==mark)
{
del2(s[p].c[0]);
del2(s[p].c[1]);
q2.push(p);p=0;
}
return;
}
inline int ask(int p,int las,int l,int r,int x)
{
if(r<=x)return sum(p)-sum(las);
int mid=(l+r)>>1;
if(x>mid)return ask(l(p),l(las),l,mid,x)+ask(r(p),r(las),mid+1,r,x);
return ask(l(p),l(las),l,mid,x);
}
inline int query(int p,int las,int l,int r,int x)
{
if(l==r)return l;
int mid=(l+r)>>1;
int ww=sum(l(p))-sum(l(las));
if(ww>=x)return query(l(p),l(las),l,mid,x);
return query(r(p),r(las),mid+1,r,x-ww);
}
int main()
{
freopen("operator.in","r",stdin);
freopen("operator.out","w",stdout);
get(m);maxx=500010;
rep(1,20*MAXN,i)q1.push(i),q2.push(i);
rep(1,m,i)
{
int op,x,y,z;
get(op)+1;get(x);
if(op==1)
{
a[++n]=x;id=n;
insert(rt1[n],rt1[n-1],1,maxx,x);
build(rt2[n],rt2[n-1],21,x);
}
if(op==2)
{
get(y);get(z);ans=0;
ask1(rt2[y],rt2[x-1],21,z);
put(ans);
}
if(op==3)
{
fep(n,n-x+1,j)
{
mark=j;
del1(rt1[j]);
del2(rt2[j]);
}
n=n-x;
}
if(op==4)
{
get(y);get(z);
put(ask(rt1[y],rt1[x-1],1,maxx,z));
}
if(op==5)
{
get(y);get(z);
put(query(rt1[y],rt1[x-1],1,maxx,z));
}
}
return 0;
}

4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树的更多相关文章

  1. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  2. 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树

    [BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...

  3. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  4. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  5. NOI2019省选模拟赛 第六场

    传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...

  6. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

  7. NOI2019省选模拟赛 第五场

    爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...

  8. 省选模拟赛 arg

    1 arg (arg.cpp/in/out, 1s, 512MB)1.1 Description给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. ...

  9. [noi.ac省选模拟赛]第10场题解集合

    题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...

随机推荐

  1. box-shadow,text-shadow

    box-shadow:inset 30px 40px 20px #f00; 如上实例,总共五个参数,其中第一个代表阴影是向内阴影还是向外阴影,第二个参数代表向右(从左向右)的偏移量,第三个参数代表向下 ...

  2. iOS应用千万级架构:MVVM框架

    业务模块内的MVC和MVVM架构 目前,唯品会中MVC和MVVM架构并存,后期会偏重于MVVM架构的使用. MVC架构 Model:程序中要操纵的实际对象的抽象,为Controller提供经过抽象的业 ...

  3. day44 初识数据库

    目录 一.数据的演变 二.数据库 三.MySQL 1 基本原理 2 重要概念介绍 3 安装 4 启动 5 sql基本语句 6 环境变量的配置及系统服务制作 7 关于密码 8 统一编码 9 基本sql语 ...

  4. 微信小程序中的深拷贝与浅拷贝问题

    最近在弄小程序项目的时候遇到了一个json对象复制的问题,也就是俗称的深拷贝与浅拷贝了. 一般用变量直接接收就是浅拷贝,那么如何理解浅拷贝与深拷贝的意义呢? 浅拷贝:只是将对象地址的复制,并没有开辟新 ...

  5. 如果你想写自己的Benchmark框架

    目录 简介 八条军规 第一条军规 第二条军规 第三条军规 第四条军规 第五条军规 第六条军规 第七条军规 最后一条军规 总结 简介 使用过JMH的同学一定会惊叹它的神奇.JMH作为一个优秀的Bench ...

  6. CSRF攻击原理以及防御方法(写的很好)

    转载地址:http://www.phpddt.com/reprint/csrf.html        CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟 ...

  7. CTF_show平台 web题解 part1

    web3 题目描述: 方法一:RFI 使用url实现php远程文件包含 在服务器上构造1.txt <?php $a = "<?php eval(\$_POST['123'])?& ...

  8. [Qt2D绘图]-03坐标系统之坐标变换

    大纲:     基本变换         介绍和常用API     窗口-视口转换         窗口         视口         让窗口和视口维持相同宽高比来防止变形   基本变换 默认 ...

  9. Java多线程原理+基础知识(超级超级详细)+(并发与并行)+(进程与线程)1

    Java多线程 我们先来了解两个概念!!!! 1.什么是并发与并行 2.什么是进程与线程 1.什么是并发与并行 1.1并行:两个事情在同一时刻发生 1.2并发:两个事情在同一时间段内发生 并发与并行的 ...

  10. 洛谷P2365/5785 任务安排 题解 斜率优化DP

    任务安排1(小数据):https://www.luogu.com.cn/problem/P2365 任务安排2(大数据):https://www.luogu.com.cn/problem/P5785 ...