题目链接

比较简单的一道平衡树题。

第三个操作可以直接用map完成(加进去一个数只会让答案变小,于是与它的前面后面一个数做差更新答案即可),只考虑前两个操作。

·维护区间内的最大最小值,以及区间相邻两数最小差值。

·对于insert x k ,相当于在x+1前插入k,再用一个树状数组维护原数组中的每个数在现在的数组中是第几个,这个操作相当于对 x+1 ~ n 的排名全部加了1。

复杂度O(nlogn) ,常数略大...

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cmath>
#include<stack>
#include<map>
#include<cassert>
#define P puts("lala")
#define cp cerr<<"lala"<<endl
#define ln putchar('\n')
#define sp putchar(' ')
#define pb push_back
#define pf push_front
#define fi first
#define se second
#define mkp make_pair
using namespace std;
typedef pair<int,int> pii;
inline void read(int &re)
{
char ch=getchar();int g=1;
while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
re=0;
while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
re*=g;
}
typedef long long ll;
inline void read(ll &re)
{
char ch=getchar();ll g=1;
while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
re=0;
while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+ch-48ll,ch=getchar();
re*=g;
} const int N=500050;
const int inf=0x3f3f3f3f;
map<int,int>mp;
map<int,int>::iterator it,it1; int dv[N],n,m;
inline void add(int x,int k)
{
for(;x<=n;x+=(x&-x)) dv[x]+=k;
}
inline int ask(int x)
{
int sum=0;
for(;x>0;x-=(x&-x)) sum+=dv[x];
return sum;
} int key[N<<1],mind[N<<1],ch[N<<1][2],fa[N<<1],pre[N<<1],nex[N<<1];
int a[N],sz,root,siz[N<<1]; inline void up(int o)
{
mind[o]=min(mind[ch[o][0]],mind[ch[o][1]]);
pre[o]=key[o];nex[o]=key[o];
siz[o]=1;
if(ch[o][0])
{
mind[o]=min(mind[o],abs(key[o]-nex[ch[o][0]]));
pre[o]=pre[ch[o][0]];
siz[o]+=siz[ch[o][0]];
}
if(ch[o][1])
{
mind[o]=min(mind[o],abs(key[o]-pre[ch[o][1]]));
nex[o]=nex[ch[o][1]];
siz[o]+=siz[ch[o][1]];
}
} void build(int &o,int l,int r)
{
if(l>r) return ;
o=++sz;
int mid=l+r>>1;
key[o]=a[mid];
siz[o]=1;
pre[o]=a[mid];nex[o]=a[mid];
mind[o]=inf;
if(l==r) return ;
build(ch[o][0],l,mid-1);build(ch[o][1],mid+1,r);
fa[ch[o][0]]=o;fa[ch[o][1]]=o;
up(o);
} inline bool ge(int x){return ch[fa[x]][1]==x;}
inline void rotate(int x)
{
int f=fa[x],g=fa[f],wh=ge(x);
ch[f][wh]=ch[x][wh^1];fa[ch[f][wh]]=f;
ch[x][wh^1]=f;fa[f]=x;
fa[x]=g;
if(g) ch[g][ch[g][1]==f]=x;
up(f);up(x);
}
void splay(int x)
{
for(int f;f=fa[x];rotate(x)) if(fa[f]) rotate(ge(x)==ge(f)?f:x);
root=x;
}
int find(int k)
{
//assert(k<=siz[root]);
//assert(k>=1);
int x=root;
while(1)
{
if(k<=siz[ch[x][0]]) x=ch[x][0];
else
{
k-=siz[ch[x][0]];
if(k<=1) return x;
k--;
x=ch[x][1];
}
}
} void inspre(int k)
{
int x=ch[root][0];
while(ch[x][1]) x=ch[x][1];
ch[x][1]=++sz;siz[sz]=1;
pre[sz]=k;key[sz]=k;nex[sz]=k;
fa[sz]=x;mind[sz]=inf;
up(x);
splay(sz);
} char in[50];
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);freopen("1.out","w",stdout);
#endif
int i,j,opt,T;
mind[0]=inf;
read(n);read(m);
for(i=1;i<=n;++i) add(i,1);
for(i=1;i<=n;++i) read(a[i]),mp[a[i]]++;
build(root,1,n);
int minn=inf;
for(it=mp.begin();it!=mp.end();++it)
{
it1=it;
it1++;
if(it1!=mp.end()) minn=min(minn,abs( (it->fi)-(it1->fi) ));
if((it->second)>1) minn=0;
}
siz[0]=0;
for(int cas=1;cas<=m;++cas)
{
scanf("%s",in);
if(in[0]=='I')
{
int x,k;read(x);read(k);
//cerr<<cas<<endl;
if(x+1>n)
{
int rt=find(siz[root]);
splay(rt);
root=++sz;
ch[sz][0]=rt;
fa[rt]=sz;
key[sz]=k;mind[sz]=inf;
up(sz);
}
else
{
int rt=find(ask(x+1));
splay(rt);
//cout<<siz[root]<<endl;
inspre(k);
}
mp[k]++;
it=mp.find(k);
if((it->se)>1) minn=0;
else
{
it1=it;
if(it1!=mp.begin())
{
it1--;
minn=min(minn,abs((it1->fi)-k));
}
it++;
if(it!=mp.end()) minn=min(minn,abs((it->fi)-k));
}
add(x+1,1);
}
else if(in[4]=='G') printf("%d\n",mind[root]);
else if(in[4]=='S') printf("%d\n",minn);
}
return 0;
}
/* */

