HDU 2665 求第k小的數

2021-06-29 11:33:09 字數 825 閱讀 2168

#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 多組輸入。...