维护序列的动态中位数

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

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

#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. Port Forwarding in Windows

    转自:http://woshub.com/port-forwarding-in-windows/ Since Windows XP there is a built-in ability in Mic ...

  2. System.Runtime.InteropServices.COMException:“服务器出现意外情况。 (异常来自

    .Net MVC导出Excel的时候,一直报错,如题.原因是因为福昕阅读器,这样设置 execl->点击文件>选项>加载项,选择com加载项,把祈福阅读器勾掉.

  3. 设计模式---对象创建模式之工厂方法模式(Factory Method)

    前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...

  4. js中闭包的概念和用法

    闭包:主要的作用是 封装变量,收敛权限.防止变量被污染.比如Jquery框架就运用了大量的闭包.为什么呢? 问个问题?框架是如何来避免你声明的变量和它自带的变量不发生的冲突的?????很明显,需要闭包 ...

  5. idea出现乱码问题

    Intellij Idea打包工程时控制台显示乱码 这主要是maven编译时编码问题导致的.在Intellij的settings中maven的run配置中设置它的VM Options为-Darchet ...

  6. ChunkDisappearImage-一个以矩形为单位的图片消失分解效果

    效果 使用 1.将ChunkDisappearImage挂在一个空GameObject上. 2.将ChunkDisappearImage的Material设为ChunkDisappearImageMa ...

  7. H - Repeats (重复最多子串的次数)

    题目链接:https://cn.vjudge.net/contest/283743#problem/H 题目大意:T组数据,给你一个字符串,然后让你求这个字符串的重复最多子串的次数. 具体思路:论文题 ...

  8. 零基础http代理http完美代理访问

    如果翻过墙,或者做过渗透啥的,肯定对代理不陌生,说白了,代理服务器就是一个中转站,你对目标网址的请求都会进过代理服务器去请求,类似于一个被你操控的傀儡,别人能知道的也只能是这个代理,从而提升安全性和访 ...

  9. VS Code中Matlab插件安装设置

    Install the extension in VS Code Open the command palette using Ctrl+Shift+P Type ext install Matlab ...

  10. linux 查看用户上次修改密码的日期【转】

    1.找到以下文件: cat /etc/shadow 第三段字符就是最近一次密码修改的天数,此数字是距离1970年1月1日的天数.   2.用以下命令计算: date -u -d "1970- ...