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
 
 #include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
struct node
{
int x;
int y;
} s[];
int t;
int jishu=;
char a[][];
int b[];
int exm;
int f[];
int coun=;
map<int,int> mp;
map<int,int> mpp;
queue<int> st;
int n;
bool cmp(struct node aa,struct node bb )
{
return aa.x<bb.x;
}
void add(int x,int y,int n)
{
for (;x<=n;x+=x&(-x)) f[x]+=y;
}
int sum(int x)
{
int ret=;
for (;x;x-=x&(-x)) ret+=f[x];
return ret;
}
int find_k(int k) //求第k大 板子
{
int i,w=;
for (i=;i>=;i--)
if (w+(<<i)<=n&&f[w+(<<i)]<k)
{
k-=f[w+(<<i)];w+=<<i;
}
return w+;
}
int k_num(int k){
int w=,cnt=;
for(int i=;i>=;i--)
{ w+=(<<i);
if(w>n || k<=f[w])
w-=(<<i);
else
{
k-=f[w];
}
}
return w+;
}
int main()
{
while(scanf("%d",&t)!=EOF)
{ jishu++;
memset(s,,sizeof(s));
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(f,,sizeof(f));
mp.clear();
mpp.clear();
while(st.size()>)
st.pop();
coun=;
for(int i=;i<=t;i++)
{
scanf("%s",&a[i]);
if(a[i][]=='i')
{
scanf("%d",&exm);
s[++coun].x=exm;//存插入的元素
s[coun].y=coun;//struct 存储对应位置
}
}
cout<<"Case #"<<jishu<<":"<<endl;
sort(s+,s++coun,cmp);//结构体排序 x为主键升序排列
b[s[].y]=;
int k=;
mp[s[].x]=;
mpp[]=s[].x;
for(int i=;i<=coun;i++)//for循环完成离散化处理
{
if(s[i].x==s[i-].x)
{
b[s[i].y]=k;
mp[s[i].x]=k;// 与元素的相互映射
mpp[k]=s[i].x;//
}
else
{
b[s[i].y]=++k;
mp[s[i].x]=k;
mpp[k]=s[i].x;
}
}
n=k;
k=;
for(int i=;i<=t;i++)
{
if(a[i][]=='i')
{
st.push(mpp[b[++k]]);
add(b[k],,n);
}
if(a[i][]=='o')
{
int now=st.front();
st.pop();
add(mp[now],-,n);
}
if(a[i][]=='q')
{
int len=st.size();
int location=k_num((len/)+);
printf("%d\n",mpp[location]); }
}
}
return ;
}
/*
10
in 3
in 1
out
in 4
query
in 2
out
in 100
in 1
query
*/
 
 

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. C 数数位 while循环

    #include <stdio.h> int main(int argc, char **argv) { //定义两个变量  x n 把n初始化 int x; int n=0; //输入x ...

  2. lintcode 二叉树前序遍历

    二叉树的前序遍历    给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,2,3]. / ...

  3. Java 消息对列

    ActiveMQ入门实例   1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5. ...

  4. 树(Tree,UVA 548)

    题目描述: 题目思路: 1.使用数组建树 //递归 2.理解后序遍历和中序遍历,建立左右子树 3.dfs深度搜索找出权重最小的路径 #include <iostream> #include ...

  5. Appium ——Android KEYCODE键值:

    Python下语法: driver.keyevent(键值) 电话按键: 键名 描述 键值 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME ...

  6. LeetCode - 442. Find All Duplicates in an Array - 几种不同思路 - (C++)

    题目 题目链接 Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ...

  7. windows远程连接失败问题排查思路

    一般情况下,对WIN7的远程连接只需要5步即可完成远程连接的设置: 1).用户是否设置了密码 2).计算机属性-允许远程登录 3).设置计算机永不睡眠 4).关闭防火墙或者设置入站规则 5).排查Re ...

  8. 关于ES6-{块级作用域 let const 解构赋值 数组 字符串 函数的扩展 箭头函数}

    关于ES6 块级作用域 任何一对花括号({})中的语句集都属于一个块,在块中声明的变量在代码块外都是不可访问的,称之为块级作用域,ES5以前没有块级作用域 let let 是ES6新增的声明变量的一种 ...

  9. 软件工程课堂作业(五)——终极版随机产生四则运算题目(C++)

    一.升级要求:让程序能接受用户输入答案,并判定对错.最后给出总共对/错的数量. 二.设计思想: 1.首先输入答案并判断对错.我想到的是定义两个数组,一个存放用户算的结果,另一个存放正确答案.每输出一道 ...

  10. Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...