首页 > 其他分享 >P1168 题解

P1168 题解

时间:2024-04-22 14:25:40浏览次数:28  
标签:q1 q2 int 题解 元素 个数 P1168 size

P1168 中位数 - 洛谷

很巧妙的一个题,自己没想出来。

用一个「对顶堆」来维护,即一个大根堆和一个小根堆。保证大根堆的队首 \(\le\) 小根堆的队首,并使他们的堆中元素的个数尽量相等。

操作如下:

  1. 每次加入一个元素时,如果这个数比大根堆的队首大,就加入小根堆;否则加入大根堆。
  2. 比较两个堆中的元素个数。如果差值 \(> 1\),将元素个数多的那堆的队首弹出,并加入到个数少的那堆,直到元素个数差值 \(\le 1\)。
  3. 如果两堆的元素个数的差值为 \(1\),输出元素个数多的那堆的队首即可。
#include <iostream>  
#include <cstdio>  
#include <queue>  
using namespace std;  
  
const int N = 100010;  
int n, a[N];  
priority_queue<int> q1;  
priority_queue<int, vector<int>, greater<int> >q2;  
  
int main() {  
    scanf("%d", &n);  
  
    for (int i = 1; i <= n; i++) {  
        int t; scanf("%d", &t);  
//        printf("%d\n", t);  
        if (q1.empty()) q1.push(t);  
        else if (q1.top() >= t) q1.push(t);  
        else q2.push(t);  
        while (int(q1.size() - q2.size()) > 1) {  
            int tmp = q1.top();  
            q1.pop();  
            q2.push(tmp);  
        }  
        while (int(q2.size() - q1.size()) > 1) {  
            int tmp = q2.top();  
            q2.pop();  
            q1.push(tmp);  
        }  
        if (q2.size() > q1.size()) printf("%d\n", q2.top());  
        else if (q1.size() > q2.size()) printf("%d\n", q1.top());  
    }  
    return 0;  
}

调了大概 25min,因为 q1.size() - q2.size() 有精度问题。(我服了这都能出 bug)

标签:q1,q2,int,题解,元素,个数,P1168,size
From: https://www.cnblogs.com/Running-a-way/p/18150549

相关文章

  • P6492 题解
    P6492[COCI2010-2011#6]STEP-洛谷题目大意:维护一段01串,支持单点修改,每次修改后求最长的「\(\texttt{01010101}\dots\)」的长度。下文把「\(\texttt{01010101}\dots\)」称为「合法区间」,\(k\)为区间\([l,r]\)编号,\(lk,rk\)为\([l,r]\)左右子区间编号。考虑用线......
  • atcoder regular 176 (ARC176) A、B题解
     A很容易有一个错误想法,就是行从1~n,列从1~n拿,这样,第三个样例,最后,第7行,第7列,需要都增加两个数,但是(7,7)这个位置只能有一个数。我的做法是优先队列/set队列,每次选择行、列之中当前已经有的数目最少的(这样它们最需要添加),这样能保证,行列需要添加的,不会出现只能选择多个行列一样的......
  • P1637 题解
    一道绿写2.5h,我是什么效率哥。Solution提供一种不使用线段树/树状数组的方法。前置知识:分治,二分,前缀和。考虑分治。我们假设有一个分治函数solve(l,r)可以统计区间\([l,r]\)中的thair。对于一个区间\([l,r]\)中的thair\(=\{a_i,a_j,a_k|i<j<k\) 且\(a_......
  • P8207 [THUPC2022 初赛] 最小公倍树 题解
    题目大意有编号为\([L,R]\)区间的点,连接两个点\(x,y\)边权的为\(LCM(x,y)\),求这张图的最小生成树。\[1\leqL\leqR\leq10^6,R-L\leq10^5\]解题思路我们有一个结论:对于张图\(G\)中的一个生成子图\(E\),\(E\)之中的一条边\(k\)如果不在\(E\)最小生成树中,那么\(......
  • P7431【THUPC2017】小 L 的计算题 (牛顿恒等式)(分治NTT)(多项式求逆)题解
    知识点涉及:牛顿恒等式,分治\(NTT\),多项式求逆。这道题有一个推式子之后分治\(NTT+Ln+Exp\)的做法,不过也有一个不用\(Ln+Exp\)的做法(理论常数要小点,实际差不多)。题解:这道题可以牛顿恒等式直接推出一个非常好写的东西。首先看一下牛顿恒等式的描述:对于\(n\)次多项式\(A(......
  • CF1067E Random Forest Rank 题解
    这道题涉及了组合分析和概率。本质上,当以一定的概率从给定的树中删除边时,您需要找到结果林的邻接矩阵的期望秩。要解决这个问题,可以使用动态规划。我们用\(f(u,v)\)表示当删除边\((u,v)\)时,由以顶点\(v\)为根的子树中的顶点形成的林的期望秩。这里,\(u\)和\(v\)是树中的......
  • 2024年GPLT团体程序设计比赛L2-D吉利矩阵题解
    只能说比赛时前期做得太慢了,后面导致题目只能捞点分数(IOI赛制),当时这道题是我不剪枝DFS拿了4分,压线拿铜牌!考完试一做,发现是个大水题(bushi)主要原理:DFS(深度优先搜索)+剪枝名言:学搜索核心就是学剪枝废话不说了,见代码点击查看代码//原理:DFS+剪枝#include<bi......
  • Atcoder ABC 350 全题解
    题外话别以为博主之前几场ABC都咕咕咕了,最近状态不好,这次ABC终于回来了(也有可能是题目变容易了,有图为证)P.S.请耐心看到最后!!否则后果自负!!!AB这年头谁不会AB啊当然有。不学OI的人。C考虑选择排序,依次将$1,2,3\cdots$与它们应该在的位置进行交换。那如果真的......
  • 题解:CF17D Notepad
    由于首位不能是\(0\),因此首位有\(b-1\)种可能性。其他\(n-1\)位有\(b^{n-1}\)种可能。因此这些数总计\((b-1)b^{n-1}\)每页\(c\)个数,求最后一页有多少个数,即求\(\text{ans}=(b-1)b^{n-1}\quad\bmodc\)注意到题目中\(b,n\)都非常大,采用扩展欧拉定理进行降......
  • [ZJOI2019] 语言 题解
    不愧是\(ZJOI\),《最可做的一道题》都让人一头雾水……首先将问题转化到链上。可以将总共的组数转化为每个点可以到达的城市。明显给每个点建一棵动态开点线段树,维护可以和他通商的点。很明显,可以通商的点的标号连续的一段。我们可以将可以将每一次传播语言的工作当作区间修改......