KPI

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1160    Accepted Submission(s): 488

Problem Description
你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度。数十亿的请求被推到一个大管道后同时服务从管头拉取请求。让我们来定义每个请求都有一个重要值。我的KPI是由当前管道内请求的重要值的中间值来计算。现在给你服务记录,有时我想知道当前管道内请求的重要值得中间值。
 
Input
有大约100组数据。

每组数据第一行有一个n(1≤n≤10000)

,代表服务记录数。

接下来有n行,每一行有3种形式
  "in x": 代表重要值为x(0≤x≤109)

的请求被推进管道。
  "out": 代表服务拉取了管道头部的请求。
  "query: 代表我想知道当前管道内请求重要值的中间值. 那就是说,如果当前管道内有m条请求, 我想知道,升序排序后第floor(m/2)+1th

条请求的重要值.

为了让题目简单,所有的x都不同,并且如果管道内没有值,就不会有"out"和"query"操作。

 
Output
对于每组数据,先输出一行

Case #i:
然后每一次"query",输出当前管道内重要值的中间值。

 
Sample Input
6
in 874
query
out
in 24622
in 12194
query
 
Sample Output
Case #1:
874
24622
 
Source
题意: 三种操作 ”in  x“ 将x 加入到队列
                      ”out“ 删除队头元素
                      ”query“ 队列中现有元素升序排列后 输出第 ( len/2+1) 大元素
题解:1.将所有元素离散化处理 这里的方法比较麻烦 具体看代码有多次映射
         2.根据操作  将离散化后的元素加入 树状数组 in~add(x,1),out~add(x,-1);
         3.树状数组求第k大 
         f[n] 树状数组
         f[1]=a1
         f[2]=a1+a2
         f[3]=a3
 
  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<map>
  5. #include<algorithm>
  6. #include<stack>
  7. #include<queue>
  8. using namespace std;
  9. struct node
  10. {
  11. int x;
  12. int y;
  13. } s[];
  14. int t;
  15. int jishu=;
  16. char a[][];
  17. int b[];
  18. int exm;
  19. int f[];
  20. int coun=;
  21. map<int,int> mp;
  22. map<int,int> mpp;
  23. queue<int> st;
  24. int n;
  25. bool cmp(struct node aa,struct node bb )
  26. {
  27. return aa.x<bb.x;
  28. }
  29. void add(int x,int y,int n)
  30. {
  31. for (;x<=n;x+=x&(-x)) f[x]+=y;
  32. }
  33. int sum(int x)
  34. {
  35. int ret=;
  36. for (;x;x-=x&(-x)) ret+=f[x];
  37. return ret;
  38. }
  39. int find_k(int k) //求第k大 板子
  40. {
  41. int i,w=;
  42. for (i=;i>=;i--)
  43. if (w+(<<i)<=n&&f[w+(<<i)]<k)
  44. {
  45. k-=f[w+(<<i)];w+=<<i;
  46. }
  47. return w+;
  48. }
  49. int k_num(int k){
  50. int w=,cnt=;
  51. for(int i=;i>=;i--)
  52. {
  53.  
  54. w+=(<<i);
  55. if(w>n || k<=f[w])
  56. w-=(<<i);
  57. else
  58. {
  59. k-=f[w];
  60. }
  61. }
  62. return w+;
  63. }
  64. int main()
  65. {
  66. while(scanf("%d",&t)!=EOF)
  67. { jishu++;
  68. memset(s,,sizeof(s));
  69. memset(a,,sizeof(a));
  70. memset(b,,sizeof(b));
  71. memset(f,,sizeof(f));
  72. mp.clear();
  73. mpp.clear();
  74. while(st.size()>)
  75. st.pop();
  76. coun=;
  77. for(int i=;i<=t;i++)
  78. {
  79. scanf("%s",&a[i]);
  80. if(a[i][]=='i')
  81. {
  82. scanf("%d",&exm);
  83. s[++coun].x=exm;//存插入的元素
  84. s[coun].y=coun;//struct 存储对应位置
  85. }
  86. }
  87. cout<<"Case #"<<jishu<<":"<<endl;
  88. sort(s+,s++coun,cmp);//结构体排序 x为主键升序排列
  89. b[s[].y]=;
  90. int k=;
  91. mp[s[].x]=;
  92. mpp[]=s[].x;
  93. for(int i=;i<=coun;i++)//for循环完成离散化处理
  94. {
  95. if(s[i].x==s[i-].x)
  96. {
  97. b[s[i].y]=k;
  98. mp[s[i].x]=k;// 与元素的相互映射
  99. mpp[k]=s[i].x;//
  100. }
  101. else
  102. {
  103. b[s[i].y]=++k;
  104. mp[s[i].x]=k;
  105. mpp[k]=s[i].x;
  106. }
  107. }
  108. n=k;
  109. k=;
  110. for(int i=;i<=t;i++)
  111. {
  112. if(a[i][]=='i')
  113. {
  114. st.push(mpp[b[++k]]);
  115. add(b[k],,n);
  116. }
  117. if(a[i][]=='o')
  118. {
  119. int now=st.front();
  120. st.pop();
  121. add(mp[now],-,n);
  122. }
  123. if(a[i][]=='q')
  124. {
  125. int len=st.size();
  126. int location=k_num((len/)+);
  127. printf("%d\n",mpp[location]);
  128.  
  129. }
  130. }
  131. }
  132. return ;
  133. }
  134. /*
  135. 10
  136. in 3
  137. in 1
  138. out
  139. in 4
  140. query
  141. in 2
  142. out
  143. in 100
  144. in 1
  145. query
  146. */
 
 

