CLRS:median and order statistics】的更多相关文章

//maximum and minimum     暴力遍历 O(n) //i-th element dicide and conquer random_selected_partition     k(all the element samller than value[k] put left of value[k],all tht elenment larger than value[k] put right) recurrence test if(i=k)return value[k] i…
洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ ans_k=\sum_{i=1}^n L_iR_{i+k-1} \] 显然把\(L\)数组翻转一下就是一个FFT了. 最后特判\(k=0\). 代码 #include<bits/stdc++.h> clock_t t=clock(); namespace my_std{ using namespace…
Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 \(<x\) . \(1 \leq n \leq 2 \cdot 10^5\) Solution 我们用 \([A_i<x]\) 做一个前缀和,显然这是单调递增的.记前缀和为 \(i\) 的个数为 \(f_i\) . 显然对于 \(i=k,k\neq 0\) 答案就是 \[\sum_{i=0}^{…
Description 给你一个数组 $a_{1 \sim n}$,对于 $k = 0 \sim n$,求出有多少个数组上的区间满足:区间内恰好有 $k$ 个数比 $x$ 小.$x$ 为一个给定的数. Input 第一行$n,x$. 第二行给出$n$个数 Output 一行答案. Sample Input1 5 31 2 3 4 5 Sample Output1 6 5 4 0 0 0 Sample Input2 2 6-5 9 Sample Output2 1 2 0 Sample Input…
题目链接 CF993E 题解 我们记小于\(x\)的位置为\(1\),否则为\(0\) 区间由端点决定,转为两点前缀和相减 我们统计出每一种前缀和个数,记为\(A[i]\)表示值为\(i\)的位置出现的次数 那么对于\(k > 0\)有 \[ans_k = \sum\limits_{x - y = k} A[x]A[y]\] 令 \[B[x] = A[n - x]\] 那么有 \[ans_k = \sum\limits_{x + y = n + k} A[x]B[y]\] 就成了卷积的形式 第\…
小于x的赋值为1,否则为0 区间等于k的个数 求0~n连续的n+1个k? N<=1e5? FFT! 考虑卷积建模:用下标相加实现转移到位,数值相乘类比乘法原理! 法一: 分治,然后FFT没了 法二: 不分治也可以!区间查询->前缀相减 ans[j-i]=f[j]*f[i],f[i]表示数值为i的前缀和个数 减法怎么办?reverse变成加法! i->n-i ans[j-i]=f[j]*f[i]=f[j]*f'[n-i] FFT一下,n+j-i位置的值就是ans辣 #include<…
http://www.geeksforgeeks.org/find-k-th-smallest-element-in-bst-order-statistics-in-bst/ #include <iostream> #include <vector> #include <algorithm> #include <queue> #include <stack> #include <string> #include <fstream…
题意: 给你一个数组a1~an,对于k=0~n,求出有多少个数组上的区间满足:区间内恰好有k个数比x小.x为一个给定的数.n<=10^5.值域没有意义. 分析: 大神们都说这道题是一个套路题,真是长见识%%%. 首先我们可以将题面转化,因为x是预先给出的,所以我们可以对其进行预处理,将数列中小于x的数都设为1,其他都为0,然后求一个前缀和,另前缀和数组为s[i]我们开一个数组v[i],记录在前缀和数组中数值i出现的次数. 然后我们可以得到这样一个式子 (据说看到这个式子就是套路了) 然后我们对这…
题意: N个数,找出第二大的数.如果没有输出-1. 思路: UNIQUE的使用. 代码: int a[105]; int n; int main(){ cin>>n; rep(i,0,n-1) cin>>a[i]; sort(a,a+n); int t=unique(a,a+n)-a; //unique只是把重复的数放到了数组的后部分 if(t<2) puts("NO"); else print("%d\n",a[1]); return…
Selection: selection is a trivial problem if the input numbers are sorted. If we use a sorting algorithm having O(nlgn) worst case running time, then the selection problem can be solved in O(nlgn) time. But using a sorting is more like using a cannon…