问题 C: 勤快的love 枫

时间限制: 1 Sec  内存限制: 128 MB

题目描述

小绝恋love 枫是一个出纳,经常需要做一些统计报表的工作。今天是绝恋love 枫的生日,小绝恋love 枫希望可以帮爸爸分担一些工作,作为他的生日礼物之一。经过仔细观察,小绝恋love 枫发现统计一张报表实际上是维护一个非负整数数列,并且进行一些查询操作。在最开始的时候,有一个长度为的整数序列,并且有以下三种操作:INSERT i k 在原数列的第个元素后面添加一个新元素k;如果原数列的第个元素已经添加了若干元素,则添加在这些元素的最后(见下面的例子)

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。于是小绝恋love 枫写了一个程序,使得程序可以自动完成这些操作,但是他发现对于一些大的报表他的程序运行得很慢,你能帮助他改进程序么?

输入

第一行包含两个整数N,M,分别表示原数列的长度以及操作的次数。

第二行为个整数,为初始序列。

接下来的行每行一个操作,即“INSERT i k”,“MIN_GAP”,“MIN_SORT_GAP”中的一种(无

多余空格或者空行)。

输出

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

样例输入

3 55 3 1INSERT 2 9MIN_SORT_GAPINSERT 2 6MIN_GAPMIN_SORT_GAP

样例输出

221

提示

对于30% 的数据,N≤1000,M≤5000

对于100% 的数据,N,M≤50000

对于所有的数据,序列内的整数不超过5*108。

第一问,按插入顺序求最小差,考虑用线段树(开1~n+m),记录一下当前块最后一个差值在线段树中的下标,之后每在这个块插入一个值,就把原来下表所在处的差值(即为原最后一个值与下一个块首值)改成新的,而与下一个块块首的新差值即把计数器加加,插入新下标即可。

第二问,明显用平衡树,set+指针强行乱搞即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<set>
#define inf 100000000
#include<cmath>
using namespace std;
multiset<int> st;
int n,m,fri[50005],last[50005],id[100005],cnt,min1=inf;
struct tree
{int h,l,r;
} a[400005];
inline int read()
{int sum=0,f=1;char x=getchar();while(x<'0'||x>'9'){if(x=='-')f=-1;x=getchar();}while(x>='0'&&x<='9'){sum=sum*10+x-'0';x=getchar();}return sum*f;
}
void build(int l,int r,int x)
{a[x].l=l;a[x].r=r;if(l==r){a[x].h=inf;return;}int mid=(l+r)/2;build(l,mid,x*2);build(mid+1,r,x*2+1);a[x].h=min(a[x*2].h,a[x*2+1].h);
}
void change(int h,int k,int x)
{if(a[x].l==a[x].r){a[x].h=k;return;}int mid=(a[x].l+a[x].r)/2;if(h<=mid)change(h,k,x*2);elsechange(h,k,x*2+1);a[x].h=min(a[x*2].h,a[x*2+1].h);
}
/*int Q(int l,int r,int x)
{if(a[x].l>=l&&a[x].r<=r)return a[x].h;int mid=(a[x].l+a[x].r)/2,s=inf;if(l<=mid)s=min(s,Q(l,r,x*2));if(r>mid)s=min(s,Q(l,r,x*2+1));return s;
}*/
int main()
{//freopen("love.in","r",stdin);//freopen("love.out","w",stdout);n=read();m=read();build(1,n+m+5,1);for(int i=1;i<=n;i++){fri[i]=last[i]=read();st.insert(fri[i]);}for(int i=1;i<n;i++){int tmp=abs(last[i+1]-fri[i]);id[i]=++cnt;change(id[i],tmp,1);}for(int i=1;i<=n;i++){int temp=inf,temp2=inf;multiset<int>::iterator it=st.find(fri[i]),it2=it;if(it!=st.begin()){it--;temp=abs((*it)-fri[i]);}if(it2!=st.end()){it2++;temp2=abs((*it2)-fri[i]);}temp=min(temp,temp2);min1=min(min1,temp);}char p[20];while(m--){scanf("%s",p);if(p[0]=='I'){int x=read(),y=read();st.insert(y);if(x!=n){int t1=abs(last[x]-y),t2=abs(y-fri[x+1]);change(id[x],t1,1);last[x]=y;id[x]=++cnt;change(id[x],t2,1);}else{int t1=abs(last[x]-y);last[x]=y;id[x]=++cnt;change(id[x],t1,1);}int temp=inf,temp2=inf;multiset<int>::iterator it=st.find(y),it2=it;if(it!=st.begin()){it--;temp=abs((*it)-y);}if(it2!=st.end()){it2++;temp2=abs((*it2)-y);}temp=min(temp,temp2);min1=min(min1,temp);}if(p[4]=='G')printf("%d\n",a[1].h);if(p[4]=='S')printf("%d\n",min1);}
}

