刷题总结——单旋(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 四数之和 ...
随机推荐
- 关系代数演算So Easy
关系代数运算So Easy 关系代数是以关系为运算的一组高级运算的集合.由于定义为属性个数 相同的元组的集合,因此集合代数的操作就可以引入到关系代数中.关系代数也可以看做是一种抽象的查询语言,是对关系 ...
- VS2013常用快捷键[转] 注释 Ctrl+K - C 和 k - u
VS2013常用快捷键你敢不会? F1 帮助文档 F5 运行 F12 跳转到定义 F11 单步调试 Shift+F5 停止调试 Ctrl+滚轮 放大缩小当前视图 Ctrl+L 删除当前行 Ctrl ...
- WINDOWS-基础:Thread.Sleep(0)
我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...
- 01_1JAVA简介
01_1JAVA简介 1. Java基础 语法基础.OO.Exception.Array.基础类.I/O Stream.Collection /Generic.Thread.TCP/UDP.GUI.M ...
- java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法
package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...
- vue-awesome-swiper插件爬坑
最近自己在做一个基于vue的知乎的移动端单页面,遇到很多坑,先说一下遇到最大的坑,其实并不推荐使用 vue-awesome-swiper,如果项目应用轮播,切换少的话.言归正传,现在来介绍vue-aw ...
- jenkins 全局工具配置
- centos7重启后/etc/resolv.conf 被还原解决办法
每次重启服务器后,/etc/resolv.conf文件就被自动还原了,最后发现是被Network Manager修改了. 查看Network Manager服务状态 systemctl status ...
- 【linux】文件默认权限:umask
在默认权限的属性上,目录与文件是不一样的.从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了. 因此 ...
- Python入门学习笔记2:刷题
1) LeetCode 强的面试题和算法题,要求也比较高,很多国内外的码农在上面刷题.难度从easy到hard都有,而且覆盖面极广,需要你的综合实力去答题. 最简单的题比如字符串的处理有的时候也要用到 ...