Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. #define MAXN 112345
  7.  
  8. long long seg[4*MAXN];
  9. int v[MAXN];
  10. long long n,ans,ai;
  11. /**
  12. * Na função build é onde é realizada a construção da segment tree
  13. * Os parametros são no - sendo o no na seg tree que eu estou
  14. * l, r - sendo [l, r] o intervalo do vetor v
  15. */
  16.  
  17. void build(int no, int l, int r) {
  18. if(l == r) {
  19. seg[no] = v[l];
  20. return;
  21. }
  22. int mid = (l+r)/2;
  23. build(no*2,l, mid);
  24. build(no*2 + 1,mid+1, r);
  25. seg[no] = seg[no*2] + seg[no*2+1];
  26. }
  27.  
  28. /**
  29. * Na função update é onde é realizado o update de um valor da seg tree
  30. * Os parametros são no - sendo o no na seg tree que eu estou,
  31. * l, r - sendo [l, r] o intervalo do vetor v,
  32. * p - a posição onde eu quero modificar o vetor
  33. * x - o valor que eu desejo colocar na posição p
  34. */
  35.  
  36. void update(int no, int l, int r, int p, int x) {
  37. if(l > p || r < p)
  38. return;
  39. if(l == r && l == p) {
  40. seg[no] = x;
  41. return;
  42. }
  43. int mid = (l+r)/2;
  44. update(no*2, l, mid, p, x);
  45. update(no*2 +1, mid+1, r, p, x);
  46. seg[no] = seg[no*2] + seg[no*2+1];
  47. }
  48.  
  49. /**
  50. * Na função querry é onde é realizado a consulta de um intervalo na seg tree
  51. * Os parametros são no - sendo o no na seg tree que eu estou,
  52. * l, r - sendo [l, r] o intervalo do vetor v,
  53. * i, j - sendo [i, j] o intervalo em que eu queria saber o valor da seg tree
  54. */
  55.  
  56. long long query(int no, int l, int r, int i, int j) {
  57. if(l > j || r < i) {
  58. return 0;
  59. }
  60. if(l >= i && r <= j) {
  61. return seg[no];
  62. }
  63. int mid = (l+r)/2;
  64. long long res1 = query(no*2, l, mid, i, j);
  65. long long res2 = query(no*2+1, mid+1, r, i, j);
  66. return res1+res2;
  67. }
  68.  
  69. int main() {
  70. cin >> n;
  71. build(1,0,n-1);
  72. ans = 0;
  73. vector<long long> vec;
  74. long long arr[n];
  75. for(int i=0;i<n;i++){
  76. cin >> ai;
  77. vec.push_back(ai);
  78. arr[i] = ai;
  79. }
  80. sort(vec.begin(),vec.end());
  81. reverse(vec.begin(),vec.end());
  82. for(int i=0;i<n;i++){
  83. //ans += query(1, 0, n-1, vec[i], n-1);
  84. ans += query(1, 0, n-1, vec[i], n-1);
  85. update(1, 0, n-1, i, vec[i]);
  86. }
  87. cout << ans << endl;
  88. return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement