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\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
随机推荐
- 【10】Quartz.net 定时服务实例
一.安装nuget包 Install-Package Quartz Install-Package Common.Logging.Log4Net1211 Install-Package log4net ...
- 标准Trie字典树学习二:Java实现方式之一
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...
- fieldset、legend、display html元素
fieldset 定义和用法 fieldset 元素可将表单内的相关元素分组. <fieldset> 标签将表单内容的一部分打包,生成一组相关表单的字段. 当一组表单元素放到 <fi ...
- yum卸载
完全卸载依赖 -- 正常安装 yum install sl -- 列出操作 yum history list sl -- 根据显示install操作的id进行删除 yum history undo { ...
- K:顺序表和链表的比较
顺序表和链表是线性表的两种基本实现形式(链表还有多种变化形式),对于这两种实现方式,没有一种方法可以称是最好的,他们各自有着各自的特点和优缺点,适用于不同的应用场景. 与顺序表相比,链表较为灵活, ...
- 用fritzing绘制arduino硬件连线图
在http://fritzing.org/home/ 点击下载最新版本. 解压之后直接可以使用. 打开Fritzing.exe 在点击面包板,在搜索界面输入想要找到的原件拖拽即可放在面包板所在的图上. ...
- LeetCode赛题395----Longest Substring with At Least K Repeating Characters
395. Longest Substring with At least K Repeating Characters Find the length of the longest substring ...
- 关于eclipse连接外置android模拟器
1.win+R,输入cmd,打开命令提示符 2.cd D:\Java(安卓应用开发)\adt-bundle-windows-64\sdk\platform-toolsadb connect 127.0 ...
- 基于Vue的WebApp项目开发(六)
实现商品购买列表页面 步骤一:新建goodslist.vue文件 <template> <div id="tml"> <!--利用mui中的图文表格组 ...
- 软工读书笔记 week 1
这次读书笔记主要是就<程序员修炼之道>这本书的前半部分做一些总结以及发表一些自己的看法. 本书前面的一部分主要是一些程序员应该在工作中时刻注意的事情,一些关键的信息如下: 1.处理问题的态 ...