Link:

BZOJ 1058 传送门

Solution:

为了这道题今天下午一直都在和常数大战……

1、对于询问1,我们记录每个数末位置的数$T[i]$和初始位置$S[i]$

用平衡树维护所有差值,对于操作$i,k$:删除$S[i+1]-T[i]$,增加$x-T[i]$和$x-S[i+1]$

2、对于询问2,用平衡树记录所有值,每次找到$k$的前驱和后继更新$mn$就好了

当然以上都可以不用手写平衡树,用$multiset$和$priority\_ queue$可水过

但我如此耿直的人还是用结构体写了两个$Splay$分别维护两个询问

下面总结下出的各种锅和常数优化细节吧:

1、补锅匠系列:

(1)范围要开到$2*n$,毕竟每次会新加进一个数

这时显示的居然是$TLE$不是$RE$?以后要注意……

(2)对于询问2在查找前驱后继时要包含与查找数相同的数

此时不是严格小于/大于啊……

2、卡常系列:

(1)基础的IO,$register$,$inline$

(2)进行任何操作后最好都$Splay$一遍来保证复杂度!

(3)如果$mn=0$时直接将后面的更新剪枝,好像对$Luogu$上的数据很有效……

(4)尽量少外界调用结构体内函数

卡常卡到最后还是只过了$Luogu$,$BZOJ$过不去啊……

但好像$BZOJ$数据加强了,黄学长的标程也T了……

最后发现别人用$Treap$写比我的快10倍?以后还是少写$Splay$吧

Code:

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;//注意MAXN要开到1e6
  4. const int MAXN=1e6+,INF=0x3f3f3f3f;
  5. char s[];int n,m,dat[MAXN],S[MAXN],T[MAXN],mn=INF;
  6.  
  7. inline int read()
  8. {
  9. char ch;int num,f=;
  10. while(!isdigit(ch=getchar())) f|=(ch=='-');
  11. num=ch-'';
  12. while(isdigit(ch=getchar())) num=num*+ch-'';
  13. return f?-num:num;
  14. }
  15. inline void write(int x)
  16. {
  17. if(x<) putchar('-'),x=-x;
  18. if(x>) write(x/);
  19. putchar(x%+'');
  20. }
  21.  
  22. struct splay
  23. {
  24. int rt,sz[MAXN],cnt[MAXN],val[MAXN],f[MAXN],ch[MAXN][],tot;
  25. inline void pushup(int x)
  26. {sz[x]=sz[ch[x][]]+sz[ch[x][]]+cnt[x];}
  27. inline void Rotate(int x)
  28. {
  29. int y=f[x],z=f[y],k=(ch[y][]==x);
  30. ch[z][ch[z][]==y]=x;f[x]=z;
  31. ch[y][k]=ch[x][k^];f[ch[x][k^]]=y;
  32. ch[x][k^]=y;f[y]=x;
  33. pushup(x);pushup(y);
  34. }
  35. inline void Splay(int x,int up)
  36. {
  37. while(f[x]!=up)
  38. {
  39. int y=f[x],z=f[y];
  40. if(z!=up) (ch[y][]==x)^(ch[z][]==y)?Rotate(x):Rotate(y);
  41. Rotate(x);
  42. }
  43. if(!up) rt=x;
  44. }
  45. inline void Insert(int x)
  46. {
  47. int k=rt,anc=;
  48. while(k&&x!=val[k])
  49. anc=k,k=ch[k][x>val[k]];
  50.  
  51. if(k) {cnt[k]++;Splay(k,);return;}
  52. k=++tot;
  53. if(anc) ch[anc][x>val[anc]]=k;
  54. ch[k][]=ch[k][]=;
  55. sz[k]=cnt[k]=;f[k]=anc;val[k]=x;
  56. Splay(k,);
  57. }
  58. inline void Find(int x)
  59. {
  60. int k=rt;
  61. while(ch[k][x>val[k]]&&x!=val[k])
  62. k=ch[k][x>val[k]];
  63. Splay(k,);
  64. }
  65. inline int Kth(int x)
  66. {
  67. int k=rt;
  68. while(true)
  69. {
  70. if(sz[ch[k][]]+cnt[k]<x)
  71. x-=sz[ch[k][]]+cnt[k],k=ch[k][];
  72. else if(sz[ch[k][]]>=x) k=ch[k][];
  73. else return k;
  74. }
  75. }
  76. inline int Next(int x,int flag)
  77. {
  78. Find(x);int k=rt;
  79. if((val[k]<x&&!flag)||(val[k]>x&&flag)) return k;
  80. k=ch[k][flag];
  81. while(ch[k][flag^]) k=ch[k][flag^];
  82. Splay(k,);return k;
  83. }
  84. inline int Next2(int x,int flag)
  85. {
  86. Find(x);int k=rt;
  87. if((val[k]<=x&&!flag)||(val[k]>=x&&flag)) return k;
  88. k=ch[k][flag];
  89. while(ch[k][flag^]) k=ch[k][flag^];
  90. Splay(k,);return k;
  91. }
  92. inline void Delete(int x)
  93. {
  94. int nxt=Next(x,),lst=Next(x,);
  95. Splay(lst,);Splay(nxt,lst);
  96. if(cnt[ch[nxt][]]>)
  97. cnt[ch[nxt][]]--,Splay(ch[nxt][],);
  98. else ch[nxt][]=;
  99. }
  100. inline void push(int x)
  101. {//调用结构体函数的次数越少越好,因此push放里面快
  102. if(!mn) return;
  103. int nxt=Next2(x,),lst=Next2(x,);
  104. mn=min(mn,min(abs(val[nxt]-x),abs(val[lst]-x)));
  105. Insert(x);
  106. }
  107. }all,adj;
  108.  
  109. int main()
  110. {
  111. n=read();m=read();
  112. all.Insert(INF);all.Insert(-INF);
  113. adj.Insert(INF);adj.Insert(-INF);
  114. for(register int i=;i<=n;i++)
  115. dat[i]=read(),all.push(dat[i]),S[i]=T[i]=dat[i];
  116. for(register int i=;i<=n;i++) adj.Insert(abs(dat[i]-dat[i-]));
  117.  
  118. while(m--)
  119. {
  120. int x,y;scanf("%s",s);
  121. if(s[]=='I')
  122. {
  123. x=read();y=read();
  124. if(x!=n) adj.Delete(abs(S[x+]-T[x]));
  125. adj.Insert(abs(y-T[x]));
  126. adj.Insert(abs(y-S[x+]));
  127. all.push(y);T[x]=y;
  128. }
  129. else if(s[]=='G') write(adj.val[adj.Kth()]),putchar('\n');
  130. else write(mn),putchar('\n');
  131. }
  132. return ;
  133. }

[BZOJ 1058] 报表统计的更多相关文章

  1. BZOJ 1058 报表统计 (STL)

    题解:数据结构的基本操作,用STL可以完美实现,就是比较慢…… #include <cstdio> #include <map> #include <set> #i ...

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

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

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

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

  4. [BZOJ 1058] [ZJOI2007] 报表统计 【平衡树】

    题目链接:BZOJ - 1058 题目分析 这道题看似是需要在序列中插入一些数字,但其实询问的内容只与相邻的元素有关. 那么我们只要对每个位置维护两个数 Ai, Bi, Ai 就是初始序列中 i 这个 ...

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

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

  6. bzoj1058: [ZJOI2007]报表统计

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

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

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

  8. 【BZOJ1058】【ZJOI2007】报表统计(链表,堆,Splay)

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

  9. BZOJ_1058_[ZJOI2007]报表统计_STL

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

随机推荐

  1. lua滚动文字效果

    基本的思想都是创建一个clippingNode,将要截取的节点添加到clippingNode中,节点加上action即可. 下面是左右滚动的代码,如果是上下滚动,更简单了,只需修改Y坐标即可,都不用动 ...

  2. sass_sass安装

    你会不会因为有些事遇到各种各样的问题而搁置,直到把这个事情被耽误了几天.最近一直在弄sass这个东西,安装的过程中各种问题.sass是一个基于ruby环境开发的,安装sass之前得先把ruby给安装了 ...

  3. 关于this问题

    对于关键字this,其实很好理解,谁调用我就指向谁.下面举个例子说明: 其实这也是在学习闭包中的一个案例: var name = "The window"; var obj = { ...

  4. OpenRCT2-ext

    https://github.com/RollingStar/RCT-Music-Patch https://github.com/seanfisk/rct2-game-objects https:/ ...

  5. Dubbo之旅--注册中心

    在介绍Dubbo的内部逻辑的时候提到很多次注册中心的概念.实现注册中心的有很多,主要是以下四个注册中心分别是: Multicast注册中心 Zookeeper注册中心 Redis注册中心 Simple ...

  6. Leetcode 之Balanced Binary Tree(49)

    用递归的方式来做,左右两棵子树的高度差不超过1.分成两部分,一部分递归得到树的高度,一部分递归检查左右子树是否是平衡二叉树. int getHeight(TreeNode *root) { ; ; } ...

  7. 23:django 信号(signal)

    django包含了一个“信号分配器”使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些 ...

  8. hdu 1664(数论+同余搜索+记录路径)

    Different Digits Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. hdu 2444(染色法判断二分图+最大匹配)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  10. vConsole ~ 移动开发调试工具

    在开发移动端项目时,有时候在PC端好好的,但是到了手机上出bug,很难调试,这时候可以用vConsole调试工具 使用方式 1.直接引入 <script src="vconsole.m ...