Advertisement
Manioc

459D

Apr 15th, 2018
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 1000007
  3. #define k 20
  4. using namespace std;
  5.  
  6. map<int, int> valores;
  7. int n;
  8. int arr[MAX], passou[MAX];
  9. int table[k][MAX];
  10.  
  11. void generate(){
  12.     for(int i = 1; i <= k; i++){
  13.         for(int j = 0; j + (1 << i) <= n; j++){
  14.             table[i][j] = table[i-1][j] + table[i-1][j  + (1 << (i-1))];
  15.         }
  16.     }
  17. }
  18.  
  19. long long int resp(int l){
  20.     long long int sum = 0;
  21.     for(int i = k; i >= 0; i--){
  22.         if((1 << i) <= n-l+1){
  23.             sum += table[i][l];
  24.             l += 1 << i;
  25.         }
  26.     }
  27.  
  28.     return sum;
  29. }
  30.  
  31. int main(){
  32.     scanf("%d", &n);
  33.     for(int i = 0; i < n; i++){
  34.         scanf("%d", &arr[i]);
  35.         //cout << valores[arr[i]] << " ";
  36.         table[0][++valores[arr[i]]]++;
  37.         //cout << valores[arr[i]] << endl;
  38.     }
  39.     generate();
  40.  
  41.     long long int ans = 0;
  42.     for(int i = 0; i < n; i++) {
  43.         //cout << valores[arr[i]] << " ";
  44.         if(!passou[valores[arr[i]]]) {
  45.             passou[valores[arr[i]]] = true;
  46.             ans += resp(1 + valores[arr[i]]);
  47.         }
  48.         valores[arr[i]]--;
  49.         //cout << ans << endl;
  50.     }
  51.  
  52.     printf("%lld\n", ans);
  53.     return 0;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement