维护序列的动态中位数

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

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

#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. java代码示例(6-3)

    创建AdministratorTest.java /** * 需求分析:创建管理员对象 * @author chenyanlong * 日期:2017/10/15 */ package com.hp. ...

  2. Hadoop生态圈-离线方式部署Cloudera Manager5.15.1

    Hadoop生态圈-离线方式部署Cloudera Manager5.15.1 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 到目前位置,Cloudera Manager和CDH最新 ...

  3. Tomcat的配置文件详解

    Tomcat的配置文件详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Tomcat的配置文件 Tomcat的配置文件默认存放在$CATALINA_HOME/conf目录中, ...

  4. JAVA-大白话探索JVM-类加载器(一)

    JVM??? Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.JVM是Java Virtual Machine(Java虚拟机)的缩写,Java程序编译后 ...

  5. java实现获取当前年月日 小时 分钟 秒 毫秒

    java代码实现如下 view source print?     /**      * 英文简写(默认)如:2010-12-01      */     public static String F ...

  6. C++ STL sort()函数用法

    C++STL提供的在里的排序函数,有以下两种形式 此外还提供有稳定排序版本stable_sort(),用法类似. 第一种形式: template <class RandomAccessItera ...

  7. 22. SpringBoot 集成 Mybatis

    1. 引入Mybatis的maven 依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> < ...

  8. Python实现Plugin

    1. Plugin与Python 插件的历史最早可追溯至1970年代,它是一种程序组件,通过和应用程序的互动,为应用程序增加一些所需要的特定的功能[维基].插件允许第三方开发者对已有的程序功能进行扩展 ...

  9. Hadoop mapreduce执行过程涉及api

    资源的申请,分配过程略过,从开始执行开始. mapper阶段: 首先调用默认的PathFilter进行文件过滤,确定哪些输入文件是需要的哪些是不需要的,然后调用inputFormat的getSplit ...

  10. C# 反射实例

    1.接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...