题解 P3871 【[TJOI2010]中位数】
orz各位大佬,题解太强了,主席树,堆,线段树,splay,还有暴力,太巨了。所以我用的是fhq treap(好像更高级)。算了。
反正都是平衡树,这道题就是动态求中位数,不会做的同学可以先做弱化版P1168
至于不会fhq treap的同学可以先点这里或上Patrickpwq大佬的博客
fhq treap做这道题涉及到insert(插入)与find(求第k小的数),至于k,就随add增大就好了,所以说fhq treap太好用了。
insert的原理就不说了,至于find的原理我就简单讲一下,fhq treap是用treap来存,treap就是堆与树的合并,所以我们叫它二叉搜索树,所以它具有堆的性质,所以就搜右子树大小。(详细可以戳上面)
嗯,上代码。
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define maxn 200010
using namespace std;
int n,val[maxn],rnd[maxn],son[maxn][],size[maxn],sum_p,m;
//val存权值,rnd存rand出的值,son存左右儿子,size存大小。
inline void read(int &x)
{
x=;int f=;
char ch=getchar();
while(ch<''||ch>'')
{if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='')
{x=x*+ch-'';ch=getchar();}
x*=f;
}
inline int newnode(int x)
{
++sum_p;size[sum_p]=;
val[sum_p]=x;rnd[sum_p]=rand();
return sum_p;
}
inline void update(int x)
{
size[x]=size[son[x][]]+size[son[x][]]+;
}
inline void split(int &x,int &y,int k,int pos)//拆树
{
if(!pos)x=y=;
else
{
if(val[pos]<=k)//(拆成比k大与不大于k)
{x=pos;split(son[pos][],y,k,son[pos][]);}
else
{y=pos;split(x,son[pos][],k,son[pos][]);}
update(pos);
}
}
inline int merge(int x,int y)//合并
{
if(x==||y==) return x+y;
if(rnd[x]<rnd[y])//如果rand[x]<rand[y] 我们就把y接在x的右儿子上
{
son[x][]=merge(son[x][],y);
update(x);return x;
}
else//反之同理
{
son[y][]=merge(x,son[y][]);
update(y);return y;
}
}
inline int find(int pos,int rank)
{
while()//(原理上面已讲)
{
if(size[son[pos][]]>=rank)
{
pos=son[pos][];
}
else
if(size[son[pos][]]+==rank)return pos;
else
{
rank-=size[son[pos][]]+;
pos=son[pos][];
}
}
}
int main()
{
srand((unsigned)time(NULL));
int b,x,y,z,op,root=,m;
read(n);
for(register int i=;i<=n;i++)
{
read(op);
split(x,y,op,root);//拆开
root=merge(merge(x,newnode(op)),y);//插入,合并回来
}
read(m);char a[];
for(register int i=;i<=m;i++)
{
scanf("%s%d",a,&b);
if(a[]=='a')
{
split(x,y,b,root);
root=merge(merge(x,newnode(b)),y);
n++;//中位数是动态的,所以改变总个数就好了。
}
else
{
register int mid=(n+)/;//加1的原因就不说了
printf("%d\n",val[find(root,mid)]);
}
}
}
题解 P3871 【[TJOI2010]中位数】的更多相关文章
- 洛谷 P3871 [TJOI2010]中位数 解题报告
P3871 [TJOI2010]中位数 题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前 ...
- 洛谷——P3871 [TJOI2010]中位数
P3871 [TJOI2010]中位数 一眼秒掉,这不是splay水题吗,套模板 #include<bits/stdc++.h> #define IL inline #define N 1 ...
- 【题解】Luogu P3871 [TJOI2010]中位数
平衡树板题 原题传送门 这道题要用Splay,我博客里有对Splay的详细介绍 每次加入一个数,把数插入平衡树中 并且要记录一共有多少个数 每次查询就查询平衡树中第(总数-1)/2+1个数 十分暴力 ...
- 洛谷P3871 [TJOI2010]中位数(splay)
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- [LUOGU] P3871 [TJOI2010]中位数
题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将一个序列按照从 ...
- P3871 [TJOI2010]中位数
傻逼题 维护两个系统堆即可 #include<bits/stdc++.h> #define il inline #define vd void typedef long long ll; ...
- luoguP3871 [TJOI2010]中位数
题目链接 luoguP3871 [TJOI2010]中位数 题解 平衡树 代码 #include<vector> #include<cstdio> #include<cs ...
- 洛谷 题解 P3871 【[TJOI2010]中位数】
这题先定义一个大根堆(maxn)维护mid(n为奇数mid+1)的元素.再定义一个小根堆(minn)维护mid(n为奇数mid+1)到n的元素.然后对于插入元素的情况进行分类讨论. 当add x时 一 ...
- 洛谷 3871 [TJOI2010]中位数
[题解] 平衡树模板题,不过因为可以离线,所以有别的做法.把询问倒着做,变成删掉数字.求中位数,于是可以二分+树状数组. #include<cstdio> #include<cstr ...
随机推荐
- DotNetCore + Sonar + Coverlet 代码覆盖率检查
一,下载 sonar-scanner-msbuild 我当前下载的最新版本是:sonar-scanner-msbuild-4.5.0.1761-netcoreapp2.0 https://docs.s ...
- golang 日期时间处理
package main import ( "fmt" "time" ) func main() { fmt.Println(time.Now()) //显示时 ...
- 机器翻译评价指标 — BLEU算法
1,概述 机器翻译中常用的自动评价指标是 $BLEU$ 算法,除了在机器翻译中的应用,在其他的 $seq2seq$ 任务中也会使用,例如对话系统. 2 $BLEU$算法详解 假定人工给出的译文为$re ...
- js中uuid不被识别
后台传了uuid值给前台,然后js报错 原因:反正就是js不认你这个字符串,他觉得你这是应该是数字,但是后面想了想,也不是数字啊,然后就不认了. 解决办法:告诉他,为夫这里是字符串.拼接html的时候 ...
- “理了么”软件特点NABCD个人分析
在这里我就主要对此软件的‘A’(做法)和‘B’(好处)两方面进行分析. “A”:我们的软件为顾客和商家分别提供一种账户,分别登陆后会显示不同的界面. 1.用户界面:拥有“理发店”.“订单“.”和“我的 ...
- visual studio中各文件的输出路径
dll或exe输出路径一般在 配置属性->链接器->常规->输出文件 中 若该路径与 配置属性->常规 中的输出目录+目标文件名+目标文件扩展名不一致,可能会有提示,建议保持一 ...
- beanshell断言模版
if("${createTime_1}".equals("${createTime_2}")){ Failure = false; FailureMessage ...
- 三、Redis基础操作
前言: Redi是key-value的NoSQL,我们用Redis提供的redis-cli就能操作String类型key和各种数据类型value.但是放入的不是特定类型数据,添加的都是一个一个Stri ...
- HTML一
什么是前端: 前端,也称web前端对于网站来说,通常是指网站的前台部分,通俗点就是用户可以看到的部分, 浏览器.APP.应用程序的界面展现和用户交互就是前端 前端要学习那些技术:html+css+ja ...
- 【WC2019】数树 树形DP 多项式exp
题目大意 有两棵 \(n\) 个点的树 \(T_1\) 和 \(T_2\). 你要给每个点一个权值吗,要求每个点的权值为 \([1,y]\) 内的整数. 对于一条同时出现在两棵树上的边,这条边的两个端 ...