Description

  小Q的妈妈是一个出纳,经常需要做一些统计报表的工作。今天是妈妈的生日,小Q希望可以帮妈妈分担一些工
作,作为她的生日礼物之一。经过仔细观察,小Q发现统计一张报表实际上是维护一个可能为负数的整数数列,并
且进行一些查询操作。在最开始的时候,有一个长度为N的整数序列,并且有以下三种操作: INSERT i k 在原数
列的第i个元素后面添加一个新元素k; 如果原数列的第i个元素已经添加了若干元素,则添加在这些元素的最后(
见下面的例子) MIN_GAP 查询相邻两个元素的之间差值(绝对值)的最小值 MIN_SORT_GAP 查询所有元素中最接
近的两个元素的差值(绝对值) 例如一开始的序列为 5 3 1 执行操作INSERT 2 9将得到: 5 3 9 1 此时MIN_GAP
为2,MIN_SORT_GAP为2。 再执行操作INSERT 2 6将得到: 5 3 9 6 1 注意这个时候原序列的第2个元素后面已经
添加了一个9,此时添加的6应加在9的后面。这个时候MIN_GAP为2,MIN_SORT_GAP为1。于是小Q写了一个程序,使
得程序可以自动完成这些操作,但是他发现对于一些大的报表他的程序运行得很慢,你能帮助他改进程序么?

Input

  第一行包含两个整数N,M,分别表示原数列的长度以及操作的次数。第二行为N个整数,为初始序列。接下来
的M行每行一个操作,即“INSERT i k”,“MIN_GAP”,“MIN_SORT_GAP”中的一种(无多余空格或者空行)。

Output

  对于每一个“MIN_GAP”和“MIN_SORT_GAP”命令,输出一行答案即可。

Sample Input

3 5
5 3 1
INSERT 2 9
MIN_SORT_GAP
INSERT 2 6
MIN_GAP
MIN_SORT_GAP

Sample Output

2
2
1

HINT

N , M ≤500000 对于所有的数据,序列内的整数不超过5*10^8。

操作2是找前驱后继,操作3是单点修改区间取$min$,线段树维护一下即可

PS:洛谷能过BZOJ TLE?

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define inf 1e9
#define ls node<<1
#define rs node<<1|1
#define M 1500010
using namespace std;
int n,m,sz,root,del=inf,ans1=inf,ans2=inf;
int a[M],f[M],val[M],cnt[M],last[M],ch[M][];
struct Tree
{
int val[M<<];
void update(int node) {val[node]=min(val[ls],val[rs]);}
void build(int node,int l,int r)
{
if(l==r) {val[node]=abs(a[l]-a[l-]);return;}
int mid=(l+r)/;
build(ls,l,mid),build(rs,mid+,r);
update(node);
}
void change(int node,int l,int r,int x,int v)
{
if(l==r) {val[node]=v;return;}
int mid=(l+r)/;
if(x<=mid) change(ls,l,mid,x,v);
else change(rs,mid+,r,x,v);
update(node);
}
}T;
int get(int x){return ch[f[x]][]==x;}
void rotate(int x)
{
int old=f[x],oldf=f[old],k=get(x);
ch[old][k]=ch[x][k^]; f[ch[old][k]]=old;
ch[x][k^]=old; f[old]=x; f[x]=oldf;
if(oldf) ch[oldf][ch[oldf][]==old]=x;
}
void splay(int x)
{
for(int fa;(fa=f[x])!=;rotate(x))
if(f[fa]!=)
rotate(get(x)==get(fa)?fa:x);
root=x;
}
void insert(int x)
{
int now=root,last=;
while(now&&val[now]!=x)
last=now,now=ch[now][val[now]<x];
if(now) cnt[now]++;
else
{
now=++sz;
if(last) ch[last][val[last]<x]=now;
val[now]=x; f[now]=last; cnt[now]++;
}
splay(now);
}
void find(int x)
{
int now=root;
while(x!=val[now]&&ch[now][x>val[now]])
now=ch[now][x>val[now]];
splay(now);
}
int Next(int x,int f)
{
find(x);
int now=root;
if(cnt[now]) return now;
if(val[now]<x&&!f) return now;
if(val[now]>x&&f) return now;
now=ch[now][f];
while(ch[now][f^]) now=ch[now][f^];
return now;
}
void getnew(int i,int x)
{
T.change(,,n,i+,abs(a[i+]-x));
del=min(del,abs(last[i]-x));
ans2=min(ans2,abs(x-val[Next(x,)]));
ans2=min(ans2,abs(x-val[Next(x,)]));
insert(x);last[i]=x;
}
int main()
{
memset(last,,sizeof(last));
memset(a,,sizeof(a));
insert(-inf),insert(inf);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
T.build(,,n);
for(int i=;i<=n;i++) getnew(i,a[i]);
for(int i=;i<=m;i++)
{
char s[];scanf("%s",s);
if(s[]=='I')
{
int x,y;scanf("%d%d",&x,&y);
getnew(x,y);
}
else if(s[]=='G') printf("%d\n",min(del,T.val[]));
else printf("%d\n",ans2);
}
return ;
}

