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\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
随机推荐
- java 基础 --- java8 HashMap
问题 : HashMap 容量大小 (capacity)为什么为 2n HashMap 是线程安全的吗,为什么 HashMap 既然有hash进行排位还需要equals()作用是什么 文章部分图片 ...
- django中的验证码
from django.shortcuts import renderfrom PIL import Imagefrom PIL import ImageDrawfrom PIL import Ima ...
- log4php使用及配置
log4php使用及配置 1.在项目中加入log4php包 2.log4php配置 在项目配置包中添加logger_config.xml配置文件: logger_config.xml配置文件添加代码如 ...
- 【Chromium】GPU进程启动流程
本篇文档以gpu进程的创建和启动为例,讲述chormium如何启动一个browser进程的子进程 PS:本文使用的chromium代码版本为71 前言 GPU进程的启动时机是由browser进程负责的 ...
- jQuery bind()与delegate()的区别
笔试题: bind()与delegate()的区别主要有三点: 1 绑定目标 .bind直接绑在目标元素上 .delegate绑在父元素上 2 监听个数 .bind监听个数多——每个目标元素都需要添 ...
- Gulp前端服务器本地搭建
前端服务器本地搭建分三阶段: 1.Node.js的安装 2.Npm环境配置 3.编写JS文件 1.Node.js安装: 如图所示: Next: 选择I accept 然后Next: 选择安装文件的位置 ...
- ButterKnife 初体验
ButterKnife 环境搭建 在project的build.gradle文件中添加依赖的插件 //ButterKnife 的插件 // classpath 'com.jakewharton:but ...
- OpenStack 学习笔记 (一)
后续的文章都贴在:臭蛋上 这一系列笔记已经记录很长一段时间了,种种原因没有贴出来,现在陆陆续续的贴出来.可能由于自己理解的 错误和疏忽,导致存在错误,欢迎大家指正,交流. 所有的源码分析都是基于Ope ...
- mybatis报错:org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map
异常信息:org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map com.boco.fsm ...
- .net core系列之《.net core中使用MySql以及Dapper》
当我们决定使用.Net Core开发的时候,就放弃使用SqlServer的打算吧.那应该选择哪个数据库呢?一般选择MySql的比较多. 接下来我们来演示在.Net Core中使用MySQL吧. 1.原 ...