Advertisement
a53

Bisortare

a53
Dec 26th, 2021
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct bit {
  4. vector<int> b;
  5. void resize(int n) {
  6. b.resize(n);
  7. }
  8. void clear() {
  9. b = vector<int>(b.size());
  10. }
  11. void update(int p, int val) {
  12. int n = b.size() - 1;
  13. for (int i = p; i <= n; i += i & (-i)) {
  14. b[i] += val;
  15. }
  16. }
  17. int query(int p) {
  18. int ans = 0;
  19. for (int i = p; i >= 1; i -= i & (-i)) {
  20. ans += b[i];
  21. }
  22. return ans;
  23. }
  24. };
  25. int main() {
  26. std::ios_base::sync_with_stdio(false);
  27. cin.tie(nullptr);
  28. int c, n, k;
  29. cin >> c >> n >> k;
  30. vector<int> a(n + 1);
  31. for (int i = 1; i <= n; ++i) {
  32. cin >> a[i];
  33. }
  34. bit tree;
  35. tree.resize(n + 1);
  36. vector<int> st(n + 1);
  37. for (int i = 1; i <= n; ++i) {
  38. st[i] = tree.query(a[i] - 1);
  39. tree.update(a[i], 1);
  40. }
  41. tree.clear();
  42. vector<int> dr(n + 1);
  43. for (int i = n; i >= 1; --i) {
  44. dr[i] = tree.query(a[i] - 1);
  45. tree.update(a[i], 1);
  46. }
  47. long long ops = 0;
  48. multiset<int,greater<int>> delta;
  49. for (int i = 1; i <= n; ++i) {
  50. ops += dr[i];
  51. if (a[i] != 1) {
  52. delta.insert(dr[i] - st[i]);
  53. }
  54.  
  55. }
  56. vector<long long> ans(n + 1);
  57. ans[1] = ops;
  58. for (int i = 2; i <= n; ++i) {
  59. int mini = *delta.begin();
  60. delta.erase(delta.begin());
  61. ops -= mini;
  62. ans[i] = ops;
  63. }
  64. if (c == 1) {
  65. cout << ans[k];
  66. return 0;
  67. }
  68. for (int i = 1; i <= n; ++i) {
  69. cout << ans[i] << ' ';
  70. }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement