Luogu P1168

Luogu P1801

UVA 501(洛谷Remote Judge)

前置知识:堆、优先队列STL的使用

对顶堆

是一种在线维护第\(k\)小的算法。

其实就是开两个堆,一个是大根堆,一个是小根堆。两个堆的根相对。

下面借助题目P1168进行详细分析。

P1168

题意很好理解,不多作分析。

显然当\(i=1\)时,中位数就是\(a[1]\),记为\(mid\)。

我们可以使用对顶堆,把比\(mid\)小的存入大根堆,比mid大的存入小根堆。

当我们已经加入奇数个元素时,可以根据两个堆的大小调整\(mid\)值

  • 当\(heap-big.size==heap-little.size\),当前\(mid\)即为中位数
  • 当\(heap-big.size<heap-little.size\),将当前\(mid\)压入大根堆,小根堆的堆顶弹出并作为新的mid,重复以上过程直至\(heap-big.size==heap-little.size\)。
  • 反之同理

那么这样不断操作就可以求出答案了。

  1. #include<cstdio>
  2. #include<queue>
  3. using namespace std;
  4. priority_queue<int> que1;//大根堆
  5. priority_queue<int,vector<int>,greater<int>> que2;//小根堆
  6. int n,a,mid;
  7. int main()
  8. {
  9. scanf("%d",&n);
  10. scanf("%d",&a);
  11. mid=a;
  12. printf("%d\n",a);
  13. for (int i=2;i<=n;i++)
  14. {
  15. scanf("%d",&a);
  16. if (a>mid) que2.push(a);
  17. if (a<=mid) que1.push(a);
  18. if (i%2==1)
  19. {
  20. if (que1.size()!=que2.size())
  21. {
  22. //不用while是因为两个堆的大小最多相差2。
  23. if (que1.size()>que2.size())
  24. {
  25. que2.push(mid);
  26. mid=que1.top();
  27. que1.pop();
  28. }
  29. else
  30. {
  31. que1.push(mid);
  32. mid=que2.top();
  33. que2.pop();
  34. }
  35. }
  36. printf("%d\n",mid);
  37. }
  38. }
  39. return 0;
  40. }

P1801&UVA 501

思路类似,不再重复

P1801

  1. #include<queue>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. priority_queue<int,vector<int>,greater<int> > que2;
  7. priority_queue<int,vector<int>,less<int> > que1;
  8. int m,n,a[200005],T,u[200005];
  9. int main()
  10. {
  11. //scanf("%d",&T);
  12. T=1;
  13. /*这是根据UVA 501修改的,两题其实是一样的,但是UVA 501有多组数据,且对输出格式
  14. 有要求*/
  15. while (T--)
  16. {
  17. while (!que1.empty()) que1.pop();
  18. while (!que2.empty()) que2.pop();
  19. memset(a,0,sizeof(a));
  20. memset(u,0,sizeof(u));
  21. scanf("%d%d",&m,&n);
  22. for (int i=1;i<=m;i++)
  23. scanf("%d",&a[i]);
  24. for (int i=1;i<=n;i++)
  25. scanf("%d",&u[i]);
  26. int j=1,now=u[1];
  27. for (int i=1;i<=m;i++)
  28. {
  29. if (que1.empty()) que1.push(a[i]);
  30. else if (a[i]<que1.top()) que1.push(a[i]);
  31. else que2.push(a[i]);
  32. if (i==now)
  33. {
  34. while (i==now)
  35. {
  36. while (que1.size()<j)
  37. {
  38. que1.push(que2.top());
  39. que2.pop();
  40. }
  41. while (que1.size()>j)
  42. {
  43. que2.push(que1.top());
  44. que1.pop();
  45. }
  46. printf("%d\n",que1.top());
  47. j++;
  48. now=u[j];
  49. if (j>n) return 0;
  50. }
  51. }
  52. }
  53. if (T) printf("\n");
  54. }
  55. return 0;
  56. }

UVA 501

  1. #include<queue>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. priority_queue<int,vector<int>,greater<int> > que2;
  7. priority_queue<int,vector<int>,less<int> > que1;
  8. int m,n,a[200005],T,u[200005];
  9. int main()
  10. {
  11. scanf("%d",&T);
  12. while (T--)
  13. {
  14. while (!que1.empty()) que1.pop();
  15. while (!que2.empty()) que2.pop();
  16. memset(a,0,sizeof(a));
  17. memset(u,0,sizeof(u));
  18. scanf("%d%d",&m,&n);
  19. for (int i=1;i<=m;i++)
  20. scanf("%d",&a[i]);
  21. for (int i=1;i<=n;i++)
  22. scanf("%d",&u[i]);
  23. int j=1,now=u[1];
  24. for (int i=1;i<=m;i++)
  25. {
  26. if (que1.empty()) que1.push(a[i]);
  27. else if (a[i]<que1.top()) que1.push(a[i]);
  28. else que2.push(a[i]);
  29. if (i==now)
  30. {
  31. while (i==now)
  32. {
  33. while (que1.size()<j)
  34. {
  35. que1.push(que2.top());
  36. que2.pop();
  37. }
  38. while (que1.size()>j)
  39. {
  40. que2.push(que1.top());
  41. que1.pop();
  42. }
  43. printf("%d\n",que1.top());
  44. j++;
  45. now=u[j];
  46. if (j>n) break;
  47. }
  48. if (j>n) break;
  49. }
  50. if (j>n) break;
  51. }
  52. if (T) printf("\n");
  53. }
  54. return 0;
  55. }

