4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树
很容易的一道题目。大概。不过我空间计算失误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树的更多相关文章
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树
[BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...
- @省选模拟赛03/16 - T3@ 超级树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...
- 3.28 省选模拟赛 染色 LCT+线段树
发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...
- NOI2019省选模拟赛 第六场
传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...
- 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)
一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...
- NOI2019省选模拟赛 第五场
爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...
- 省选模拟赛 arg
1 arg (arg.cpp/in/out, 1s, 512MB)1.1 Description给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. ...
- [noi.ac省选模拟赛]第10场题解集合
题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...
随机推荐
- 洛谷 P1131 [ZJOI2007]时态同步 树形DP
题目描述 分析 我们从根节点开始搜索,搜索到叶子节点,回溯的时候进行维护 先维护节点的所有子节点到该节点最大边权(边权为叶子节点到同时到达它所需要时间) 然后维护答案,答案为最大边权减去所有到子节点的 ...
- TKCTF-学校内部的校赛
*Reverse easy_C easy_re1.exe 在网络百度到解决逆向需要用到软件IDA 然后用IDA打开一条条的找我找到了一条很怪的ZmxhZ3s1ZWU1ZjYyOC1mMzVhLTQxN ...
- Django---drf第一天---作业
1 图书的5个接口写完(使用序列化组件) urls.py from django.contrib import admin from django.urls import path, re_path ...
- Js 利用正则 在字符串中提取数字、替换非数字字符为指定字符串
var s ="总金额4500元"; var num= s.replace(/[^-]/ig,""); alert(num);// 上述示例会把数字匹配到直接转 ...
- Aspose下载图片
/// <summary> /// 把DataTable数据按照Excel模板导出到Excel /// </summary> /// <param name=" ...
- CMDB03 /今日未采集的资产、资产入库、资产变更记录、资产采集
CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 目录 CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 1. 获取今日未采集的服务器 2. server资产入库以 ...
- js获取url并截取相应的字段,js解决url获取中文字段乱码问题
相信url截取信息是一个很常用的小功能页面跳转传参的时候可以在A页面的url挂一些参数到B页面获取正常的页面传参都是以数字和英文为主正常情况下中文获取的时候是有乱码的所谓上有政策下有对策一个正常的ur ...
- mysql常见数据类型
#常见的数据类型 /* 数值型: 整型 小数: 定点数 浮点数 字符型: 较短的文本:char.varchar 较长的文本:text.blob(较长的二进制数据) 日期型: */ #一.整型 /* 分 ...
- bzoj3378[Usaco2004 Open]MooFest 狂欢节*
bzoj3378[Usaco2004 Open]MooFest 狂欢节 题意: n只奶牛,第i只听力为vi,坐标为xi,两只奶牛聊天时音量是max(vi,vj)*abs(xi-xj).求n(n-1)/ ...
- python3将字符串unicode转换为中文
在我们的python使用过程中,可能会遇到这样的情况: 我们得到的中文数据是unicode编码类型的,这在python中是没有问题的,可以直接打印显示为中文. 但是,如果我们需要和其它语言或前端进行交 ...