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维护就可以了... --------------------------------------------- ...
随机推荐
- Redis系列七 主从复制(Master/Slave)
主从复制(Master/Slave) 1.是什么 也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主. 2 ...
- Kubernetes 在网易云中的落地优化实践
本文来自网易云社区 今天我跟大家讲的是 Kubernetes 在网易的一些实践,目的是抛砖引玉,看看大家在这个方向有没有更好的实践方法.简单介绍一下网易云.网易云是从最早 Kubernetes 1.0 ...
- jmeter常用测试元件
1.线程组 线程组是任何测试计划的起点,所有的逻辑控制器和采样器都必须放在线程组下.其他的测试元件(例如监听器)可以直接放在测试计划下,这些测试元件对所有的线程组都生效. 每一个JMeter线程都会完 ...
- div布局方案整理
实际项目开发过程中遇到页面 DIV 左右布局的需求:左侧 DIV 固定宽度,右侧 DIV 自适应宽度,填充满剩余页面,由此引申出本文的几种解决方案 1 左侧 DIV 设置 float 属性为 left ...
- mysql新手进阶01
生活不止眼前的苟且,还有诗和远方. 请根据给出的数据库表结构来回答相应问题: DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13)); EMP (EM ...
- 前端开发工程师 - 03.DOM编程艺术 - 期末考试
期末考试客观题 返回 倒计时: 01:24 1 单选(2分) 以下选项中不是节点类型的是 A. COMMENT_NODE B. DOCUMENT_NODE C. BODY_NODE D. E ...
- 82. Single Number [easy]
Description Given 2*n + 1 numbers, every numbers occurs twice except one, find it. Example Given [1, ...
- beego 笔记
1.开发文档 https://beego.me/docs/intro/ 2.bee run projectname demo controller package autoscaler import ...
- POJ 2986 A Triangle and a Circle(三角形和圆形求交)
Description Given one triangle and one circle in the plane. Your task is to calculate the common are ...
- 福大软工1816:Alpha(6/10)
Alpha 冲刺 (6/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.组织会议 2.帮助队员解决 ...