HDU 5249 离线树状数组求第k大+离散化的更多相关文章

  1. poj 2985 The k-th Largest Group 树状数组求第K大

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted ...

  2. POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted ...

  3. 树状数组求第K大(From CLJ)

    ; <<log2[n];p;p>>=) if(a[ret+p]<=kth) kth-=a[ret+=p]; return ret;

  4. hdu 4217 Data Structure? 树状数组求第K小

    Data Structure? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. 树状数组求第k小的元素

    int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...

  6. 区间的关系的计数 HDU 4638 离线+树状数组

    题目大意:给你n个人,每个人都有一个id,有m个询问,每次询问一个区间[l,r],问该区间内部有多少的id是连续的(单独的也算是一个) 思路:做了那么多离线+树状数组的题目,感觉这种东西就是一个模板了 ...

  7. HDU - 4777 离线树状数组

    离线树状数组搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...

  8. HDU 4417 离线+树状数组

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

  9. UVA11525 Permutation[康托展开 树状数组求第k小值]

    UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...

随机推荐

  1. Microbit MicroPython 介绍

    Python 是全世界最受欢迎的程序语言之一(world’s most popular ) .如果不特别说明,你可能每天在使用Python 写成的软件而不知道.像许多著名的公司跟组织如 Google, ...

  2. 完整的正则表达式知识汇总(Python知识不断更新)

    ## 大纲: ## 一.正则概述 1.正则是什么 正则就是一套规则,或者语法 2.正则的作用 让我们判断是否符合我们的的规则,或者根据规则找到符合规则的数据 3.使用场景 可以用正则判断我们输入的邮箱 ...

  3. Spark mlib的本地向量

    Spark mlib的本地向量有两种: DenseVctor :稠密向量 其创建方式 Vector.dense(数据) SparseVector :稀疏向量 其创建方式有两种: 方法一:Vector. ...

  4. centos配置iptables

    第一次配置前消除默认的规则 #这个一定要先做,不然清空后可能会悲剧 iptables -P INPUT ACCEPT #清空默认所有规则 iptables -F #清空自定义的所有规则 iptable ...

  5. 基于spec评论“欢迎来怼”团队Alpha版作品

    “欢迎来怼”团队的作品是手机版博客园 1.获取此博客园app的方式——二维码 通过扫描二维码的方式下载app,这是当今比较流行的方式,适合广大手机的使用者——青少年的使用习惯. 2.点击图标,进入该a ...

  6. 百度编辑器ueditor的图片地址修正

    我用的百度编辑器为1.4.2的,相对于现在这个时间来说是比较新的.之前去的1.3版的,后来更新到1.4之后出现路径问题.因为今天晚上出现特别奇怪的问题,所以特地又整了一遍,发现这玩意还是得自己弄通了好 ...

  7. ChromeSwitchySharp代理设置步骤

    步骤: 1.新增情景模式配置如下:   2.设置切换规则   3.先“直接连接”进行登录:然后切换到“自动切换模式”访问对应url

  8. ubuntu apache nginx 启动 关闭

    转载自:http://www.comflag.com/2011/05/01/apache-web.htm 电影<社交网络>中,facebook创始人马克.扎克失恋后入侵哈佛大学宿舍楼服务器 ...

  9. error : Web 项目“RealEstate.Web”的 URL“http://localhost:20000”已配置为将 IIS 用作 Web 服务器,但是当前在 IIS Express W

    error  : Web 项目"RealEstate.Web"的 URL"http://localhost:20000"已配置为将 IIS 用作 Web 服务器 ...

  10. 【Linux】- vi/vim

    所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...