维护序列的动态中位数

第一次用链表做题。。感觉指针指来指去也挺麻烦的。。

本题链表解法就是用数组模拟出一个链表,然后离线输入所有数,排序,按照输入顺序在链表里删除元素,一次性删掉两个,然后中位数指针对应移动即可

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm> using namespace std;
#define maxn 10004 struct smc{
int val,no;
bool operator<(smc node)const{
return val<node.val;
}
}a[maxn]; int l[maxn],r[maxn],tt,p,n,mid;
int ans[maxn],f[maxn]; int main(){
scanf("%d",&p);
for(tt=;tt<=p;tt++){
scanf("%d%d",&mid,&n);
printf("%d %d\n",tt, n/+);
mid=(+n)/;
for(int i=;i<=n;i++){scanf("%d",&a[i].val);a[i].no=i;}
sort(a+,a++n);
for(int i=;i<=n;i++){l[i]=i-;r[i]=i+;f[a[i].no]=i;}
l[]=l[]=,r[]=;
for(int i=n;i>=;i-=){//一次减掉两个数
ans[i]=a[mid].val;
if(f[i]<mid && f[i-]<=mid) mid=r[mid];
if(f[i]>mid && f[i-]>=mid) mid=l[mid];
if(f[i]==mid){
if(f[i-]>mid) mid=l[mid];
else mid=r[mid];
}
//从链表中删去这两个结点
r[l[f[i]]]=r[f[i]];
l[r[f[i]]]=l[f[i]];
r[l[f[i-]]]=r[f[i-]];
l[r[f[i-]]]=l[f[i-]];
}
int cnt=;
for(int i=;i<=n;i+=){
printf("%d ",ans[i]);
if(++cnt>=) puts(""),cnt=;
}
puts("");
}
return ;
}

网上另外一种解法是对顶堆,所谓对顶堆,就是建立一个小根堆q1,大根堆q2,每次读入的数如果比中位数大,那么就把它放入小根堆中,反之放入大根堆中,小根堆元素必须等于大根堆或者是大根堆+1,如果不符合要求就调整,小根堆堆顶元素即是中位数

hdu和poj输出方式有点不一样

#include<bits/stdc++.h>
#define maxn 10005 using namespace std; priority_queue<int,vector<int>,greater<int> >q1;//小根堆,堆顶中位数
priority_queue<int,vector<int>,less<int> >q2;//、大根堆
int T,n,x,cnt,tot,ans[maxn]; void add(int x){
if(q1.empty()){
q1.push(x);
return;
}
if(x>q1.top()) q1.push(x);
else q2.push(x);
while(q1.size()<q2.size()){
q1.push(q2.top());
q2.pop();
}
while(q1.size()>q2.size()+){
q2.push(q1.top());
q1.pop();
}
} int main(){
scanf("%d",&T);
for(int tt=;tt<=T;tt++){
scanf("%d%d",&tt,&n);
printf("%d %d\n",tt,n/+);
while(!q1.empty())q1.pop();
while(!q2.empty())q2.pop();
cnt=tot=;
for(int i=;i<=n;i++){
scanf("%d",&x);
add(x);
if(i%!=) ans[tot++]=q1.top();
}
for(int i=;i<tot;i++){
if(i> && i%==) puts("");
if(i%) putchar(' ');
printf("%d",ans[i]);
}
puts("");
}
return ;
}

hdu3282 链表或者对顶堆的更多相关文章

  1. 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set

    题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...

  2. hdu4261 Estimation[暴力dp+对顶堆]

    https://vjudge.net/problem/HDU-4261 对于一个长2000的数列划分最多25个块,每块代价为块内每个数与块内中位数差的绝对值之和,求最小总代价. 套路化地,设$f[i] ...

  3. 【POJ 3784】 Running Median (对顶堆)

    Running Median Description For this problem, you will write a program that reads in a sequence of 32 ...

  4. P1168 中位数(对顶堆)

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

  5. poj3784 Running Median[对顶堆]

    由于我不会讲对顶堆,所以这里直接传上一个巨佬的学习笔记. 对顶堆其实还是很容易理解的,想这题的时候自己猜做法也能把没学过的对顶堆给想出来.后来了解,对顶堆主要还是动态的在线维护集合$K$大值.当然也可 ...

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

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

  7. bzoj 1112: [POI2008]砖块Klo【对顶堆】

    priority_queue实现的对顶堆,细节超级多WA了十几次--但是理论上是最简便的orz其实是我已经不会写平衡树了 枚举左端点,显然要把这一段的高度搞成(l,l+k-1)的高度中位数,所以需要一 ...

  8. 【Luogu P1168】【Luogu P1801&UVA 501】中位数&黑匣子(Black Box)——对顶堆相关

    Luogu P1168 Luogu P1801 UVA 501(洛谷Remote Judge) 前置知识:堆.优先队列STL的使用 对顶堆 是一种在线维护第\(k\)小的算法. 其实就是开两个堆,一个 ...

  9. luogu 3466 对顶堆

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

随机推荐

  1. Scala进阶之路-Spark底层通信小案例

    Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...

  2. 过滤选择器first与子元素过滤选择器first-child的区别

    1.表格代码如下: <table id="table"> <tr> <td>id</td> <td>name</t ...

  3. oracle 递归和connect by【转】

    oracle递归查询(单表包含多级上下级关系) http://www.cnblogs.com/walk-the-Line/p/4882866.html -- 查找所有第一层(包括)下的所有子节点 -- ...

  4. Eclipse快捷键大全,导包快捷键:ctrl+Shift+/【转】

    Ctrl+Shift+L 显示所有快捷键 Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复 ...

  5. jquery :checked(过滤选择器) 和 空格:checked(后代选择器)【转】

    jquery 过滤选择器 和 后代选择器 <%@ page language="java" contentType="text/html; charset=UTF- ...

  6. Bootstrap --对话框及提示框的处理和优化

    源模态框使用:http://www.runoob.com/bootstrap/bootstrap-modal-plugin.html <!-- 按钮触发模态框 --> <button ...

  7. JS在Html中使用JavaScript

    一.三种方式 1)<script>元素 2)外部文件 3)文档模式 二.<script>元素 是向HTML页面插入JavaScript的主要方法:HTML 4.01为<s ...

  8. C# this调用构造函数及析构函数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace trai ...

  9. NOIP2018 前流水账

    不务正业系列 学习yyb,zsy,ljq,mona等大佬而写的 \(qwq\) 不知道前言写些什么 \(qwq\) 尽量日更好吧 \(qwq\) \(upd:\)日更是不可能日更的,这辈子不可能的 \ ...

  10. 后端python基础