链接: http://acm.hdu.edu.cn/showproblem.php?pid=3727

题意:

对一段序列进行四种操作:

Insert x :在序列尾部插入一个x;

Query_1 s t k : 求区间[s,t]中第k小的数

Query_2 x: 求x在序列中的排名

Query_3 k:求序列中第k小的数

思路;

第2,4个操作明显就是很裸的主席树求第k小。第3个操作我们可以单独用个树状数组维护,第一个操作因为会对序列造成影响,我们可以对所有操作进行离线处理,

分析完后可以发现这应该是一道比较简单的题。

主席树写搓了。。找了半天的错。。自闭

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define mid int m = (l + r) >> 1
  5. #pragma comment(linker, "/STACK:102400000,102400000")
  6. const int M = 2e5 + ;
  7. int c[M],ls[M*],rs[M*],sum[M*],a[M],root[M],num;
  8. ll ans1,ans2,ans3;
  9. int n,len,cnt,idx;
  10. void add(int x){
  11. while(x <= len){
  12. c[x] += ;
  13. x += (x&-x);
  14. }
  15. }
  16.  
  17. int getsum(int x){
  18. int ans = ;
  19. while(x){
  20. ans += c[x];
  21. x -= (x&-x);
  22. }
  23. return ans;
  24. }
  25.  
  26. void update(int &now,int l,int r,int p){
  27. int old = now; now = ++idx;
  28. ls[now] = ls[old]; rs[now] = rs[old];
  29. sum[now] = sum[old] + ;
  30. if(l == r) return ;
  31. mid;
  32. if(p <= m) update(ls[now],l,m,p);
  33. else update(rs[now],m+,r,p);
  34. }
  35.  
  36. int query_1(int old,int now,int l,int r,int k){
  37. if(l == r)
  38. return l;
  39. mid;
  40. int ret = sum[ls[now]] - sum[ls[old]];
  41. //cout<<sum[ls[now]]<<" "<<sum[ls[old]]<<endl;
  42. if(ret >= k)
  43. return query_1(ls[old],ls[now],l,m,k);
  44. else
  45. return query_1(rs[old],rs[now],m+,r,k-ret);
  46. }
  47.  
  48. int query_3(int &now,int l,int r,int k){
  49. if(l == r) return l;
  50. mid;
  51. int ret = sum[ls[now]];
  52. if(ret >= k) return query_3(ls[now],l,m,k);
  53. else return query_3(rs[now],m+,r,k - ret);
  54. }
  55.  
  56. int find(int x){
  57. return lower_bound(a+,a++len,x) - a;
  58. }
  59.  
  60. void init(){
  61. cnt = ; idx = ; len = ,num = ;
  62. ans1 = ; ans2 = ;ans3 = ;
  63. memset(c,,sizeof(c));
  64. memset(ls,,sizeof(ls));
  65. memset(rs,,sizeof(rs));
  66. memset(sum,,sizeof(sum));
  67. memset(root,,sizeof(root));
  68. }
  69.  
  70. struct node{
  71. int x,s,t,k;
  72. }q[M];
  73. char op[M][];
  74. int main()
  75. {
  76. int cas = ;
  77. while(scanf("%d",&n)!=EOF){
  78. init();
  79. for(int i = ;i <= n;i ++){
  80. scanf("%s",op[i]);
  81. if(op[i][] == 'I'){
  82. scanf("%d",&q[i].x);
  83. a[++cnt] = q[i].x;
  84. }
  85. else{
  86. if(op[i][] == '')
  87. scanf("%d%d%d",&q[i].s,&q[i].t,&q[i].k);
  88. else if(op[i][] == '')
  89. scanf("%d",&q[i].x),a[++cnt] = q[i].x;
  90. else if(op[i][] == '')
  91. scanf("%d",&q[i].k);
  92. }
  93. }
  94. sort(a+,a++cnt);
  95. len = unique(a+,a++cnt) - a-;
  96. for(int i = ;i <= n;i ++){
  97. if(op[i][] == 'I'){
  98. int fx = find(q[i].x);
  99. root[num] = root[num-];
  100. update(root[num],,len,fx);
  101. num++;
  102. add(fx);
  103. }
  104. else{
  105. if(op[i][] == '')
  106. ans1 += a[query_1(root[q[i].s-],root[q[i].t],,len,q[i].k)];
  107. else if(op[i][] == ''){
  108. int fx = find(q[i].x);
  109. ans2 += getsum(fx-) + ;
  110. }
  111. else if(op[i][] == '')
  112. ans3 += a[query_3(root[num-],,len,q[i].k)];
  113. //cout<<ans1<<" "<<ans2<<" "<<ans3<<" "<<endl;
  114. }
  115. }
  116. printf("Case %d:\n",cas++);
  117. printf("%lld\n%lld\n%lld\n",ans1,ans2,ans3);
  118. }
  119. return ;
  120. }
  121. /*
  122. 3 0
  123. 1 0
  124. 3 1
  125. 2 1
  126. */

hdu 3727 Jewel (可持久化线段树+bit)的更多相关文章

  1. HDU 3727 Jewel 可持久化线段树

    Jewel Problem Description   Jimmy wants to make a special necklace for his girlfriend. He bought man ...

  2. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU 5820 (可持久化线段树)

    Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...

  5. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...

  6. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  7. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. HDU 4866 Shooting(持久化线段树)

    view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...

  9. HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和

    To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

随机推荐

  1. 使用jquery-combobox实现select下拉框多选之后,如何将下拉框的值传给input隐藏域

    我在之前的一篇博文中eaeyui-combobox实现组合查询(即实现多个值得搜索)地址:http://www.cnblogs.com/dushan/p/4778897.html 实现了select下 ...

  2. Hive 数据的导入导出

    数据的导入: 通过文件导入,使用load命令 一.导入本地文件: load data local inpath '/home/hadoop/files/emp.txt' overwrite into ...

  3. .Net Core 系列之一 hello world

    OS: win10 企业版 中文环境 .Net Core: 切记不要装64版本,否则可能会出现vs2017无法生成.net core 2.0的项目 dotnet-sdk-2.0.0-win-x86.e ...

  4. C# 泛型分组和Linq分组的异同

    没什么好说的,因为用的到,所以作个记录, 代码如下: using System; using System.Collections.Generic; using System.Linq; using ...

  5. J-query extend()方法

    1.如果没有冲突参数会弥在后面. 2.参数如果和前面的参数存在相同的名称,那么后面的会覆盖前面的参数值.

  6. 针对负载均衡集群中的session解决方案的总结

    在日常运维工作中,当给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP.Python.Ruby还是Java语言环境,只要使用服务器保存Session,在做负 ...

  7. Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

    Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...

  8. require.ensure的用法;异步加载-代码分割;

    webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...

  9. vue-cli中的check-versions.js配置文件包括semver,chalk,shell插件的解释

    本文介绍vue-cli脚手架build目录中check-versions.js的配置 本文件是用来检测node和npm版本的 直接上代码加注释 // 下面的插件是chalk插件,他的作用是在控制台中输 ...

  10. .apply()用法和call()的区别

    Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里 ...