首页 > 其他分享 >P1168 中位数

P1168 中位数

时间:2022-11-15 15:01:51浏览次数:62  
标签:std const int tree 中位数 P1168

离散化,线段树 #include using namespace std; const int N = 1e5 + 7; int a[N], tree[N << 4], hs[N]; void add(int x, int i, int l, int r){ tree[i] ++; if(l == r) return; int mid = (l + r) >> 1; if(x <= mid) add(x, i << 1, l, mid); else add(x, i << 1 | 1, mid + 1, r); } int query(int m, int i, int l, int r){ if(l == r) return hs[l]; int mid = (l + r) >> 1; if(tree[i << 1] >= m) return query(m, i << 1, l, mid); else return query(m - tree[i << 1], i << 1 | 1,mid + 1, r); } int main(){ int n; scanf("%d", &n); for(int i = 1;i <= n;i ++) scanf("%d", &a[i]), hs[i] = a[i]; sort(hs + 1, hs + n + 1); int t = unique(hs + 1, hs + n + 1) - hs - 1; int p = lower_bound(hs + 1, hs + t + 1, a[1]) - hs; add(p, 1, 1, t); printf("%d\n", query(1, 1, 1, t)); for(int i = 3;i <= n;i += 2){ p = lower_bound(hs + 1, hs + t + 1, a[i]) - hs; add(p, 1, 1, t); p = lower_bound(hs + 1, hs + t + 1, a[i - 1]) - hs; add(p, 1, 1, t); printf("%d\n", query(i/2 + 1, 1, 1, t)); } return 0; }

标签:std,const,int,tree,中位数,P1168
From: https://www.cnblogs.com/loser--QAQ/p/16892418.html

相关文章

  • 剑指 Offer 41. 数据流中的中位数 - 力扣(Leetcode)
    剑指Offer41.数据流中的中位数-力扣(Leetcode)分析维护两个堆,一个大根堆,一个小根堆。插入操作:当进行插入时,先判断大根堆中是否有元素,如果没有直接插入大根堆,若有......
  • 4.寻找两个正序数组的中位数
    思路原问题难以直接递归求解,所以我们先考虑这样一个问题:在两个有序数组中,长度分别为n、m,找出第k小数。如果该问题可以解决,那么第k=(n+m)/2小数就是我们要求的中位......
  • [???] 带权中位数
    好像是某道CF问题的变形,记一下.题目描述有若干的排列在一条直线上的点\(p_i\),每个点上有\(a_i\)个人,找出一个点,使得所有人移动带这个人的位置上的总距离最小.结......
  • P1627 [CQOI2009] 中位数
    Idea注意到中位数只关心数据的相对大小,因此考虑从目标数字开始往两边求前/后缀和,接下来使用乘法原理来进行组合即可.可以用map统计.第一次感觉只要看一看扩展,当时......
  • 寻找两个正序数组的中位数
    题目给定两个大小分别为m和n的正序(从小到大)数组 nums1和 nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输......
  • 剑指offer——数据流中的中位数
    题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数......
  • 取m和n的中位数溢出解决办法
    在LeetCode上刷一道二分的简单题,需要计算m和n的中位数。通常的想法是直接如下即可:intmid=(m+n)/2;然而​​mid​​​存在溢出的风险,一种简单的解决办法是把​​mid......
  • PAT_甲级_1029 Median (25分) (C++)【求中位数/递增序列合并】
    目录​​1,题目描述​​​​题目大意​​​​2,思路​​​​3,代码​​1,题目描述SampleInput:4111213145910151617 SampleOutput:13题目大意求两递增序列的中位数(......
  • 力扣-4-寻找两个正序数组的中位数
    中位数的定义是什么?有序数列中位置中间的数字如果中间位置有两个返回则他们的平均值,所以这里的返回值是个double要求时间复杂度为log(m+n),也就是说只对两个数组做一次遍......
  • 寻找两个正序数组的中位数
    给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log(m+n)) 。 示例......