BZOJ1058:[ZJOI2007]报表统计(Splay,堆)
Description
Input
Output
对于每一个“MIN_GAP”和“MIN_SORT_GAP”命令,输出一行答案即可。
Sample Input
5 3 1
INSERT 2 9
MIN_SORT_GAP
INSERT 2 6
MIN_GAP
MIN_SORT_GAP
Sample Output
2
1
HINT
N , M ≤500000 对于所有的数据,序列内的整数不超过5*10^8。
Solution
操作1用splay维护区间
操作2在进行操作1的时候从堆里删除旧的相邻值然后插入两个新的相邻值,
然后在到2的时候输出堆顶
注意可删除堆的操作(将删除的数放到del堆里,当两堆堆顶相同就pop
操作3再开一个splay维护数就好了,每次查询下前驱后继,开个堆维护下最小值
Code
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<queue>
#include<algorithm>
#define N (2000000+1000)
using namespace std;
int last[N],Val[N],Father[N],Son[N][],ins[N],Cnt[N],Size[N];
int INF,n,m,a[N],sz=,SZ,ROOT,root;
priority_queue<int,vector<int>,greater<int> >ans;
priority_queue<int,vector<int>,greater<int> >del;
priority_queue<int,vector<int>,greater<int> >minnum; int Get(int x){return Son[Father[x]][]==x;}
void Update(int x){Size[x]=Cnt[x]+Size[Son[x][]]+Size[Son[x][]];}
int Pre(int now){now=Son[now][]; while (Son[now][]) now=Son[now][]; return now;}
int Next(int now){now=Son[now][]; while (Son[now][]) now=Son[now][]; return now;} void Rotate(int x)
{
int wh=Get(x);
int fa=Father[x],fafa=Father[fa];
if (fafa) Son[fafa][Son[fafa][]==fa]=x;
Son[fa][wh]=Son[x][wh^]; Father[fa]=x;
if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
Son[x][wh^]=fa; Father[x]=fafa;
Update(fa); Update(x);
} void Splay(int x,int tar,int &Root)
{
for (int fa; (fa=Father[x])!=tar; Rotate(x))
if (Father[fa]!=tar)
Rotate(Get(fa)==Get(x)?fa:x);
if (!tar) Root=x;
} void Insert(int x)
{
if (!root)
{
root=++sz;
Size[sz]=Cnt[sz]=;
Val[sz]=x;
return;
}
int now=root,fa=;
while ()
{
if (x==Val[now])
{
Cnt[now]++;
Update(now);
Splay(now,,root);
return;
}
fa=now,now=Son[now][x>Val[now]];
if (now==)
{
Size[++sz]=Cnt[sz]=;
Val[sz]=x;
Father[sz]=fa;
Son[fa][x>Val[fa]]=sz;
Splay(sz,,root);
return;
}
}
} int Build(int l,int r,int fa)
{
if (l>r) return ;
int mid=(l+r)>>;
Size[mid]=Cnt[mid]=;
Val[mid]=a[mid];
Father[mid]=fa;
Son[mid][]=Build(l,mid-,mid);
Son[mid][]=Build(mid+,r,mid);
return mid; }
int Findx(int x)
{
int now=ROOT;
while ()
if (x<=Size[Son[now][]])
now=Son[now][];
else
{
x-=Size[Son[now][]];
if (x<=Cnt[now])
{
Splay(now,,ROOT);
return now;
}
x-=Cnt[now];
now=Son[now][];
}
}
int Split(int x,int y)
{
Splay(x,,ROOT); Splay(y,x,ROOT);
return y;
} int main()
{
memset(&INF,0x3f,sizeof(INF));
scanf("%d%d",&n,&m); SZ=n+;
for (int i=;i<=n;++i)
scanf("%d",&a[i+]);
a[]=a[n+]=INF;
for (int i=;i<=n+;++i)
{
Insert(a[i]);
if (Cnt[root]> && Val[root]!=INF) minnum.push();
else
{
int pre=Pre(root),next=Next(root);
if (pre) minnum.push(abs(Val[root]-Val[pre]));
if (next) minnum.push(abs(Val[root]-Val[next]));
}
if (i>) ans.push(abs(a[i]-a[i-]));
last[i]=i;
}
ROOT=Build(,n+,);
sort(a+,a+n++);
for (int i=;i<=n+;++i)
minnum.push(abs(Val[i]-Val[i-]));
for (int i=;i<=m;++i)
{
char opt[]; int x,y;
scanf("%s",opt);
if (opt[]=='R')
{
scanf("%d%d",&x,&y); x++;
int p=Split(last[x],x+);
Val[++SZ]=y; Father[SZ]=p;
Son[p][]=SZ;
ins[x]++;
Size[SZ]=Cnt[SZ]=;
Splay(SZ,,ROOT);
last[x]=SZ;
int pre=Pre(ROOT),next=Next(ROOT);
del.push(abs(Val[pre]-Val[next]));
ans.push(abs(Val[pre]-Val[SZ]));
ans.push(abs(Val[next]-Val[SZ]));
Insert(y);
if (Cnt[root]>) minnum.push();
else
{
pre=Pre(root),next=Next(root);
minnum.push(abs(Val[root]-Val[pre]));
minnum.push(abs(Val[root]-Val[next]));
}
}
if (opt[]=='G')
{
while (!del.empty() && del.top()==ans.top())
del.pop(),ans.pop();
printf("%d\n",ans.top());
}
if (opt[]=='S')
printf("%d\n",minnum.top());
}
}
BZOJ1058:[ZJOI2007]报表统计(Splay,堆)的更多相关文章
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- BZOJ1058: [ZJOI2007]报表统计(set)
Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 4190 Solved: 1420[Submit][Status][Discuss] Descript ...
- 洛谷.1110.[ZJOI2007]报表统计(Splay Heap)
题目链接 附纯SplayTLE代码及主要思路: /* 可以看做序列有n段,Insert是每次在每一段最后插入一个元素 只有插入,没有删除,所以插入一个元素对于询问1影响的只有该元素与前边一个元素(同段 ...
- bzoj1058: [ZJOI2007]报表统计 stl xjbg
小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个可能为负数的整数数列,并且 ...
- [bzoj1058][ZJOI2007][报表统计] (STL)
Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个 ...
- 【set】【multiset】bzoj1058 [ZJOI2007]报表统计
对n个位置,每个位置维护一个vector. 每次插入,可能对MIN_SORT_GAP产生的影响,只可能是 插入元素 和 它的 前驱 后继 造成的,用一个set维护(存储所有序列中的元素). 我们还得维 ...
- [ZJOI2007]报表统计(splay,堆)
[ZJOI2007]报表统计(luogu) Description 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. ...
- 【BZOJ1058】[ZJOI2007]报表统计 STL
[BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...
- 洛谷 P1110 [ZJOI2007]报表统计 解题报告
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
随机推荐
- 打印插件--PAZU
PAZU对打印控制实现了: 2.1 设置页眉页脚 2.2 指定纸张大小 2.3 设置纸张方向 2.4 设置页边距 2.5 选择指定的打印机 2.6 无需用户确认,JS直接调用打印预览 2.7 无需用户 ...
- NFS挂载时出现"access denied by server while mounting"的解决方法
NFS挂载时出现"access denied by server while mounting"的解决方法 2015-01-14 何敏杰 3条评论 44,071次浏览 NFS是 ...
- Vue学习笔记:Slot
转自:https://www.w3cplus.com/vue/vue-slot.html 在Vue中,slot也分多种,从Vue的官网中可以获知,其主要分为:单个插槽.具名插槽和作用域插槽三种 父组件 ...
- Java8增强的Map集合
Map集合简介 Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组用于保存Map里的vlaue,key和value都可以是任何引用类型的数据. M ...
- 撩课-Web大前端每天5道面试题-Day4
1. 如何实现瀑布流? 瀑布流布局的原理: ) 瀑布流布局要求要进行布置的元素等宽, 然后计算元素的宽度, 与浏览器宽度之比,得到需要布置的列数; ) 创建一个数组,长度为列数, 里面的值为已布置元素 ...
- C# 调用C++DLL 类型转换
内容转自网上····这里做 备份··· 原文链接: http://blog.csdn.net/miss_easy/article/details/52470964 /C++中的DLL函数原型为 //e ...
- python学习之老男孩python全栈第九期_day020知识点总结——序列化模块、模块的导入和使用
一. 序列化模块 # 序列化 --> 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化# 反序列化 --> 从字符串转换成数据类型的过程叫做反序列化# 序列 -- 字符串 # 什 ...
- Redis实现分布式锁2
redisTemplate实现分布式锁 /** * 分布式锁-加锁 * @param key * @param value 当前时间+超时时间 System.currentTimeMillis()+t ...
- 神奇的AC
- String对象的match方法
RegExp对象的exec方法和String对象的match方法用法十分相似,分两篇博客讲讲其各自的用法和它们之间的异同.上一篇将exec方法的用法,这篇讲解match方法,并比较其异同. 定义与语法 ...