Advertisement
Guest User

Untitled

a guest
Oct 18th, 2016
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int kMaxN = 500005;
  5.  
  6. long long answer = 0;
  7. int A[kMaxN];
  8. int I[kMaxN], Max[kMaxN], Norm[kMaxN];
  9. int T[kMaxN], Val[kMaxN];
  10.  
  11. bool bit;
  12. int n;
  13.  
  14. void Add(int pos, int d) {
  15.     for(; pos; pos -= (pos & -pos))
  16.         T[pos] += d;
  17. }
  18. int Query(int pos) {
  19.     int s = 0;
  20.     for(; pos <= n; pos += (pos & -pos))
  21.         s += T[pos];
  22.     return s;
  23. }
  24.  
  25. void Count(int b1, int e1, int b2, int e2, bool bit) {
  26.     sort(I + b2, I + e2, [](int a, int b) {
  27.         return 1LL * Val[Max[a]] * A[b] > 1LL * Val[Max[b]] * A[a];
  28.     });
  29.     sort(I + b1, I + e1, [](int a, int b) {
  30.         return A[a] > A[b];
  31.     });
  32.    
  33.     int j = b2;
  34.     for(int i = b1; i < e1; ++i) {        
  35.         int ind_left = I[i];
  36.        
  37.         while(j < e2) {
  38.             int ind_right = I[j];
  39.             if(1LL * A[ind_left] * A[ind_right] <= Val[Max[ind_right]]) {                
  40.                 Add(Max[ind_right], 1);
  41.                 ++j;    
  42.             }
  43.             else break;
  44.         }
  45.         int now = Query(Max[ind_left] + bit);
  46.         answer += now;
  47.     }
  48.     for(int i = b2; i < j; ++i)
  49.         Add(Max[I[i]], -1);
  50.  
  51. }
  52.  
  53. void Solve(int l, int r) {
  54.     if(l + 1 >= r) return;
  55.    
  56.     int m = (l + r) / 2;
  57.     Solve(l, m);
  58.     Solve(m, r);
  59.    
  60.    
  61.     for(int i = m; i < r; ++i) {
  62.         Max[i] = Norm[i];
  63.         if(i > m) Max[i] = max(Max[i], Max[i - 1]);
  64.     }
  65.    
  66.     for(int i = m - 1; i >= l; --i) {
  67.         Max[i] = Norm[i];
  68.         if(i < m - 1) Max[i] = max(Max[i], Max[i + 1]);
  69.     }
  70.    
  71.     Count(l, m, m, r, 0);
  72.     Count(m, r, l, m, 1);
  73. }
  74.  
  75. void Read(int &a) {
  76.     char c;
  77.     for(c = getchar(); !isdigit(c); c = getchar());
  78.     for(a = 0; isdigit(c); c = getchar())
  79.         a = (a << 1) + (a << 3) + c - '0';
  80. }
  81.  
  82. int main() {
  83.     Read(n);
  84.    
  85.    
  86.     map<int, int> Map;
  87.     for(int i = 0; i < n; ++i) {
  88.         Read(A[i]);
  89.         Map[A[i]] += 1;
  90.     }
  91.    
  92.     int cnt = 0;
  93.     for(auto &p : Map) {
  94.         p.second = ++cnt;
  95.         Val[cnt] = p.first;
  96.     }
  97.    
  98.     for(int i = 0; i < n; ++i) {
  99.         Norm[i] = Map[A[i]];
  100.         I[i] = i;
  101.     }
  102.    
  103.     Solve(0, n);
  104.    
  105.     cout << answer << endl;
  106.    
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement