Luogu P1168 Luogu P1801 UVA 501(洛谷Remote Judge) 前置知识:堆.优先队列STL的使用 对顶堆 是一种在线维护第\(k\)小的算法. 其实就是开两个堆,一个是大根堆,一个是小根堆.两个堆的根相对. 下面借助题目P1168进行详细分析. P1168 题意很好理解,不多作分析. 显然当\(i=1\)时,中位数就是\(a[1]\),记为\(mid\). 我们可以使用对顶堆,把比\(mid\)小的存入大根堆,比mid大的存入小根堆. 当我们已经加入奇数个元素时…
[luogu]P1168 中位数 题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. 输入输出格式 输入格式: 输入文件median.in的第1行为一个正整数N,表示了序列长度. 第2行包含N个非负整数A[i] (A[i] ≤ 10^9). 输出格式: 输出文件median.out包含(N + 1) / 2行,第i行为A[1], A[3], …, A[2…
这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为n的(位于下方的)大顶堆,(位于上方的)小顶堆中每个元素都比大顶堆的大.在这道题中,n不变时每次有新的比他小的就把堆顶弹出到对顶(也就是小顶堆)的堆顶,每次n扩大的时候就从(上面的)小顶堆里取出堆顶放进大顶堆的堆顶…… 但是看样子应该其他平衡树也是可以解决这个问题的.比如支持快速名次的splay?还…
题意:维护一个序列,两种操作 1.插入一个数 2.输出中位数(若长度为偶数,输出中间两个较小的那个) 对顶堆 维护一个小根堆,一个大根堆,大根堆存1--mid,小根堆存mid+1---n 这样堆顶必有中位数. 每次操作后维护两个堆元素数量,保证一个比另一个多1或相等 #include<cstdio> #include<iostream> #include<algorithm> #include<queue> using namespace std; #def…
显然答案是将一段区间全部转化成了其中位数这样的话,需要维护一个数据结构支持查询当前所有数中位数对顶堆 用两个堆将 < 中位数的数放入大根堆将 > 中位数的数放入小根堆这样就会存在删除操作 删除的时候由于无法快速删除只需做个标记,标记该数被删除了一次并且堆的实际大小也应该另外记录维护 在标记时需要更改相应的堆的大小与权值答案就非常显然了 #include <bits/stdc++.h> using namespace std; #define gc getchar() inline…
没错我就是专门找对顶堆练习题的.现在感觉对顶堆使用面有点狭窄.这道题由于我询问是随时间单调增的,而且数据比较友好,应该是插入几次就询问一下的.而中位数那题也是经常询问的.如果查询的东西不单调,或者查询过少,对顶堆都会退化,可能一次维护就要$nlogn$,所以他只适用于经常询问单调增排名的问题.(←个人理解,不服可以来怼我) 所以还是主席树或者平衡树更稳一些啊,但码量问题..不写了 #include<iostream> #include<cstdio> #include<cst…
依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数PP,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先输入一个代表数据集的编号的整数. 然后输入一个整数MM,代表数据集中包含数据的个数,MM一定为奇数,数据之间用空格隔开. 数据集的剩余行由数据集的数据构成,每行包含10个数据,最后一行数据量可能少于10个,数据之间用空格隔开. 输出格式 对于每个数据集,第一行输出两个整数,分别代表数据集的编号以及输…
题目描述 给出一个长度为 $ N $ 的非负整数序列 $ A_i $ ,对于所有 $ 1 ≤ k ≤ (N + 1) / 2 $ ,输出 $ A_1, A_3, -, A_{2k - 1} $ 的中位数.即前 $ 1,3,5,- $ 个数的中位数. 输入输出格式 输入格式: 第 $ 1 $ 行为一个正整数 $ N $ ,表示了序列长度. 第 $ 2 $ 行包含 $ N $ 个非负整数 $ A_i (A_i ≤ 10^9) $ 输出格式: 共 $ (N + 1) / 2 $行,第 $ i $ 行为…
题目描述 给出一个长度为NN的非负整数序列A_i,对于所有1 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A_1, A_3, -, A_2k - 1的中位数.即前1,3,5,-个数的中位数. 输入格式 第1行为一个正整数N,表示了序列长度. 第2行包含N个非负整数A_i (A_i ≤ 10^9) 输出格式 共(N + 1) / 2(N+1)/2行,第ii行为A_1, A_3, -, A_2k - 1 的中位数. #include<cstdio> #include<cst…
采药/疯狂的采药 两道模板题,分别是0-1背包和完全背包. 0-1背包 二维:dp[i][j]=max(dp[i-1][j-time[i]]+v[i],dp[i-1][j]); 由于i的状态由i-1的状态转移而来,那么可以省去物品的维度. 但是重量/容积维度的循环j必须倒序进行,否则可能使物品被重复选. 大家可以自己思考一下为什么. 一维:dp[j]=max(dp[j-time[i]]+v[i],dp[j]); #include<iostream> #include<cstdio>…