题目链接

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

思路

  • 权值线段树:更普通的线段树差不多将元素存在对应区间的位置上,例如5就存在父节点(l == r == 5)的节点上,这样就能查找区间第K大的元素。
  • 用两个set(内部递增排序)模拟,添加和删除操作之后都要保持左set的长度(m/2+1),这样方便询问的时候直接给出答案,而且不容易乱
// 权值线段树
#include <bits/stdc++.h>
#define LL  long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, n) for (int i = a; i <= n; ++i)
#define maxn 10006
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
using namespace std;map<int, int> m1;
map<int, int> m2;
int seg[maxn << 2];
int a[maxn];void pushup (int rt) {seg[rt] = seg[lc] + seg[rc];
}void insert (int rt, int l, int r, int x, int op) {if (l == r) {seg[rt] += op;return;}if (mid >= x) insert(lc, l, mid, x, op);else insert(rc, mid+1, r, x, op);pushup(rt);
}int query(int rt, int l, int r, int k) {if (l == r) return l;if (seg[lc] >= k) return query(lc, l, mid, k);else return query(rc, mid+1, r, k - seg[lc]);
}
int main() {#ifndef ONLINE_JUDGE// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);
#endifint n, d, Case = 1;char s[10];while (scanf("%d", &n) != EOF) {printf("Case #%d:\n", Case++);mem(seg, 0);priority_queue<int> que;queue<int> que2;m1.clear();m2.clear();for (int i = 0; i < n; ++i) {scanf("%s", s);switch (s[0]) {case 'i':scanf("%d", &a[i]);que.push(a[i]);break;case 'o':a[i] = -1;break;case 'q':a[i] = -2;                break;}}int pos = que.size();while (!que.empty()) {m1[que.top()] = pos;m2[pos] = que.top();que.pop();pos--;}for (int i = 0; i < n; ++i) {if (a[i] >= 0) {insert(1, 1, n, m1[a[i]], 1);que2.push(a[i]);}else if (a[i] == -1) {insert(1, 1, n, m1[que2.front()], -1);que2.pop();}else {pos = query(1, 1, n, que2.size()/2 + 1);printf("%d\n", m2[pos]);}}}return 0;
}
// set模拟
#include <bits/stdc++.h>
#define LL  long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, n) for (int i = a; i < n; ++i)
#define maxn 100005
using namespace std;set<int> st1, st2;
queue<int> que;  int main() {#ifndef ONLINE_JUDGE// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);
#endifchar s[10];int n, d, m, Case = 0;while (scanf("%d", &n) != EOF) {printf("Case #%d:\n", ++Case);while (!que.empty()) que.pop();st1.clear();st2.clear();    m = 0;for (int i = 0; i < n; ++i) {scanf("%s", s);if (s[0] == 'i') {scanf("%d", &d);if (st1.empty() || *st1.rbegin() > d) st1.insert(d);else st2.insert(d);que.push(d);m++;}else if (s[0] == 'q') {printf("%d\n", *st1.rbegin());}else {int tmp = que.front();que.pop();if (st1.find(tmp) != st1.end()) st1.erase(tmp);else st2.erase(tmp);m--;}while (m > 0 && st1.size() > m/2 + 1) {d = *st1.rbegin();st2.insert(d);st1.erase(d);}while (m > 0 && st1.size() < m/2 + 1) {d = *st2.begin();st1.insert(d);st2.erase(d);}}}return 0;
}

HDU-5249 KPI(STL or 权值线段树)相关推荐

  1. 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)

    之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...

  2. 2019CCPC网络赛 1002 HDU 6703(权值线段树)

    2019CCPC网络赛 1002 HDU 6703(权值线段树) 思路:用权值线段树存题目给的数据后,2操作就是求权值线段树中大于等于k的部分中,靠近左端点的第一个大于r的值(这个求出来的只是原序列中 ...

  3. Minimum Inversion Number HDU - 1394(权值线段树/树状数组)

    The inversion number of a given number sequence a1, a2, -, an is the number of pairs (ai, aj) that s ...

  4. 【HDU - 5489】Removed Interval(离散化,权值线段树,思维,最长上升子序列)

    题干: Given a sequence of numbers A=a1,a2,-,aNA=a1,a2,-,aN, a subsequence b1,b2,-,bkb1,b2,-,bk of AA i ...

  5. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  6. 树套树 ----- P1975 [国家集训队]排队(树状数组套权值线段树求动态逆序对)

    解题思路: 首先我们知道交换两个数a[l]和a[r]a[l]和a[r]a[l]和a[r]影响到的区间是[l+1,r−1][l+1,r-1][l+1,r−1] 对于a[l]a[l]a[l],我们要减去[ ...

  7. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大

    题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax​为yyy 解题思路: 首先我们知道权值线段树是 ...

  8. codevs1688 求逆序对(权值线段树)

    1688 求逆序对  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Description 给定一个序列a1,a2,-,an,如 ...

  9. 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】

    题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...

最新文章

  1. iOS之UI--转场动画
  2. Careercup - Google面试题 - 5377673471721472
  3. android 接口定义常量,Android开发笔记(5):常量的合理使用
  4. Java即时类| plus()方法与示例
  5. 【20】java里的this和static
  6. ajax,training my javascript!手写AJAX,用POST方法传值
  7. AR增强现实的未来展望
  8. 招人啦!安卓/Java/数据库/测试等一大波岗位袭来
  9. 的谐音歌词_今日新歌,李诞肯定最烦这张谐音梗专辑
  10. android9.0 从driver到APP(2)--hardware
  11. 龙之谷私服源码+搭建教程
  12. 导出excel 手动拼装复杂表头
  13. 头歌 初识MongoDB
  14. Orion2 CDM 操作系统-操作部分20211206
  15. RISC-V MCU低功耗场景的应用分析
  16. fone喜获“2018中国企业绩效管理信息化最佳产品奖”
  17. Excel图表设置X轴位置为最底部
  18. 对BroadCastReceiver的理解
  19. version magic ‘5.15.0 SMP mod_unload aarch64‘ should be ‘5.15.0-xilinx-v2022.2 SMP mod_unload aarch6
  20. PPT 优质模板(所有的风格不low)

热门文章

  1. 编码:隐匿在计算机软硬件背后的语言(7)--存储器组织
  2. 算法训练 出现次数最多的整数
  3. ajax中的同步异步
  4. Opencv2.4.9源码分析——HoughLinesP
  5. HTML语言中checkbox的行为
  6. [转帖]Mootools源码分析-03 -- Hash
  7. asp-Webshell免杀
  8. align_center在JAVA_margin:0 auto与body{text-align:center;}实现元素居中的区别
  9. ❤️拿到offer的成长之路与经验感悟分享❤️
  10. python获取计算机IP、mac地址、计算机名