10/16 对顶堆算法研究(POJ 3784)

/*
考虑维护两个堆
一个堆是大根堆,存储1-x的元素
一个堆是小根堆,存储x+1-N的元素
对于一个加入的元素y,考虑将其加入大根堆or小根堆?
如果y>mid,那么将其加入小根堆(上面的堆)
如果y<mid,那么将其加入大根堆(下面的堆)
并且在每一次操作之后维护堆的状态是合法的!
也就是维护堆得大小正确

*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int t,pos,n,x,mid,sum;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&pos,&n);
priority_queue <int> qu1;//bigger
priority_queue<int ,vector<int> , greater<int > > qu2;//smaller
printf("%d %d\n",pos,(n+1)/2);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(i==1)
{
mid=x;
sum=1;
printf("%d ",mid);
continue;
}
if(x>mid)
qu2.push(x);
else
qu1.push(x);
if(qu1.size()-qu2.size()==2)
{

qu2.push(mid);
mid=qu1.top();
qu1.pop();
}
if(qu2.size()-qu1.size()==2)
{
qu1.push(mid);
mid=qu2.top();
qu2.pop();
}
if(i%2==1)
{
sum++;
if(sum%10==0)
{
printf("%d\n",mid);

}
else
{
printf("%d ",mid);
}
}

}
if(sum%10!=0)
printf("\n");

}

return 0;

}

原文地址:https://www.cnblogs.com/little-cute-hjr/p/11689012.html

时间: 2024-10-31 09:48:23

10/16 对顶堆算法研究(POJ 3784)的相关文章

【POJ 3784】 Running Median

[题目链接] http://poj.org/problem?id=3784 [算法] 对顶堆算法 要求动态维护中位数,我们可以将1-M/2(向下取整)小的数放在大根堆中,M/2+1-M小的数放在小根堆中 每次插入元素时,先将插入元素与小根堆堆顶比较,如果比堆顶小,则插入小根堆,否则,插入大根堆,然后,判断两个堆 的元素个数是否平衡,若不平衡,则交换两个堆的堆顶 [代码] #include <algorithm> #include <bitset> #include <ccty

# 动态中位数-POJ 3784

题目: 依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数P,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先输入一个代表数据集的编号的整数. 然后输入一个整数M,代表数据集中包含数据的个数,M一定为奇数,数据之间用空格隔开. 数据集的剩余行由数据集的数据构成,每行包含10个数据,最后一行数据量可能少于10个,数据之间用空格隔开. 输出格式 对于每个数据集,第一行输出两个整数,分别代表数据集的编号以及

poj 3784(对顶堆)

Running Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1824   Accepted: 889 Description For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read, output t

poj 3784 用堆动态求解中位数

堆真是一种简单而又神奇的数据结构,以前用它求过前kth的数,现在又可以用两个堆来动态求解中位数. 算法: 构建一个大顶堆和一个小顶堆,分别记为g和l. 假设当前中位数为mid,新读入一个数为tmp,则: 1.如果tmp < mid,则将tmp插入大顶堆,跳到步骤3. 2.如果tmp >= mid,则将tmp插入小顶堆,跳到步骤4. 3.如果大顶堆的元素个数比小顶堆多2(两个堆个数不平衡),则将mid插入小顶堆,弹出大顶堆堆顶元素为新的mid. 4.与步骤3相反,如果小顶堆的元素个数比大顶堆多2

2.分治算法研究-搜索数组中的最大连续子集和 2014-3-11 11:37 阅读(16)

//分治算法研究var cc=consolefunction find_max_crossing_subarray(A,low,mid,high){    var max_left=mid,max_right=mid    var left_sum=0    var sum=0    for(var i=mid;i>=low;i--){        sum=sum+A[i]        if(sum>left_sum){            left_sum=sum           

POJ 3784 - Running Median(动态中位数) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=3784 题目大意: 依次给出n个数字,求在数据输入过程中的所有中位数.(共有(n+1)/2个) 输入格式: 输入一个数字P(1<=P<=1000),表示数据组数. 对于每组数据,第一行输入数据组号和数字总个数(1<=个数<=9999),中间以一个空格隔开. 接下来每行给出至多10个数字. 输出格式: 对于每组数据,第一行输出数据组号和中位数个数,中间

基础典型算法研究:合并有序数组

做leetcode第二题的时候,发现合并有序数组是一个很有意思的问题,于是,总结如下,部分内容来源于网络各位大神. 第一种方法: 合并调用sort. 即是将两个数组合并在一个数组里面,然后对合并后的数组调用sort函数即可. class Solution: def getArray(self, A, B) : for item in B : A.append(item) A.sort() 第二种方法: 极值插入法. #include <stdio.h> void insert(int *arr

几种空间分割算法研究之bsp

BSP: 二叉分割树,是一种分割场景的方法,下面代码是BSP树一种实现可运行: 运行例子中,将定义的16个空间面,分割为一个深度是3的BSP树,上图显示的是运行结果: #include "stdafx.h" #include <map> #include <vector> #include <iostream> using namespace std; //定义空间的点结构 struct point { float x,y,z; point():x(

静态频繁子图挖掘算法用于动态网络——gSpan算法研究

摘要 随着信息技术的不断发展,人类可以很容易地收集和储存大量的数据,然而,如何在海量的数据中提取对用户有用的信息逐渐地成为巨大挑战.为了应对这种挑战,数据挖掘技术应运而生,成为了最近一段时期数据科学的和人工智能领域内的研究热点.数据集中的频繁模式作为一种有价值的信息,受到了人们的广泛关注,成为了数据挖掘技术研究领域内的热门话题和研究重点. 传统的频繁模式挖掘技术被用来在事务数据集中发现频繁项集,然而随着数据挖掘技术应用到非传统领域,单纯的事务数据结构很难对新的领域的数据进行有效的建模.因此,频繁