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\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
随机推荐
- ContextMenustrip 控件
ContextMenustrip 控件是由 System.Windows.Forms.ContextMenustrip类提供,也是ToolstripMenu对象的容器,用来创建窗体的右键显示的菜单,主 ...
- Entity FreamWork框架
实体框架 (Entity Framework) 1.是微软以ADO.Net为基础所发展出来的对象关系对应(O/R Mapping)解决方案. 2.实体框架Entity Framework是ADO.Ne ...
- 访问Django项目出现DisallowedHost at / Invalid HTTP_HOST header问题
闲来无事,想玩玩django,源码安装碰到了一堆乱七八糟依赖性问题,耗费一下午的时间总算是在ubuntu14.04上搭建好了python3+django2开发环境, 心血来潮,创建了一个django项 ...
- 以面向对象的思想实现数据表的添加和查询,JDBC代码超详细
以面向对象的思想编写JDBC程序,实现使用java程序向数据表中添加学生信息,并且可以实现给定身份证号查询学生信息或给定准考证号查询学生信息. 创建的数据表如下: CREATE TABLE EXAMS ...
- Oracle SQL developer 连接 MySQL 数据库安装配置
1. 下载 JDBC driver for MySQL 下载链接: https://dev.mysql.com/downloads/connector/j/ 下载成功后,解压缩,得到 mysql jd ...
- Hunger Snake3
- Jenkins-在节点上执行copy命令,将节点机上的文件拷贝到映射的网络驱动盘中报错,访问被拒绝 找不到指定驱动器
问题如标题,根据网友提供的解决方法,完美解决: 在jenkins中执行这个命令时报错 说无法访问. 重新映射一次可解决这个问题,添加一条 net use 命令
- jenkins学习笔记
Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建.测试和部署等功能.本系列博客以 windows 10 环境为例 1 安装 ...
- java设计模式-----3、抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创 ...
- PoPo数据可视化周刊第2期
羡辙在bilibili开课啦 就在这个月,不知道是不是受了 @Jannchie见齐 的影响,羡辙竟然在bilibili开授Echarts课程,目前已开课两节. [滚城一团]的 ECharts 训练营 ...