[题目链接] https://www.luogu.org/problemnew/show/P1110

有以下三种操作:

INSERT i k:在原数列的第i个元素后面添加一个新元素k;如果原数列的第i个元素已经添加了若干元素,则添加在这些元素的最后

MIN_GAP:查询相邻两个元素的之间差值(绝对值)的最小值

MIN_SORT_GAP:查询所有元素中最接近的两个元素的差值(绝对值)

用两个multiset full,delta;记录很多个块.

维护相邻数的差时直接更新,维护全集的差时找到前驱和后继.

注意细节:stl里面的lower_bound,find返回的是一个址,erase删除的也是一个址

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. const int INF=1e9+7;
  5. inline LL read(){
  6. register LL x=0,f=1;register char c=getchar();
  7. while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
  8. while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
  9. return f*x;
  10. }
  11. const int MAXN=500005;
  12. int st[MAXN],ed[MAXN];
  13. int n,m,fullmin=INF;
  14. multiset <int> full,delta;
  15. inline void update_full(int val){
  16. multiset<int>::iterator it=full.lower_bound(val);
  17. int t=*it-val;
  18. it--;
  19. t=min(t,val-*it);
  20. fullmin=min(fullmin,t);
  21. full.insert(val);
  22. }
  23. inline void insert(int pos,int val){
  24. delta.insert(abs(val-ed[pos]));
  25. if(pos!=n){
  26. delta.erase(delta.find(abs(st[pos+1]-ed[pos])));//记得加上绝对值
  27. delta.insert(abs(st[pos+1]-val));
  28. }
  29. ed[pos]=val;
  30. }
  31. int main(){
  32. n=read(),m=read();
  33. full.insert(INF);//平衡树基础操作
  34. full.insert(-INF);
  35. for(int i=1;i<=n;i++){
  36. st[i]=ed[i]=read();
  37. update_full(st[i]);
  38. }
  39. for(int i=1;i<n;i++)
  40. delta.insert(abs(st[i+1]-ed[i]));
  41. for(int i=1;i<=m;i++){
  42. static char s[10];
  43. scanf("%s",s);
  44. if(*s=='I'){
  45. int x=read(),y=read();
  46. update_full(y);
  47. insert(x,y);
  48. }
  49. else if(s[4]=='G') printf("%d\n",*delta.begin());
  50. else printf("%d\n",fullmin);
  51. }
  52. return 0;
  53. }

P1110 [ZJOI2007]报表统计 (multiset)的更多相关文章

  1. Luogu P1110 [ZJOI2007]报表统计 multiset

    沿用了学长的$multiset$ 然后这道题可以看到我的程序中有两行注释,它在我看来和他们下面的代码没区别,但是我们发现,C++会先调用后面的参数,所以$--it$会被先执行 ... ... ... ...

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

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

  3. 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)

    传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...

  4. BZOJ 1058: [ZJOI2007]报表统计 multiset + 卡常

    Code: #include<bits/stdc++.h> #define maxn 600000 #define inf 1000000000 using namespace std; ...

  5. P1110 [ZJOI2007]报表统计

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

  6. 洛谷.1110.[ZJOI2007]报表统计(Multiset Heap)

    题目链接 主要思路 /* 对于询问1,用堆代替multiset/Splay 对于询问2,multiset 1.注意哨兵元素 2.注意multiset中删除时是删除某元素的一个位置,而不是这个元素!这个 ...

  7. 洛谷.1110.[ZJOI2007]报表统计(Multiset)

    题目链接 主要思路 /* 其实只需要multiset即可 对于询问1,删除.插入差值,输出最小元素 对于询问2,插入后用前驱后继更新 1.注意哨兵元素 2.注意multiset中删除时是删除某元素的一 ...

  8. bzoj1058: [ZJOI2007]报表统计

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

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

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

随机推荐

  1. Shell杀tomcat进程

    一.killandclean.sh #!/bin/bash pid=($(ps -ef | grep tomcat | egrep -v grep | awk '{print $2}')) lengt ...

  2. TCP/IP 笔记 1.2 链 路 层

    都是包含三种类型.根据类型字段的值来进行区分 2.4 SLIP:串行线路IPS L I P的全称是Serial Line IP.它是一种在串行线路上对 I P数据报进行封装的简单形式,在RFC 105 ...

  3. 在用mvn编译java文件时遇到问题

    问题一:找不到加载主类 为什么会出现这类加载失败的问题那??? 一看这个问题就是环境变量配置有问题,找到问题解决就ok了!!! 问题二:无法用mvn编译java文件 这个问题是由于pom.xml文件出 ...

  4. js中FOR循环的陷阱

    //闭包解决 循环输出的问题 for(var i=0;i<rows.length;i++) {( function (i) { })(i);

  5. elasticsearch2.x ik插件

    先来一个标准分词(standard),配置如下: curl -XPUT localhost:/local -d '{ "settings" : { "analysis&q ...

  6. Codeforces 56D Changing a String (DP)

    题意:你可以对字符串s进行3种操作: 1,在pos位置插入字符ch. 2,删除pos位置的字符. 3,替换pos位置的字符为ch. 问最少需要多少次操作可以把字符s变成字符s1? 思路: 设dp[i] ...

  7. Etyma01 ced ceed cess

    一. etyma ['ɛtə,mə] ced.ceed.cess -> go -> 行走,前进 二.for instance 1. precede=pre+ced+e pre- 在前 2. ...

  8. Angular07 利用angular打造管理系统页面

    1 创建一个新的angular应用 ng new adminSystem 2 利用WebStorm打开adminSystem应用 3 借助AdminLTE这个开源项目来辅助开发 AdminLTE项目: ...

  9. MySql 5.7中添加用户,新建数据库,用户授权,删除用户,修改密码

    转自http://blog.csdn.net/w690333243/article/details/76576952 1.新建用户 创建test用户,密码是1234. MySQL -u root -p ...

  10. 【摘自张宴的"实战:Nginx"】使用nginx的proxy_cache模块替代squid,缓存静态文件

    #user nobody;worker_processes 1; error_log logs/static_source.error.log;#error_log logs/error.log no ...