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\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
随机推荐
- Orchard源码:缓存设计
概述 从缓存失效的几种方式开始了解Orchard缓存设计 1.设置失效时间 Func<int> retrieve = () => _cacheManager.Get("te ...
- js控制表格隔行变色
只是加载时候隔行变一个颜色,鼠标滑动上去时候没有变化 <table width="800" border="0" cellpadding="0& ...
- 图解源码之FutureTask篇(AQS应用)
所以,FutureTask既可以由Executor来调度执行,也可以由调度线程调用FutureTask.run()直接执行. FutureTask是通过AQS的模板设计模式来实现阻塞get方法的. 从 ...
- CentOS 安装Parallels Tools
为了做到Mac和Linux之间共享文件夹,因此需要安装Parallels Tool, 具体安装步骤可以参考 install parallels tool for linux guest http:// ...
- bnu 4060 奇偶性,异或运算
Plants vs. Zombies Time Limit: 5000ms Memory Limit: 2048KB 64-bit integer IO format: %lld Jav ...
- HDU 4747(AC不能)
http://acm.hdu.edu.cn/showproblem.php?pid=4747
- JavaWeb学习总结(二):Http协议
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...
- PHP开发支付宝之电脑网站支付--流程简介
前言 前端时间自己开发了一个drupal的支付宝模块,现在整理一下过程,因为支付宝官方网站提供的接口及文档都是新接口的,而且使用新接口的过程比较麻烦一点,所以整理一下 1.支付宝的账号必须经过企业资格 ...
- JavaScript的进阶之路(七)客户端JavaScript知识点总结
一.客户端JavaScript主要是BOM DOM的操作和js脚本的兼容性.互用性.可访问性.安全性的应用.以及一些框架的引用. 二.BOM:浏览器对象模型 主要介绍window对象 1.定时器:se ...
- visual studio 2015通过附加进程调试wcf服务
网站: 打开wcf服务所在的项目 然后调用iis上部署的HLFC(crm)项目的接口就可以进行调试 注意 WCF服务项目要以管理员身份打开,调用wcf服务的项目要在iis中部署并点击调用后才能在附加到 ...