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. 20165330 2017-2018-2 《Java程序设计》第8周学习总结

    课本知识总结 第十二章 Java多线程机制 Java中的线程 进程:是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程 线程:一个进程在其执行过程中,可以产生多个线程,形成多条 ...

  2. netty 网关 flume 提交数据 去除透明 批处理 批提交 cat head tail 结合 管道显示行号

    D:\javaNettyAction\NettyA\src\main\java\com\test\HexDumpProxy.java package com.test; import io.netty ...

  3. QQ空间发表日志的图片上传功能实现

    w间接促使了用户注意图片的顺序,进一步优化的方向的是手指触动或鼠标点击来同时进行图片的增删和调序,避免精确的数字输入. 有效code <form action="wcon/wact&q ...

  4. Should You Build Your Own Backtester?

    By Michael Halls-Moore on August 2nd, 2016 This post relates to a talk I gave in April at QuantCon 2 ...

  5. golang 中的定时器(timer),更巧妙的处理timeout

    今天看到kite项目中的一段代码,发现挺有意思的. // generateToken returns a JWT token string. Please see the URL for detail ...

  6. BS一机双屏的解决方式

    一.WebSocket通讯 WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与server全双工通信. 为保证socket不间断.使用下面类库进行socket通讯. ht ...

  7. nanomsg(ZeroMQ with C)

    1.应用手册 https://github.com/nanomsg/nanomsg % mkdir build % cd build % cmake .. % cmake --build . % ct ...

  8. notepade++使用

    Notepad++也可以实现双视图/双窗口对比显示,目前最新版本(6.32)只能支持双视图显示,而且只能支持左右视图,希望后续版本能得到改进. 我们打开两个需要对比显示的源文件 默认的情况下是分成了两 ...

  9. 1141 PAT Ranking of Institutions[难]

    1141 PAT Ranking of Institutions (25 分) After each PAT, the PAT Center will announce the ranking of ...

  10. 剑指offer-基本思想学习(未包括代码)

    转自:https://blog.csdn.net/Together_CZ/article/details/74906427 1.面试7:使用两个栈实现一个队列. //猛一看有点晕,实际上很简单. 使用 ...