一 题面

  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 普通平衡树 【离散化+权值线段树】的更多相关文章

  1. R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数

    R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...

  2. HDU 6609 离散化+权值线段树

    题意 有一个长度为\(n\)的数组W; 对于每一个\(i\)(\(1<=i<=n\)),你可以选择中任意一些元素W[k] (\(1<=k<i\)),将他们的值改变为0,使得\( ...

  3. P3369 【模板】普通平衡树(权值线段树)

    原来线段树还有这种操作(开成一个桶) 用区间维护在这个区间内元素的个数,离散化一下,居然能达到splay的效果 不仅码量大大减少,而且跑的飞快!!! 6种操作  200多ms 插入 xx 数 删除 x ...

  4. bzoj1588: [HNOI2002]营业额统计(权值线段树)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 16863  Solved: 6789[Submit][Sta ...

  5. cogs 1829. [Tyvj 1728]普通平衡树 权值线段树

    1829. [Tyvj 1728]普通平衡树 ★★★   输入文件:phs.in   输出文件:phs.out   简单对比时间限制:1 s   内存限制:1000 MB [题目描述] 您需要写一种数 ...

  6. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  7. luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)

    带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...

  8. [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]

    题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...

  9. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

随机推荐

  1. git 查询某人的提交记录

    git log --author=liubo --name-only

  2. Java 设计模式系列(十八)备忘录模式(Memento)

    Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...

  3. ASP.NET WEBAPI设计(文摘)

    HTML5和移动应用推动WEB API的发展 第1部分 基础知识 第1章 因特网,万维网和HTTP协议 1.1 WEB体系结构 资源,URI(统一资源标识符)和表示 URI分为两种类型:URL(统一资 ...

  4. java.sql.SQLException: Access denied for user ''@'localhost' (using password: YES)

    这个问题是说明你的JDBC数据库连接位置出错了,请仔细检查 private static String url; private static String username; private sta ...

  5. CPU位数、地址线位数、数据线位数、通用寄存器位数!

    CPU位数:表示的是其通用寄存器的位数,CPU的位数表示该CPU一次处理数据的最大位数. 数据线位数:是CPU的理论最大寻址空间,也是CPU与内存之间一次最大的数据传输位数. 地址线位数:是CPU实际 ...

  6. 自定义View--滚动View

    实现这么一个效果,一个布局中有一个View,那个View会随着我们手指的拖动而滑动,这种效果该如何实现?   我们第一反应应该是自定义一个DragView类继承View,然后重写onTouchEven ...

  7. 深水划水队项目---七天冲刺之day4

    由于有一名队员回家了,所以今天的站立式会议改成微信群线上讨论 工作进度: 1.游戏界面进一步美化中. 2.游戏基本功能已经初步实现. 3.计划今天内商讨出如何实现游戏中的难度选择功能与道具功能. 工作 ...

  8. 基于Extjs的web表单设计器 第一节

    前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表—— ...

  9. Git 安装配置,key导入

    系统 Centos 6.5 安装git 命令  yum install  git 配置git用户名 git config --global user.name "yangchengguo&q ...

  10. asp.net core部署到iis

    asp.net core项目部署到IIS稍微不同于之前,记录几个要点: 一.下载安装.NET Core 托管捆绑包,下载地址,这个链接或许不是最新的了,官方文档里面有这个链接,到下图所示位置即可找到. ...