#define _crt_secure_no_warnings
#include#include#include#includeusing namespace std;
#define max 100011
#define ls rt<<1
#define rs ls|1
#define m (l+r)>>1
int tree[30][max];
int sorted[max];
int toleft[30][max];//標記每一層當中,從1到該位置有多少個被分到了左端。
void build(int l, int r, int dep)
else
tree[dep + 1][rpos++] = tree[dep][i];//不能放到左邊的自然被放到左邊了
toleft[dep][i] = toleft[dep][l - 1] + lpos - l;//從1到該位置有多少個被分到了左端
}build(l, mid, dep + 1);
build(mid + 1, r, dep + 1);
}//l,r是小區間,l,r是大區間
int query(int l, int r, int l, int r, int dep, int k)
else
}int main()
sort(sorted+1, sorted+1 + n);
build(1, n, 0);
int a, b, c;
while (k--)
}return 0;
}
快速排序(求第k小的數)
快排是利用的partition演算法,基本思想是從第乙個數開始,利用partition演算法將這個數在有序序列中的位置找到,這個數的左邊部分都是小於它的數,右邊部分都是大於他的數,然後通過分治的方法對左右兩個區間再進行partition操作,partition演算法 如下 int partition...
第k小的數
輸入n個整數和乙個正整數k 1 k n 輸出這些整數從小到大排序後的第k個 思路1 最容易想到的方法 先對這個序列從小到大排序,然後輸出前面的最小的k個數即可。如果選擇快速排序法來進行排序,則時間複雜度 o n logn class solution 時間複雜度o nlogn 思路2 在思路1的基礎...
第k小的數
time limit 5000 ms memory limit 65536 kib problem description 現有乙個包含n個整數 1 n 10000000 的無序序列 保證序列內元素各不相同 輸入乙個整數k 1 k n 請用較快的方式找出該序列的第k小數並輸出。input 多組輸入。...