Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <math.h>
  5. #include <string>
  6. #include <set>
  7. #include <cstdio>
  8. #include <iomanip>
  9. #include <map>
  10. #include <stdio.h>
  11. #include <math.h>
  12. #include <queue>
  13. #include <random>
  14. #define int long long
  15. using namespace std;
  16. #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
  17.  
  18.  
  19. int gcd(int a, int b) { return b ? a : gcd(b, a % b); }
  20.  
  21. int toNum(char s) {
  22. return s - 'a';
  23. }
  24.  
  25. const int inf = 1 << 31 - 1;
  26. const int cock = 100002;
  27. //#pragma GCC optimize("Ofast")
  28. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  29.  
  30. pair<int,int> tree[ cock * 4];
  31. int a[100002];
  32. int n,k;
  33.  
  34. void build(int v, int left, int right) {
  35. if (left + 1 == right)
  36. tree[v] = { 1,a[left] };
  37. else {
  38. int mid = (left + right) / 2;
  39. build(2 * v, left, mid);
  40. build(2 * v + 1, mid, right);
  41. tree[v] = { tree[2 * v].first + tree[2 * v + 1].first,min(tree[2 * v].second,tree[2 * v + 1].second )};
  42. }
  43.  
  44. }
  45.  
  46. int sum(int v, int left,int right, int l, int r) {
  47. if (l <= left && right <= r)
  48. return tree[v].first;
  49. if (right <= l || r <= left)
  50. return 0;
  51. int mid = (left + right) / 2;
  52. return sum(v * 2, left, mid, l, r) + sum(2 * v + 1, mid, right, l, r);
  53. }
  54.  
  55. int min_pos(int v, int left, int right) {
  56. if (left + 1 == right)
  57. return left;
  58. int mid = (left + right) / 2;
  59. if (tree[2 * v].second == tree[v].second)
  60. min_pos(v * 2, left, mid);
  61. else
  62. min_pos(v * 2 + 1, mid, right);
  63. }
  64.  
  65. void update(int v, int left, int right, int pos) {
  66. if (left + 1 == right) {
  67. tree[v] = { 0,inf };
  68. return;
  69. }
  70. int mid = (left + right) / 2;
  71. if (pos < mid)
  72. update(2 * v, left, mid, pos);
  73. else
  74. update(2 * v + 1, mid, right, pos);
  75. tree[v] = { tree[2 * v].first + tree[2 * v + 1].first,min(tree[2 * v].second,tree[2 * v + 1].second) };
  76.  
  77. }
  78.  
  79. void input() {
  80. cin >> n;
  81. for (int i = 0; i < n; i++)
  82. cin >> a[i];
  83. build(1, 0, n);
  84. }
  85.  
  86. void solve() {
  87. int cnt = 0;
  88. do {
  89. int s = min_pos(1, 0, n);
  90. if (s == 0)
  91. cnt++;
  92. else
  93. cnt += sum(1, 0, n, 0, s);
  94. update(1, 0, n, s);
  95. } while (tree[1].first != 0);
  96. cout << cnt;
  97. }
  98.  
  99.  
  100. unsigned main() {
  101. //freopen("exam.in", "r", stdin);
  102. //freopen("exam.out", "w", stdout);
  103.  
  104. IOS;
  105. input();
  106. solve();
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement