题目链接

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

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

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

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

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

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<vector>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<cmath>
  9. #include<stack>
  10. #include<map>
  11. #include<cassert>
  12. #define P puts("lala")
  13. #define cp cerr<<"lala"<<endl
  14. #define ln putchar('\n')
  15. #define sp putchar(' ')
  16. #define pb push_back
  17. #define pf push_front
  18. #define fi first
  19. #define se second
  20. #define mkp make_pair
  21. using namespace std;
  22. typedef pair<int,int> pii;
  23. inline void read(int &re)
  24. {
  25. char ch=getchar();int g=1;
  26. while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
  27. re=0;
  28. while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
  29. re*=g;
  30. }
  31. typedef long long ll;
  32. inline void read(ll &re)
  33. {
  34. char ch=getchar();ll g=1;
  35. while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
  36. re=0;
  37. while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+ch-48ll,ch=getchar();
  38. re*=g;
  39. }
  40.  
  41. const int N=500050;
  42. const int inf=0x3f3f3f3f;
  43. map<int,int>mp;
  44. map<int,int>::iterator it,it1;
  45.  
  46. int dv[N],n,m;
  47. inline void add(int x,int k)
  48. {
  49. for(;x<=n;x+=(x&-x)) dv[x]+=k;
  50. }
  51. inline int ask(int x)
  52. {
  53. int sum=0;
  54. for(;x>0;x-=(x&-x)) sum+=dv[x];
  55. return sum;
  56. }
  57.  
  58. int key[N<<1],mind[N<<1],ch[N<<1][2],fa[N<<1],pre[N<<1],nex[N<<1];
  59. int a[N],sz,root,siz[N<<1];
  60.  
  61. inline void up(int o)
  62. {
  63. mind[o]=min(mind[ch[o][0]],mind[ch[o][1]]);
  64. pre[o]=key[o];nex[o]=key[o];
  65. siz[o]=1;
  66. if(ch[o][0])
  67. {
  68. mind[o]=min(mind[o],abs(key[o]-nex[ch[o][0]]));
  69. pre[o]=pre[ch[o][0]];
  70. siz[o]+=siz[ch[o][0]];
  71. }
  72. if(ch[o][1])
  73. {
  74. mind[o]=min(mind[o],abs(key[o]-pre[ch[o][1]]));
  75. nex[o]=nex[ch[o][1]];
  76. siz[o]+=siz[ch[o][1]];
  77. }
  78. }
  79.  
  80. void build(int &o,int l,int r)
  81. {
  82. if(l>r) return ;
  83. o=++sz;
  84. int mid=l+r>>1;
  85. key[o]=a[mid];
  86. siz[o]=1;
  87. pre[o]=a[mid];nex[o]=a[mid];
  88. mind[o]=inf;
  89. if(l==r) return ;
  90. build(ch[o][0],l,mid-1);build(ch[o][1],mid+1,r);
  91. fa[ch[o][0]]=o;fa[ch[o][1]]=o;
  92. up(o);
  93. }
  94.  
  95. inline bool ge(int x){return ch[fa[x]][1]==x;}
  96. inline void rotate(int x)
  97. {
  98. int f=fa[x],g=fa[f],wh=ge(x);
  99. ch[f][wh]=ch[x][wh^1];fa[ch[f][wh]]=f;
  100. ch[x][wh^1]=f;fa[f]=x;
  101. fa[x]=g;
  102. if(g) ch[g][ch[g][1]==f]=x;
  103. up(f);up(x);
  104. }
  105. void splay(int x)
  106. {
  107. for(int f;f=fa[x];rotate(x)) if(fa[f]) rotate(ge(x)==ge(f)?f:x);
  108. root=x;
  109. }
  110. int find(int k)
  111. {
  112. //assert(k<=siz[root]);
  113. //assert(k>=1);
  114. int x=root;
  115. while(1)
  116. {
  117. if(k<=siz[ch[x][0]]) x=ch[x][0];
  118. else
  119. {
  120. k-=siz[ch[x][0]];
  121. if(k<=1) return x;
  122. k--;
  123. x=ch[x][1];
  124. }
  125. }
  126. }
  127.  
  128. void inspre(int k)
  129. {
  130. int x=ch[root][0];
  131. while(ch[x][1]) x=ch[x][1];
  132. ch[x][1]=++sz;siz[sz]=1;
  133. pre[sz]=k;key[sz]=k;nex[sz]=k;
  134. fa[sz]=x;mind[sz]=inf;
  135. up(x);
  136. splay(sz);
  137. }
  138.  
  139. char in[50];
  140. int main()
  141. {
  142. #ifndef ONLINE_JUDGE
  143. freopen("1.in","r",stdin);freopen("1.out","w",stdout);
  144. #endif
  145. int i,j,opt,T;
  146. mind[0]=inf;
  147. read(n);read(m);
  148. for(i=1;i<=n;++i) add(i,1);
  149. for(i=1;i<=n;++i) read(a[i]),mp[a[i]]++;
  150. build(root,1,n);
  151. int minn=inf;
  152. for(it=mp.begin();it!=mp.end();++it)
  153. {
  154. it1=it;
  155. it1++;
  156. if(it1!=mp.end()) minn=min(minn,abs( (it->fi)-(it1->fi) ));
  157. if((it->second)>1) minn=0;
  158. }
  159. siz[0]=0;
  160. for(int cas=1;cas<=m;++cas)
  161. {
  162. scanf("%s",in);
  163. if(in[0]=='I')
  164. {
  165. int x,k;read(x);read(k);
  166. //cerr<<cas<<endl;
  167. if(x+1>n)
  168. {
  169. int rt=find(siz[root]);
  170. splay(rt);
  171. root=++sz;
  172. ch[sz][0]=rt;
  173. fa[rt]=sz;
  174. key[sz]=k;mind[sz]=inf;
  175. up(sz);
  176. }
  177. else
  178. {
  179. int rt=find(ask(x+1));
  180. splay(rt);
  181. //cout<<siz[root]<<endl;
  182. inspre(k);
  183. }
  184. mp[k]++;
  185. it=mp.find(k);
  186. if((it->se)>1) minn=0;
  187. else
  188. {
  189. it1=it;
  190. if(it1!=mp.begin())
  191. {
  192. it1--;
  193. minn=min(minn,abs((it1->fi)-k));
  194. }
  195. it++;
  196. if(it!=mp.end()) minn=min(minn,abs((it->fi)-k));
  197. }
  198. add(x+1,1);
  199. }
  200. else if(in[4]=='G') printf("%d\n",mind[root]);
  201. else if(in[4]=='S') printf("%d\n",minn);
  202. }
  203. return 0;
  204. }
  205. /*
  206.  
  207. */

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. RestTemplate上传文件

    1.上传的文件是File类型 如果文件保存在本地,即可以通过File file = new File(path) 或者 文件路径地址获取到指定文件 public String uploadFile(F ...

  2. 面试突击74:properties和yml有什么区别?

    properties 和 yml 都是 Spring Boot 支持的两种配置文件,它们可以看作是 Spring Boot 在不同时期的两款"产品".在 Spring Boot 时 ...

  3. Webstorm设置背景图为Windows桌面背景

    桌面背景图会缓存在这个目录中,文件名不确定在改变桌面背景后会不会变. C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Themes\CachedFiles ...

  4. 十周周末总结 MySQL的介绍与使用

    python 十周周末总结 MySQL的介绍与使用 MySQL字符编码与配置文件 查看数据库的基本信息(用户,字符编码) /s windos下MySQL默认的配置文件 my_default.ini 修 ...

  5. String vs StringBuffer vs StringBuilder

    String vs StringBuffer vs StringBuilder 本文翻译自:https://www.digitalocean.com/community/tutorials/strin ...

  6. 【IDEA】IDEA打开欢迎页面

    概述 IDEA在默认情况下,会进入最后一个项目.如果项目比较大的话会加载的比较久,这个就比较烦人了,目前我觉得最好的办法就是在设置中直接进入欢迎页面. 解决方案 ① 进入设置 ② Appearance ...

  7. KingbbaseES V8R6集群维护案例之---集群之间数据迁移

    案例说明: 生产环境是集群环境,测试环境是集群,现需要将生产环境的数据迁移到测试集群中运行,本文档详细介绍了从集群环境迁移数据的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingbase ...

  8. 如何自动清理 KingbaseES SYS_LOG

    KingbaseES 初始化完成后,默认不会对 sys_log进行清理.如果需要对sys_log进行自动清理,需要设置相关参数. 与日志自动清理有关的参数(默认值)如下: log_filename | ...

  9. Java 9.回文数

    给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false .回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数.    例如,121 是回文,而 123 不是. ...

  10. 聊聊两个Go即将过时的GC优化策略

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 这篇文章本来是要讲 Go Memory Ballast 以及 Go GC Tuner 来 ...