Advertisement
matheus_monteiro

Weird Sum

Aug 25th, 2022
738
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5.  
  6. const int ms = 100003;
  7.  
  8. vector<int> xBucket[ms];
  9. vector<int> xPsum[ms];
  10.  
  11. vector<int> yBucket[ms];
  12. vector<int> yPsum[ms];
  13.  
  14. int32_t main() {
  15.    
  16.     int n, m;
  17.     cin >> n >> m;
  18.  
  19.     vector< vector<int> > M(n, vector<int>(m));
  20.    
  21.     for(int i = 0; i < n; ++i) {
  22.         for(int j = 0; j < m; ++j) {
  23.             cin >> M[i][j];
  24.             xBucket[ M[i][j] ].push_back(i);
  25.             xPsum[ M[i][j] ].push_back(0);
  26.  
  27.             yBucket[ M[i][j] ].push_back(j);
  28.             yPsum[ M[i][j] ].push_back(0);
  29.         }
  30.     }
  31.  
  32.     for(int i = 0; i < ms; ++i) {
  33.         sort(xBucket[i].begin(), xBucket[i].end());
  34.         sort(yBucket[i].begin(), yBucket[i].end());
  35.     }
  36.  
  37.     for(int i = 0; i < ms; ++i) {
  38.         for(int j = 0; j < xBucket[i].size(); ++j) {
  39.             if(!j) xPsum[i][j] = xBucket[i][j];
  40.             else xPsum[i][j] = xBucket[i][j] + xPsum[i][j - 1];
  41.         }
  42.     }
  43.  
  44.     for(int i = 0; i < ms; ++i) {
  45.         for(int j = 0; j < yBucket[i].size(); ++j) {
  46.             if(!j) yPsum[i][j] = yBucket[i][j];
  47.             else yPsum[i][j] = yBucket[i][j] + yPsum[i][j - 1];
  48.         }
  49.     }
  50.  
  51.     int answer = 0;
  52.  
  53.     auto updAnsX = [&](int i, int j) {
  54.         int x = M[i][j];
  55.         auto it = upper_bound(xBucket[x].begin(), xBucket[x].end(), i);
  56.         if(it == xBucket[x].begin()) { 
  57.             answer += xPsum[x].back() - xPsum[x].size() * i;
  58.         } else if(it == xBucket[x].end()) {
  59.             answer += xPsum[x].size() * i - xPsum[x].back();
  60.         } else {   
  61.             int p = it - xBucket[x].begin() - 1;
  62.             answer += (p + 1) * i - xPsum[x][p];
  63.             answer += (xPsum[x].back() - xPsum[x][p]) - ((int)xBucket[x].size() - p - 1) * i;
  64.         }
  65.     };
  66.  
  67.     auto updAnsY = [&](int i, int j) {
  68.         int y = M[i][j];
  69.         auto it = upper_bound(yBucket[y].begin(), yBucket[y].end(), j);
  70.         if(it == yBucket[y].begin()) { 
  71.             answer += yPsum[y].back() - yPsum[y].size() * j;
  72.         } else if(it == yBucket[y].end()) {
  73.             answer += yPsum[y].size() * j - yPsum[y].back();
  74.         } else {   
  75.             int p = it - yBucket[y].begin() - 1;
  76.             answer += (p + 1) * j - yPsum[y][p];
  77.             answer += (yPsum[y].back() - yPsum[y][p]) - ((int)yBucket[y].size() - p - 1) * j;
  78.         }
  79.     };
  80.  
  81.     for(int i = 0; i < n; ++i) {
  82.         for(int j = 0; j < m; ++j) {
  83.             updAnsX(i, j);
  84.             updAnsY(i, j);
  85.         }
  86.     }
  87.  
  88.     answer /= 2;
  89.    
  90.     cout << answer << endl;
  91.  
  92.     return 0;
  93. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement