BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】
一 题面
二 分析
比较明显是可以用平衡二叉搜索树(splay)做的。
用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息。
板子。
三 AC代码
- #include <iostream>
- #include <algorithm>
- #include <cstring>
- #include <fstream>
- using namespace std;
- #define lson rt<<1
- #define rson rt<<1|1
- const int MAXN = 1e5 + ;
- int N, op[MAXN], opx[MAXN];
- struct Node
- {
- int id, x;
- }Data[MAXN];
- int A[MAXN];
- int segTree[MAXN<<];
- bool Cmpx(const Node &a, const Node &b)
- {
- return a.x < b.x;
- }
- //p更新的位置,v=-1表示减,v=1表示加
- void Update(int p, int v, int rt, int l, int r)
- {
- segTree[rt] += v;
- if(l == r) return;
- int mid = (l+r)>>;
- if(p <= mid) Update(p, v, lson, l, mid);
- else Update(p, v, rson, mid+, r);
- }
- //第K小
- int Kth(int K, int rt, int l, int r)
- {
- if(l == r)
- return l;
- int mid = (l+r)>>;
- if(segTree[lson] >= K)
- return Kth(K, lson, l, mid);
- else
- return Kth(K-segTree[lson], rson, mid+, r);
- }
- //数字v的排名
- //统计小于v的数的个数
- int Rank(int v, int rt, int l, int r)
- {
- if(r < v)
- return segTree[rt];
- int mid = (l+r)>>, res = ;
- res += Rank(v, lson, l, mid);
- //相当于mid+1 < v 那么左边可能还有
- if(mid < v-)
- res += Rank(v, rson, mid+, r);
- return res;
- }
- //找最右边的数
- int Findr(int rt, int l, int r)
- {
- if(l == r)
- return l;
- int mid = (l+r)>>;
- if(segTree[rson]) return Findr(rson, mid + , r);
- return Findr(lson, l, mid);
- }
- //前驱
- int Pre(int v, int rt, int l, int r)
- {
- if(r < v)
- {
- if(segTree[rt]) return Findr(rt, l, r);
- return ;
- }
- int mid = (l+r)>>, res;
- //如果v > mid+1那么意味着mid+1或后面的数有可能是前驱
- if(mid < v- && segTree[rson] && (res=Pre(v,rson,mid+,r)))
- return res;
- return Pre(v, lson, l, mid);
- }
- //找最左边的数
- int Findl(int rt, int l, int r)
- {
- if(l == r)
- return l;
- int mid = (l+r)>>;
- if(segTree[lson]) return Findl(lson, l, mid);
- return Findl(rson, mid+, r);
- }
- //后继
- int Nex(int v, int rt, int l, int r)
- {
- if(v < l)
- {
- if(segTree[rt]) return Findl(rt, l, r);
- return ;
- }
- int mid = (l+r)>>, res;
- //如果mid > v表示左子树的数可能是后继
- if(v < mid && segTree[lson] && (res=Nex(v,lson,l,mid)))
- return res;
- return Nex(v, rson, mid + , r);
- }
- int main()
- {
- //freopen("input.txt", "r", stdin);
- scanf("%d", &N);
- for(int i = ; i <= N; i++)
- {
- scanf("%d %d", &op[i], &Data[i].x);
- Data[i].id = i;
- }
- //离散化预处理
- sort(Data + , Data + N + , Cmpx);
- int cnt = ;
- A[cnt] = Data[].x;
- opx[Data[].id] = cnt;
- for(int i = ; i <= N; i++)
- {
- if(Data[i].x != Data[i - ].x)
- {
- cnt++;
- }
- A[cnt] = Data[i].x;
- opx[Data[i].id] = cnt;
- }
- //建树
- memset(segTree, , sizeof(segTree) );
- for(int i = ; i <= N; i++)
- {
- switch(op[i])
- {
- case : Update(opx[i], , , , cnt); break;
- case : Update(opx[i], -, , , cnt); break;
- case : printf("%d\n", Rank(opx[i], , , cnt)+); break;
- //这里注意第K个数也离散化了!!!
- case : printf("%d\n", A[ Kth(A[opx[i]], , , cnt)] ); break;
- case : printf("%d\n", A[ Pre(opx[i], , , cnt)] ); break;
- case : printf("%d\n", A[ Nex(opx[i], , , cnt)] ); break;
- }
- }
- return ;
- }
BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】的更多相关文章
- R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数
R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...
- HDU 6609 离散化+权值线段树
题意 有一个长度为\(n\)的数组W; 对于每一个\(i\)(\(1<=i<=n\)),你可以选择中任意一些元素W[k] (\(1<=k<i\)),将他们的值改变为0,使得\( ...
- P3369 【模板】普通平衡树(权值线段树)
原来线段树还有这种操作(开成一个桶) 用区间维护在这个区间内元素的个数,离散化一下,居然能达到splay的效果 不仅码量大大减少,而且跑的飞快!!! 6种操作 200多ms 插入 xx 数 删除 x ...
- bzoj1588: [HNOI2002]营业额统计(权值线段树)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 16863 Solved: 6789[Submit][Sta ...
- cogs 1829. [Tyvj 1728]普通平衡树 权值线段树
1829. [Tyvj 1728]普通平衡树 ★★★ 输入文件:phs.in 输出文件:phs.out 简单对比时间限制:1 s 内存限制:1000 MB [题目描述] 您需要写一种数 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
- [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]
题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
随机推荐
- 统计学中z分布、t分布、F分布及χ^2分布
Z就是正态分布,X^2分布是一个正态分布的平方,t分布是一个正态分布除以(一个X^2分布除以它的自由度然后开根号),F分布是两个卡方分布分布除以他们各自的自由度再相除 比如X是一个Z分布,Y(n)=X ...
- js去掉字符串前后空格的五种方法(转)
出处:http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用 function trim(s){ retu ...
- Android文件上传
服务端: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syst ...
- C#基础入门 十
C#基础入门 十 Windows应用程序的界面设计 Form.cs:窗体文件,一般用于存放程序员为窗体编写的代码: Form.Designer.cs:窗体设计文件,其中的代码是由VS自动生成的,一般不 ...
- [毕业设计][期末作业]二手闲置小程序 免费信息发布系统功能源码(小程序+php后台管理)
最近做了一个小程序,主要是二手闲置免费信息发布系统的功能,里面包括了登录,发布商品,商品管理,违规投诉,canva商品海报生成,分享等一些基础的功能,可以说代码都是自己辛辛苦苦写出来的.可作为毕业设计 ...
- PipelineDB On Kafka
PipelineDB 安装yum install https://s3-us-west-2.amazonaws.com/download.pipelinedb.com/pipelinedb-0.9.8 ...
- Java Been, EJB, POJO 之间的区别
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean.但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以 ...
- asp.net 导出 Excel
/// <summary> /// List 数据导出Excel /// </summary> /// <param name="list">数 ...
- aspnetPage分页控件
项目里面有一个分页,刚好知道了aspnetPage分页控件,现在就把实现步骤和代码贴出来分享一下,如有错误欢迎指正. http://www.webdiyer.com 该控件原网址.里面文档 1.首先 ...
- .Net面试经验,从北京到杭州
首先简单说下,本人小本,目前大四软件工程专业,大三阴差阳错地选了.Net方向,也是从大三开始接触.Net.自认为在学生中.net基础还可以,嘿嘿,吹一下. 大四第一学期学校安排去北京培训,培训了两个月 ...