很容易的一道题目。大概。不过我空间计算失误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. windows快速安装redis

    下载地址:https://github.com/microsoftarchive/redis/releases 下载解压,命令行:redis-server.exe redis.windows.conf

  2. mysql 常见使用场景

    场景1:表中多条相同账户数据,根据创建日期排序取第一条. select * from cms_client_rpq rpq where id = ( select id from cms_client ...

  3. 【线型DP】【LCS】洛谷P4303 [AHOI2006]基因匹配

    P4303 [AHOI2006]基因匹配 标签(空格分隔): 考试题 nt题 LCS优化 [题目] 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...

  4. efcore 跨表查询,实现一个接口内查询两个不同数据库里各自的表数据

    最近有efcore跨库查询的需求,研究了下colder框架里文档的分库实现,发现并不能完全实现一个接口下的跨库查询请求,只能满足一个业务层构造指定的唯一一个数据库访问接口. 先说下文档是怎么实现的 D ...

  5. 一文搞定 Spring Data JPA

    Spring Data JPA 是在 JPA 规范的基础上进行进一步封装的产物,和之前的 JDBC.slf4j 这些一样,只定义了一系列的接口.具体在使用的过程中,一般接入的是 Hibernate 的 ...

  6. LintCode笔记 - 8. 旋转字符串

    这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 旋转字符串 中文English 给定一个字符 ...

  7. AIX系统下挂载外置存储

    连接盘柜后在盘柜里映射好分区. 1.扫描硬件才能发现盘柜映射的容量 ,命令cfgmgr 2.查看在 AIX 系统下能否认到盘柜的分区. 命令:lsdev -Cc disk 3.查看物理卷(pv),命令 ...

  8. 数据可视化之powerBI基础(十三)熟练使用Power BI的日期切片器

    https://zhuanlan.zhihu.com/p/64416522 交互式设计可以让用户使用的过程中更具参与感,在PowerBI中经常用到的交互方式就是切片器,利用它可以从不同维度查看数据,切 ...

  9. 空间金字塔池化 ssp-net

    <Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition>,这篇paper提出了空间金字 ...

  10. spring boot实现简单的登录拦截

    一.思路 1.在pom.xml导入相关包 2.先写个简单的认证适配器(WebSecurityConfig extends WebSecurityConfigurerAdapter),登录拦截后就会跳转 ...