[BZOJ1058]报表统计的更多相关文章

  1. 【BZOJ1058】【ZJOI2007】报表统计(链表,堆,Splay)

    [BZOJ1058][ZJOI2007]报表统计 题面 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观 ...

  2. 【BZOJ1058】[ZJOI2007]报表统计 STL

    [BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...

  3. bzoj1058: [ZJOI2007]报表统计

    set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...

  4. BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )

    这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...

  5. [补档][ZJOI2007] 报表统计

    [ZJOI2007] 报表统计 题目 传送门 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一 ...

  6. BZOJ_1058_[ZJOI2007]报表统计_STL

    BZOJ_1058_[ZJOI2007]报表统计_STL Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼 ...

  7. bzoj 1058: [ZJOI2007]报表统计 (Treap)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...

  8. 基于Fusioncharts的报表统计

    先了解fusioncharts插件,fusioncharts是一款基于XML和flash的报表组件,支持Java.PHP.AngularJS等等开发语言,所以,开发出来,加入swf文件,就可以出现动态 ...

  9. 洛谷 P1110 [ZJOI2007]报表统计 解题报告

    P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...

随机推荐

  1. Hibernate的时间戳缓存区域

    时间戳:一个详细到秒的时间点,就是一个时分秒的字符串 时间戳缓存区域存放了对于查询结果相关的表进行插入, 更新或删除操作的时间戳. Hibernate 通过时间戳缓存区域来判断被缓存的查询结果是否过期 ...

  2. Code Forces 645A Amity Assessment

    A. Amity Assessment time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...

  3. python学习笔记(四)— 补充

    函数return多个值 函数如果有多个return值,那么会生成一个元组里面 def hello(a,b,c,d): return a,b,c,d res =hello('aa','cc','dd', ...

  4. 前端开发 - CSS - 总结

    CSS:层叠样式表(Cascading Style Sheets) 1.css的特征2.css的引入3.选择器4.伪类选择器5.伪元素选择器6.字体样式 文本样式 背景属性7.盒模型 border m ...

  5. Ubutun使用记录——语系错误(转)

    add by zhj: 对原文有修改,原文是在创建用户时出现的问题,而我是在使用psql时出现的, 但问题是相同的. 原文:http://www.douban.com/note/362250557/ ...

  6. Zabbix3的离线安装

    背景与环境 由于实际情况需求,zabbix在局域网中进行部署,遇到许多问题,在此记录. 操作系统:CentOS 6.9(使用的最小安装) zabbix版本:zabbix-3.0.13(LTS) php ...

  7. Elasticsearch.js 发布 —— 在Node.js和浏览器中调用Elasticsearch

    继PHP.Ruby.Python和Perl之后,Elasticsearch最近发布了Elasticsearch.js,Elasticsearch的JavaScript客户端库.可以在Node.js和浏 ...

  8. Go实现查找目录下(包括子目录)替换文件内容

    [功能] 按指定的目录查找出文件,如果有子目录,子目录也将进行搜索,将其中的文件内容进行替换. [缺陷] 1. 没有过滤出文本文件 2. 当文件过大时,效率不高 [代码] package main i ...

  9. 如何在VC6.0下用pthread.h这个头文件

    如何在VC6.0下用pthread.h这个头文件   1.下载PTHREAD的WINDOWS开发包 pthreads-w32-2-4-0-release.exe(任何一个版本均可) http://so ...

  10. android ListView SimpleAdapter 带图片

    main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...