ZJOI2007报表统计的更多相关文章

  1. bzoj1058: [ZJOI2007]报表统计

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

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

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

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

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

  4. BZOJ_1058_[ZJOI2007]报表统计_STL

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

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

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

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

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

  7. bzoj P1058 [ZJOI2007]报表统计——solution

    1058: [ZJOI2007]报表统计 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4099  Solved: 1390 [Submit][St ...

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

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

  9. [ZJOI2007]报表统计(splay,堆)

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

  10. 1058: [ZJOI2007]报表统计 - BZOJ

    Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个非 ...

随机推荐

  1. 6.1 NOI 模拟

    \(T1\ pocky\) 要求式子 \[\sum_{i=2}^n a_i\times \gcd(a_i,a_{i-1}) \] 考虑可以枚举\(a_i,a_{i-1}\)的值,然后插板法,枚举每个位 ...

  2. springboot整合xxl-job分布式定时任务【图文完整版】

    一.前言 定时任务有很多种,有一些大的框架也有一些简单的实现. 比如常见的: JDK的Timer和TimerTask Quartz异步任务调度框架 分布式定时任务XXL-JOB Spring Task ...

  3. Apache DolphinScheduler 使用文档(4/8):软件部署

    本文章经授权转载,原文链接: https://blog.csdn.net/MiaoSO/article/details/104770720 目录 4. 软件部署 4.1 为 dolphinschedu ...

  4. 微信小程序检查版本更新并重启

    目录 1,前言 2,解决方案 3,调试须知 1,前言 最近开发小程序时候碰上了一个问题,当发布新版本小程序后,需要用户能赶紧用上最新的,避免出问题.查了一下官方文档,总结出几个情况如下: 微信运行时, ...

  5. Spire.Cloud 私有化部署教程(三) - Windows 系统

    本教程主要介绍如何在 Windows 系统上实现 Spire.Cloud 私有化部署. 详细步骤如下: 一.安装依赖 我们的私有部署的依赖有 Nodejs.MySQL.Redis 和 RabbitMQ ...

  6. 【多服务场景化解决方案】智能家居(UrbanHome)

    ​ 介绍 UrbanHome是一款提供房屋维修服务的移动应用.如有维修需求,用户可通过该应用联系所在城市的管道工,电工,保洁,漆匠,木匠,修理工等,或是搜寻导航附近的维修商店. 通过构建UrbanHo ...

  7. KingbaseES V8R6集群维护案例之--修改securecmdd工具服务端口

    案例说明: 在一些生产环境,为了系统安全,不支持ssh互信,或限制root用户使用ssh登录,KingbaseES V8R6可以使用securecmdd工具支持主机之间的通讯.securecmdd工具 ...

  8. git 密码修改

    当由于修改了Git 的密码导致 pull 等操作报错时,比如报以下错误: fatal: Authentication failed for 'http://xxxxxxxxxxxxxxxxxx.git ...

  9. 华南理工大学 Python第5章课后小测-1

    1.(单选)以下哪个函数的定义是错误的?(本题分数:2)A) def vfunc(a,b=2):B) def vfunc(a,b):C) def vfunc(a,*b):D) def vfunc(*a ...

  10. JS作用域、变量提升和闭包

    作用域 作用域可以理解为JS引擎执行代码的时候,查找变量的规则. 从确定变量访问范围的阶段的角度,可以分为2类,词法作用域和动态作用域.js是词法作用域. 从变量查找的范围的角度,可以分为3类,全局作 ...