首页 > 其他分享 >P1168 中位数(对顶堆)

P1168 中位数(对顶堆)

时间:2024-09-13 20:12:56浏览次数:11  
标签:typedef return int 中位数 long vector vx P1168

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
vector<int> vx;
inline int mp(int x) {return upper_bound(vx.begin(),vx.end(),x)-vx.begin();}
inline int log_2(int x) {return 31-__builtin_clz(x);}
inline int popcount(int x) {return __builtin_popcount(x);}
inline int lowbit(int x) {return x&-x;}

void solve()
{
	priority_queue<int> q_B;
	priority_queue<int,vector<int>,greater<int>> q_S;
	int n;
	cin>>n;
	//用小根堆维护比根节点大的一半节点,大根堆维护比小根堆根节点小的
	vector<int> a(n);
	for(int i=0;i<n;++i) cin>>a[i];
	q_S.push(a[0]);
	cout<<a[0]<<'\n';
	
	for(int i=1;i<n;++i)
	{
		//当i为奇数时插入大顶堆,偶数时插入小顶堆
		if(i&1)
		{
			if(a[i]<=q_S.top())
			{
				q_B.push(a[i]);
			}
			else
			{
				q_B.push(q_S.top());
				q_S.pop();
				q_S.push(a[i]);
			}
		}
		else
		{
			if(a[i]>=q_B.top())
			{
				q_S.push(a[i]);
			}
			else
			{
				q_S.push(q_B.top());
				q_B.pop();
				q_B.push(a[i]);
			}
			cout<<q_S.top()<<'\n';
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T = 1;
	//cin>>T;
	while(T--)
	{
		solve();
	}
}

标签:typedef,return,int,中位数,long,vector,vx,P1168
From: https://www.cnblogs.com/ruoye123456/p/18412817

相关文章

  • 洛谷刷题之P1168
    中位数题目描述给定一个长度为NNN的非负整数序列AAA,对于前奇数......
  • [Python手撕]两个升序数组的中位数
    classSolution:deffindMedianSortedArrays(self,nums1:List[int],nums2:List[int])->float:nums1_len=len(nums1)nums2_len=len(nums2)deffind(nums1,nums2,k):#time.sleep(1)ifnotnums1:......
  • 信息学奥赛初赛天天练-81-NOIP2015普及组-完善程序-二分答案、二分查找、中位数、二分
    1完善程序(单选题,每小题3分,共30分)中位数median给定n(n为奇数且小于1000)个整数,整数的范围在0∼m(0<m<2^31)之间,请使用二分法求这n个整数的中位数。所谓中位数,是指将这n个数排序之后,排在正中间的数。(第五空2分,其余3分)01#include<iostream>02usingnamespace......
  • 大小堆运用巧解数据流的中位数
    ​​​​​​​​​​一、思路我们将所有数据平分成两份,前面那一部分用小堆来存,后面的部分用大堆来存,这样我们就能立刻拿到中间位置的值。如果是奇数个数字,那么我们就将把中间值放在前面的大堆里,所以会有两种情况,我们将大堆成为left,小堆成为right。当数据量是偶数的......
  • python 计算中位数、四分位数、最大值、最小值等
    还是之前的那一堆csv数,主要算每列的中位数、四分位数、最大值、最小值等我在这里做个笔记,方便下次用的时候直接粘过来用#!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Suyue@file:vilolinpic.py@time:2024/08/13@desc:"""importpandasaspddf=pd.rea......
  • Day 2:3107 使数组中位数等于k的最少操作数
    3107使数组中位数等于k的最少操作数1.题目描述2.解题思路3.代码实现1.题目描述3107使数组中位数等于k的最少操作数2.解题思路(1)对nums数组从小到大排序,注意到mid=nums.size()/2位置处的值为中位数;(2)判断中位数与k的大小关系:若中位数大于k,则向左依次......
  • 中位数
    题目题解1.首先我们可以想到,既然需要输出(n+1)/2次,所以我们可以每次排序一下,并在其为奇数的时候输出它们中间的数。#include<iostream>#include<algorithm>#include<queue>usingnamespacestd;intN;inta[100001];intmain(){ cin>>N; for(inti=0;i<......
  • CF1993D-二分+dp处理中位数
    CF1993D-二分+dp处理中位数大致题意给定两个正整数n和k以及另一个由n个整数组成的数组a。在一次操作中,可以选择a的任意一个大小为k的子数组,然后将其从数组中删除,而不改变其他元素的顺序。更正式地说,假设$(l,r)$是对子数组\(a_l,a_{l+1},…,a_r\)的操作,使得\(r......
  • (leetcode学习)295. 数据流的中位数
    中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。例如arr=[2,3,4] 的中位数是3 。例如 arr=[2,3]的中位数是(2+3)/2=2.5。实现MedianFinder类:MedianFinder()初始化MedianFinder 对象。voidaddN......
  • 美团一面:如何在 100 亿数据中找到中位数?
     海量数据中找到中位数,内存肯定是无法一次性放下这么多数据的中位数定义:数字排序之后,位于中间的那个数。比如将100亿个数字进行排序,排序之后,位于第50亿个位置的那个数就是中位数。桶排序1)创建多个小文件桶,设定每个桶的取值范围,然后把海量数据元素根据数值分配......