[BZOJ1058]报表统计
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。
操作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]报表统计的更多相关文章
- 【BZOJ1058】【ZJOI2007】报表统计(链表,堆,Splay)
[BZOJ1058][ZJOI2007]报表统计 题面 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观 ...
- 【BZOJ1058】[ZJOI2007]报表统计 STL
[BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
- [补档][ZJOI2007] 报表统计
[ZJOI2007] 报表统计 题目 传送门 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一 ...
- BZOJ_1058_[ZJOI2007]报表统计_STL
BZOJ_1058_[ZJOI2007]报表统计_STL Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼 ...
- bzoj 1058: [ZJOI2007]报表统计 (Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...
- 基于Fusioncharts的报表统计
先了解fusioncharts插件,fusioncharts是一款基于XML和flash的报表组件,支持Java.PHP.AngularJS等等开发语言,所以,开发出来,加入swf文件,就可以出现动态 ...
- 洛谷 P1110 [ZJOI2007]报表统计 解题报告
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
随机推荐
- Ubuntu 只能用guest登录的问题修复
方式1(推荐): 1.先进入guest登入 2.通过Ctrl+Alt+F1进入命令行窗口(注释:Ctrl+Alt+F1~F6进入终端命令行,Ctrl+Alt+F7是退出终端) 3.登录root,然后进 ...
- Why did we build Zuul? How We Use Zuul At Netflix
Home · Netflix/zuul Wiki https://github.com/Netflix/zuul/wiki Arthur Gonigberg edited this page on M ...
- [linux][shell]负载均衡下多个服务器代码同步方案
说明: 服务器是腾讯的云服务器(腾讯用的是linux container),远程登陆云服务器需要使用代理,在服务器中不能访问外网,所以当时也就没有去想做svn 需求: 1. 把同样的代码同步到不同的服 ...
- DEV中gridview常用属性
1.隐藏最上面的GroupPanel: gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值: sValue=Table.Rows[g ...
- 一个误区(关于javascript的字符串拼接)
前段时间听说了一个问题,说是,javascript中使用+=来拼接字符串会比使用Array的join方法慢几十倍以上,今天在工作间歇,就写了个例 子验证了一下,结果确完全相反,使用+=比join要快( ...
- 【JVM】启动脚本的参数设置
dump文件生成 JVM会在遇到OutOfMemoryError时拍摄一个“堆转储快照”,并将其保存在一个文件中. 1.配置方法 在JAVA_OPTIONS变量中增加 -XX:+HeapDumpOnO ...
- 怎样在QML应用中创建一个Context Menu
我们在非常多的系统中看见能够在屏幕的一个地方长按,然后就能够依据当前显示的上下文弹出一个菜单. 菜单中能够有一些选项,比方删除,改动该项.这样的一般在ListView或GridView中常见.今天,我 ...
- Swift学习——Swift基础具体解释(一)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/34807025 注:由于基础部分在Swi ...
- C的指针疑惑:C和指针8数组
]; ]; 上面申明两个数组,不能进行以下赋值 b = a; 你不能使用赋值符把一个数组的所有元素复制给另一个数组,必须使用一个循环,每次复制一个元素 数组和指针 ]; int *b; 声明一个数组, ...
- R中seurat等问题学习
1.Seurat 转自:https://cloud.tencent.com/developer/article/1055892 # Initialize the Seurat object with ...