转载于:https://www.cnblogs.com/QTY2001/p/7632757.html

线段树+平衡树(STL) 勤快的love 枫相关推荐

  1. CF 19D Points 【线段树+平衡树】

    在平面上进行三种操作: 1.add x y:在平面上添加一个点(x,y) 2.remove x y:将平面上的点(x,y)删除 3.find x y:在平面上寻找一个点,使这个点的横坐标大于x,纵坐标 ...

  2. P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    题目描述 如题,你需要维护这样的一个长度为 N  的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生成一个完全一 ...

  3. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...

  4. [NOIp2017 Day2 T3] 列队phalanx(线段树 / 平衡树)

    题目 描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×mn×mn \times m名学生,方 ...

  5. LGOJ P3919【模板】可持久化数组(可持久化线段树/平衡树)

    代码 //可持久化线段树 #include <cstdio> using namespace std;struct node {node *Lnode,*Rnode;int val;voi ...

  6. BZOJ1058 ZJOI2007 报表统计 线段树+平衡树

    题意:给定一个序列,维护:1.插入一个元素  2.求相邻两个元素中,差值绝对值的最小值  3.求序列排序后相邻两个元素中,差值绝对值的最小值 题解: MIN_GAP:如果我们把数看成一组一组,每次插入 ...

  7. P3919 【模板】可持久化数组(可持久化线段树/平衡树)(入门第一题)

    学习博客:http://www.cnblogs.com/flashhu/p/8297581.html 题目链接:https://www.luogu.org/problemnew/show/P3919 ...

  8. 【模板】可持久化数组(可持久化线段树/平衡树)

    题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集) 题目描述 如题,你需要维护这样的一个长度为 N N N ...

  9. 洛谷.3919.[模板]可持久化数组(可持久化线段树/平衡树)

    题目链接 //利用先前的根节点建树 想一下不难写. #include <cstdio> #include <cctype> //#define gc() getchar() # ...

  10. 洛谷P3919可持久化线段树

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目提供者HansBug 站长团 评测方式云端评测 标签O2优化高性能 难度提高+/省选- 时空限制3000ms / 512MB 有了可持久 ...

最新文章

  1. 订单管理之获取订单表表列表数据
  2. nagios不能 发送飞信报警一例
  3. elastic-job的原理简介和使用
  4. 4由通道检测_大唐阜新煤制天然气「榜样力量」实训做实出实效——废水总酚检测时间由4小时缩短至10分钟...
  5. jQuery实现图片延迟加载
  6. spring aop组件_安全性中的Spring AOP –通过方面控制UI组件的创建
  7. sqlmap中的php,python - sqlmap源码中的一个问题
  8. 项目日报模板_新建区重点易涝区能力建设项目2020年11月18日日报
  9. oracle日期函数2!
  10. fastjson jsonobject 转bean失败_挂面这么做,零失败,口感还是一顶一的棒
  11. 浅析“npm run dev”作用
  12. 算法系列之二十一:实验数据与曲线拟合
  13. 【此后无良辰】实验13 FAT12文件系统
  14. 第三课:创建BootRom引导镜像
  15. linux screen 环境变量,Linux 下 screen 使用方法
  16. 在工作空间中如何构造IPath或IFile
  17. c语言十六转十进制,C语言 · 十六进制转十进制
  18. STM8L052C6 低功耗+LCD显示 经验分享
  19. for each in 和 for in 和for of
  20. WM5,WM6注册表优化全集

热门文章

  1. 怎样用阿里云搭建个人博客
  2. 视频截取程序matlab,通过matlab截取视频
  3. android Launcher 自定义View 高仿hola一键清理效果
  4. 顶级计算机专家一年赚多少,成为一个计算机专家需要多高的IQ?请实话实说
  5. Unity方便查看日志的插件Reporter
  6. 新增网站组网方案与解释说明 模版
  7. 打怪升级之小白的大数据之旅(六十九)<Hive旅程第十站:Hive的优化>
  8. Internet Explorer 无法打开该 Internet 站点。请求的站点不可用
  9. 【netlimiter】的使用
  10. JavaScript数组方法总结