BZOJ1058:[ZJOI2007]报表统计——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1058
https://www.luogu.org/problemnew/show/P1110#sub
实现三种操作:
INSERT i k:在原数列的第i个元素后面添加一个新元素k;如果原数列的第i个元素已经添加了若干元素,则添加在这些元素的最后(见下面的例子)
MIN_GAP:查询相邻两个元素的之间差值(绝对值)的最小值
MIN_SORT_GAP:查询所有元素中最接近的两个元素的差值(绝对值)
显然这三种操作都可以splay做啊,愉快的敲了两个splay……
T!L!E!
(总觉得复杂度是对的,可能改成边插边更新(就像本代码一样)能过)
第三种操作没啥好想法,考虑第二种操作,用线段树维护差值最小值。
插入的元素对后来插这个位置的元素造成的贡献有影响,但之后将永远不会改变,于是暴力更新这个差值。
插入的元素影响了它之后位置的元素的贡献,且会不断改变,于是在线段树更新这个差值即可。
#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=;
const int INF=1e9;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
char s[];
int fa[N],tr[N][],key[N],id[N];
int b[N],del[N],c[N];
int root,sz;
inline bool get(int x){
return tr[fa[x]][]==x;
}
int pre(){
int now=tr[root][];
while(tr[now][])now=tr[now][];
return now;
}
int nxt(){
int now=tr[root][];
while(tr[now][])now=tr[now][];
return now;
}
inline void rotate(int x){
int y=fa[x],z=fa[y],which=get(x);
tr[y][which]=tr[x][which^];fa[tr[y][which]]=y;
fa[y]=x;tr[x][which^]=y;fa[x]=z;
if(z)tr[z][tr[z][]==y]=x;
return;
}
inline void splay(int x){
int f=fa[x];
while(f){
if(fa[f])rotate(get(x)==get(f)?f:x);
rotate(x);f=fa[x];
}
root=x;
return;
}
inline void insert(int v){
if(!root){
sz++;tr[sz][]=tr[sz][]=fa[sz]=;
key[sz]=v;root=sz;
return;
}
int now=root,f=;
while(){
f=now;
now=tr[now][key[now]<=v];
if(!now){
sz++;tr[sz][]=tr[sz][]=;
fa[sz]=f;key[sz]=v;
tr[f][key[f]<=v]=sz;
splay(sz);
break;
}
}
return;
}
void build(int a,int l,int r){
if(l==r){
del[a]=abs(b[l]-b[l-]);
return;
}
int mid=(l+r)>>;
build(a*,l,mid);build(a*+,mid+,r);
del[a]=min(del[a*],del[a*+]);
}
void ins(int a,int l,int r,int p,int x){
if(l==r){
del[a]=x;
return;
}
int mid=(l+r)>>;
if(p<=mid)ins(a*,l,mid,p,x);
else ins(a*+,mid+,r,p,x);
del[a]=min(del[a*],del[a*+]);
}
int main(){
int n=read(),m=read();
int ans1=INF,ans2=INF;
b[]=c[]=INF;
for(int i=;i<=n;i++){
b[i]=c[i]=read();
insert(b[i]);
if(i!=){
int pr=pre(),nx=nxt();
if(pr)ans2=min(ans2,abs(key[pr]-b[i]));
if(nx)ans2=min(ans2,abs(key[nx]-b[i]));
}
}
build(,,n);
for(int i=;i<=m;i++){
scanf("%s",s);
if(s[]=='I'){
int pos=read(),v=read();
insert(v);
int pr=pre(),nx=nxt();
if(pr)ans2=min(ans2,abs(key[pr]-v));
if(nx)ans2=min(ans2,abs(key[nx]-v));
ans1=min(ans1,abs(c[pos]-v));
c[pos]=v;
if(pos+<=n)ins(,,n,pos+,abs(b[pos+]-v));
}else if(strlen(s)==){
printf("%d\n",min(del[],ans1));
}else{
printf("%d\n",ans2);
}
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ1058:[ZJOI2007]报表统计——题解的更多相关文章
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- bzoj1058: [ZJOI2007]报表统计 stl xjbg
小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个可能为负数的整数数列,并且 ...
- BZOJ1058: [ZJOI2007]报表统计(set)
Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 4190 Solved: 1420[Submit][Status][Discuss] Descript ...
- BZOJ1058:[ZJOI2007]报表统计(Splay,堆)
Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个 ...
- [bzoj1058][ZJOI2007][报表统计] (STL)
Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个 ...
- 【set】【multiset】bzoj1058 [ZJOI2007]报表统计
对n个位置,每个位置维护一个vector. 每次插入,可能对MIN_SORT_GAP产生的影响,只可能是 插入元素 和 它的 前驱 后继 造成的,用一个set维护(存储所有序列中的元素). 我们还得维 ...
- 【BZOJ1058】[ZJOI2007]报表统计 STL
[BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...
- bzoj P1058 [ZJOI2007]报表统计——solution
1058: [ZJOI2007]报表统计 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4099 Solved: 1390 [Submit][St ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
随机推荐
- javaweb(六)——Servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- katalon系列六:Katalon Studio Web UI关键字讲解
在一个Test Case里,点左上Add-Web UI Keyword,可以添加一行新的命令. 像Click.setText.Delay这些最基本的,大家还是看看官方的API文档吧,望文知义,如果是纯 ...
- 初学Direct X(4)
初学Direct X(4) 本文学着做出一个如下的小游戏 游戏方式是使用键盘控制红色的Bucket收集蓝色的炸弹 1.酝酿一下 现在我已经掌握: 将位图文件加载到内存 绘制位图到buckbuffer ...
- 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(下)
第1章.基础篇(下) Abstract: 数据通信.数据存储.动画.音频与视频.canvas.BOM.表单操作.列表操作 数据通信(HTTP协议) HTTP事务: 客户端向服务器端发送HTTP请求报文 ...
- Zookeeper 分布式应用
简介 这篇文章是旨在为那些想要利用zookeeper协调服务能力进行分布式应用创建的开发者的入门指导,包括一些理论性和实践性的内容. 文章的前四部分系统的介绍了zookeeper的相关概念,对于理解z ...
- spark写入ES(动态模板)
使用es-hadoop插件,主要使用elasticsearch-spark-20_2.11-6.2.x.jar 官网:https://www.elastic.co/guide/en/elasticse ...
- 【C#】ArcFace2 视频人脸比对教程
请允许我大言不惭,叫做教程,特希望各位能指正.哦,我用的是vs2017.了解更多详情可以访问虹软人工智能开放平台 一.准备工作 1.创建项目 2.添加EMGU.CV包 ,并设属性“复制到输出目录”为“ ...
- 2018java开发一些面经
算法系列:https://www.cnblogs.com/yanmk/p/9232908.html 2018Java开发面经(持续更新) 不要给自己挖坑!!!不要给自己挖坑!!!不要给自己挖坑!!!如 ...
- 关闭Tomcat进程 一条语句(必看)
写在开始 MAC系统下进行JAVA研发,经常遇到的一个问题就是杀死异常Tomcat 通常都是用两条指令,先查询出Tomcat占用的进程,再kill掉该进程, 其实有一种联合语句的方式可以一条语句直接关 ...
- Redhat linux 安装SVN服务器 CollabNetSubversionEdge
请仔细阅读安装包自带的readme文件! ================================================= 1. 先去官网,找安装包: http://subversi ...