786.第k个数
#include <iostream>using namespace std;const int N = 100010;int q[N];int quick_sort(int q[], int l, int r, int k)
{if (l >= r) return q[l];int i = l - 1, j = r + 1, x = q[l + r >> 1];while (i < j){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}if (j - l + 1 >= k) return quick_sort(q, l, j, k);else return quick_sort(q, j + 1, r, k - (j - l + 1));
}int main()
{int n, k;scanf("%d%d", &n, &k);for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);cout << quick_sort(q, 0, n - 1, k) << endl;return 0;
}
788.逆序对的数量
#include <iostream>using namespace std;typedef long long LL;const int N = 1e5 + 10;int a[N], tmp[N];LL merge_sort(int q[], int l, int r)
{if (l >= r) return 0;int mid = l + r >> 1;LL res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r)if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];else{res += mid - i + 1;tmp[k ++ ] = q[j ++ ];}while (i <= mid) tmp[k ++ ] = q[i ++ ];while (j <= r) tmp[k ++ ] = q[j ++ ];for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];return res;
}int main()
{int n;scanf("%d", &n);for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);cout << merge_sort(a, 0, n - 1) << endl;return 0;
}