【Luogu P1168】【Luogu P1801&UVA 501】中位数&黑匣子(Black Box)——对顶堆相关的更多相关文章

  1. [luogu]P1168 中位数[堆]

    [luogu]P1168 中位数 题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1 ...

  2. 洛谷 - P1801 - 黑匣子 - 对顶堆

    这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为 ...

  3. P1168 中位数(对顶堆)

    题意:维护一个序列,两种操作 1.插入一个数 2.输出中位数(若长度为偶数,输出中间两个较小的那个) 对顶堆 维护一个小根堆,一个大根堆,大根堆存1--mid,小根堆存mid+1---n 这样堆顶必有 ...

  4. luogu 3466 对顶堆

    显然答案是将一段区间全部转化成了其中位数这样的话,需要维护一个数据结构支持查询当前所有数中位数对顶堆 用两个堆将 < 中位数的数放入大根堆将 > 中位数的数放入小根堆这样就会存在删除操作 ...

  5. P1801 黑匣子[对顶堆]

    没错我就是专门找对顶堆练习题的.现在感觉对顶堆使用面有点狭窄.这道题由于我询问是随时间单调增的,而且数据比较友好,应该是插入几次就询问一下的.而中位数那题也是经常询问的.如果查询的东西不单调,或者查询 ...

  6. AcWing:106. 动态中位数(对顶堆)

    依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数PP,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先 ...

  7. LuoGu P1168 中位数

    题目描述 给出一个长度为 $ N $ 的非负整数序列 $ A_i $ ,对于所有 $ 1 ≤ k ≤ (N + 1) / 2 $ ,输出 $ A_1, A_3, -, A_{2k - 1} $ 的中位 ...

  8. luogu P1168 中位数 |树状数组+二分

    题目描述 给出一个长度为NN的非负整数序列A_i,对于所有1 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A_1, A_3, -, A_2k - 1的中位数.即前1,3,5,-个数的 ...

  9. 【Luogu P1048 Luogu P1016】采药/疯狂的采药

    采药/疯狂的采药 两道模板题,分别是0-1背包和完全背包. 0-1背包 二维:dp[i][j]=max(dp[i-1][j-time[i]]+v[i],dp[i-1][j]); 由于i的状态由i-1的 ...

随机推荐

  1. volatile关键字使用

    1.volatile 使用场景(多线程情况下): 适合使用在 一写多读 的情况下: 2.volatile 理解分析: 使用 volatile 关键字修饰的变量,值在改变时会直接刷新到 主内存 中,而不 ...

  2. Kafka集群的安装和部署

    一.Kafka的下载与解压 http://kafka.apache.org/downloads.html下载kafka_2.11-1.1.1.tgz.gz并解压到/home/jun下 [jun@mas ...

  3. spring-boot-plus是易于使用,快速,高效,功能丰富,开源的spring boot 脚手架.

    Everyone can develop projects independently, quickly and efficiently! spring-boot-plus是一套集成spring bo ...

  4. 创建WebApi

    一.创建 Web 项目 使用vs创建项目,选择“ASP.NET Core Web 应用程序”模板,将项目命名为 TodoApi,然后单击“确定”. 在“新建 ASP.NET Core Web 应用程序 ...

  5. 机器学习笔记(一)&#183; 感知机算法 &#183; 原理篇

    这篇学习笔记强调几何直觉,同时也注重感知机算法内部的动机.限于篇幅,这里仅仅讨论了感知机的一般情形.损失函数的引入.工作原理.关于感知机的对偶形式和核感知机,会专门写另外一篇文章.关于感知机的实现代码 ...

  6. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  7. Python实现王者荣耀小助手(一)

    简单来说网络爬虫,是指抓取万维网信息的程序或者脚本,Python在网络爬虫有很大优势,今天我们用Python实现获取王者荣耀相关数据,做一个小助手: 前期准备,环境搭建: Python2.7 sys模 ...

  8. 在ubuntu中安装minicom时出现device /dev/tty8 is locked解决办法

    未正常关闭minicom yesaidu@ywf-ubuntu: ~$ ls /var/lock LCK..ttyS0  subsys yesaidu@ywf-ubuntu: ~$ kill 0 ye ...

  9. css3 svg路径蒙版动画

    css3 svg路径蒙版动画 具体看https://www.cnblogs.com/oubenruing/p/9568954.html 还有个更好控制的写法<pre><!DOCTYP ...

  10. EXISTS的用法介绍

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...