刷题总结——单旋(HNOI2017 bzoj4825)
题目:
Description

Input
Output
Sample Input
1 2
1 1
1 3
4
5
Sample Output
2
2
2
2
题解:
首先是插入操作。容易发现,节点的深度是当前spaly中比它小中最大的、比它大的中最小的,两个节点深度更大值+1。
接下来是旋转&删除。旋转最小、大值的思路类似,这里只讨论最小值。画图可以发现当前最小值右子树的深度不变,自己深度变为1,其余点深度+1。
把根删除,就是其它节点深度全部-1.
那么现在就要支持以下操作:在序列中间插入一个数、区间加减、单点修改、单点查询、以及寻找第一个(或最后一个)比某值小的数。这题没有强制在线,可以用线段树解决。如果在线可以打splay
时间复杂度O(nlogn)
至于如何维护就很麻烦了···线段树的左右区间为离散化后的键值,用tr,mx,mi分别表示键值区间内深度最小值,键值区间内键值最大的点的深度··键值区间内键值最小的点的深度,前一个用于求每个点的再spaly中的father,后两个用于求前驱后继··(具体见代码)
md好难打啊艹
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=;
int tr[N*],mx[N*],mi[N*],tag[N*],cnt[N*],b[N],now,a[N],tot,m,n,op[N],deep;
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
inline void lsh()
{
sort(b+,b+n+);
for(int i=;i<=n;i++)
a[i]=lower_bound(b+,b+n+,a[i])-b;
}
inline void update(int k)
{
if(cnt[k*]) mi[k]=mi[k*];else mi[k]=mi[k*+];
if(cnt[k*+]) mx[k]=mx[k*+];else mx[k]=mx[k*];
tr[k]=min(tr[k*],tr[k*+]);cnt[k]=cnt[k*]+cnt[k*+];
}
inline void pushdown(int k)
{
if(tag[k])
{
if(cnt[k*])
tag[k*]+=tag[k],mi[k*]+=tag[k],mx[k*]+=tag[k],tr[k*]+=tag[k];
if(cnt[k*+])
tag[k*+]+=tag[k],mi[k*+]+=tag[k],mx[k*+]+=tag[k],tr[k*+]+=tag[k];
tag[k]=;
}
}
inline int pre(int k,int l,int r,int v)
{
if(r==v)
return mx[k];
int mid=(l+r)/;
pushdown(k);
if(v<=mid) return pre(k*,l,mid,v);
int t=pre(k*+,mid+,r,v);
if(t) return t;
else return mx[k*];
}
inline int nxt(int k,int l,int r,int v)
{
if(l==v)
return mi[k];
int mid=(l+r)/;
pushdown(k);
if(v>mid) return nxt(k*+,mid+,r,v);
int t=nxt(k*,l,mid,v);
if(t) return t;
else return mi[k*+];
}
inline int getmin(int k,int l,int r)
{
if(l==r)
{
deep=tr[k];return l;
}
pushdown(k);
int mid=(l+r)/;
if(cnt[k*]) return getmin(k*,l,mid);
else return getmin(k*+,mid+,r);
}
inline int getmax(int k,int l,int r)
{
if(l==r)
{
deep=tr[k];return l;
}
pushdown(k);
int mid=(l+r)/;
if(cnt[k*+]) return getmax(k*+,mid+,r);
else return getmax(k*,l,mid);
}
inline void insert(int k,int l,int r,int dep,int v)
{
if(l==r)
{
tr[k]=mx[k]=mi[k]=dep;cnt[k]=;return;
}
pushdown(k);
int mid=(l+r)/;
if(v<=mid) insert(k*,l,mid,dep,v);
else insert(k*+,mid+,r,dep,v);
update(k);
}
inline void Delete(int k,int l,int r,int v)
{
if(l==r)
{
tr[k]=n,mx[k]=mi[k]=cnt[k]=;return;
}
pushdown(k);
int mid=(l+r)/;
if(v<=mid) Delete(k*,l,mid,v);
else Delete(k*+,mid+,r,v);
update(k);
}
inline int find1(int k,int l,int r,int dep)
{
if(l==r) return l;
pushdown(k);
int mid=(l+r)/;
if(cnt[k*]&&tr[k*]<dep) return find1(k*,l,mid,dep);
return find1(k*+,mid+,r,dep);
}
inline int find2(int k,int l,int r,int dep)
{
if(l==r) return l;
pushdown(k);
int mid=(l+r)/;
if(cnt[k*+]&&tr[k*+]<dep) return find2(k*+,mid+,r,dep);
return find2(k*,l,mid,dep);
}
inline void modify(int k,int l,int r,int x,int y,int v)
{
if(!cnt[k]) return;
if(l>=x&&r<=y)
{
tr[k]+=v,mx[k]+=v,mi[k]+=v,tag[k]+=v;
return;
}
pushdown(k);
int mid=(l+r)/;
if(x<=mid) modify(k*,l,mid,x,y,v);
if(y>mid) modify(k*+,mid+,r,x,y,v);
update(k);
}
int main()
{
//freopen("a.in","r",stdin);
m=R();
for(int i=;i<=m;i++)
{
op[i]=R();
if(op[i]==) a[++n]=R(),b[n]=a[n];
}
lsh();n++;memset(tr,0x3f3f3f3f,sizeof(tr));
for(int i=;i<=m;i++)
{
if(op[i]==)
{
now++;
insert(,,n,deep=max(pre(,,n,a[now]),nxt(,,n,a[now]))+,a[now]);
}
else if(op[i]==||op[i]==)
{
int q=getmin(,,n),p;
Delete(,,n,q);p=find1(,,n,deep);modify(,,n,p,n,);
if(op[i]==) insert(,,n,,q);else modify(,,n,,n,-);
}
else
{
int q=getmax(,,n),p;
Delete(,,n,q);p=find2(,,n,deep);modify(,,n,,p,);
if(op[i]==) insert(,,n,,q);else modify(,,n,,n,-);
}
printf("%d\n",deep);
}
return ;
}
刷题总结——单旋(HNOI2017 bzoj4825)的更多相关文章
- 【刷题】BZOJ 4825 [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- 【刷题】BZOJ 4830 [Hnoi2017]抛硬币
Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...
- 刷题总结——影魔(HNOI2017 BZOJ4826 线段树+扫描线)
题目: Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄 ...
- C#LeetCode刷题之#447-回旋镖的数量(Number of Boomerangs)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3792 访问. 给定平面上 n 对不同的点,"回旋镖&q ...
- 【刷题】BZOJ 4827 [Hnoi2017]礼物
Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...
- C#LeetCode刷题之#59-螺旋矩阵 II(Spiral Matrix II)
目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3678 访问. 给定一个正整数 n,生成一 ...
- C#LeetCode刷题之#54-螺旋矩阵(Spiral Matrix)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3672 访问. 给定一个包含 m x n 个元素的矩阵(m 行, ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
- C#LeetCode刷题-哈希表
哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串 24.2% 中等 18 四数之和 ...
随机推荐
- [机器学习] 简单的机器学习算法和sklearn实现
机器学习基础算法理解和总结 KNN算法 理解 KNN其实是最好理解的算法之一,其实就是依次和空间中的每个点进行距离比较,取距离最近的N个点,看这N个点的类别,那么要判断的点的类别就是这N个点中类别占比 ...
- 2018.2.12 PHP 如何读取一亿行的大文件
PHP 如何读取一亿行的大文件 我们可能在很多场景下需要用 PHP 读取大文件,之后进行处理,如果你没有相关的经验可以看下,希望能给你带来一些启发. 模拟场景 我们有一个 1亿 行,大小大概为 3G ...
- 【转】 树莓派初次启动攻略for Mac
http://blog.csdn.net/rk2900/article/details/8632713/ 树莓派初次启动攻略for Mac made by Rk 感谢浙江大学<嵌入式系统> ...
- echarts实现仪表盘(自己动起来,没有后端,顺便重温math.random
let a = parseInt(Math.random() * (2 + 1), 10); let arr = []; arr.push(res[a]); let option = { toolti ...
- java基础—线程(一)
一.线程的基本概念
- java基础——冒泡排序
最近开始准备面试,所以将Java基础复习一遍,又学习了冒泡排序 冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序 ja ...
- ios sinaweibo 客户端(一)
上一篇sina微博Demo已经完成的认证,下面就开始进入微博相关内容的加载及显示.其实主要的工作就是调用微博API 加载相关的json数据,然后进行解析,然后在界面中进行组织好在tableview中进 ...
- Verilog之语句位置
1.if语句.case语句必须放在always过程语句块中. 2.verilog的系统函数比如:\(display/\)monitor必须放在initial 过程语句块中.这点尚为理解为何,但必须这样 ...
- 基于网站地址URL传输session信息
在php的学习中,会话是我们常常用到的,那今天我们就来详细讲讲会话中的session: 一.session的工作机制:当开启session后,服务器会在服务器中保存session文件,然后再浏览器保存 ...
- STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料
微雪课堂:http://www.waveshare.net/study/article-629-1.html 之前的正点原子的例程资料 硬石科技stm32cube: 链接:https://pan.ba ...