fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MAXN = 500000;
  5. int n;
  6. int a[MAXN+5];
  7. unordered_map<int,int> freq;
  8. vector<int> pos[MAXN+5];
  9.  
  10. int main(){
  11. ios::sync_with_stdio(false);
  12. cin.tie(nullptr);
  13.  
  14. cin >> n;
  15. for(int i=1;i<=n;i++){
  16. cin >> a[i];
  17. freq[a[i]]++;
  18. pos[a[i]].push_back(i);
  19. }
  20.  
  21. long long total = 1LL * n * (n+1) / 2;
  22. int B = sqrt(n);
  23.  
  24. // xử lý light
  25. long long bad = 0;
  26. for(auto &p: freq){
  27. int x = p.first, f = p.second;
  28. if(f > B) continue;
  29. auto &vec = pos[x];
  30. vec.insert(vec.begin(),0);
  31. vec.push_back(n+1);
  32. for(int i=1;i+f<= (int)vec.size()-1; i++){
  33. int L = vec[i-1]+1;
  34. int R = vec[i+f]-1;
  35. int midL = vec[i];
  36. int midR = vec[i+f-1];
  37. long long left = midL - L + 1;
  38. long long right = R - midR + 1;
  39. bad += left * right;
  40. }
  41. }
  42.  
  43. // xử lý heavy
  44. vector<int> heavy;
  45. for(auto &p: freq){
  46. if(p.second > B) heavy.push_back(p.first);
  47. }
  48.  
  49. for(int x: heavy){
  50. vector<int> S(n+1,0);
  51. for(int i=1;i<=n;i++){
  52. if(a[i]==x) S[i] = S[i-1]+1;
  53. else S[i] = S[i-1]-1;
  54. }
  55.  
  56. unordered_map<int,int> cnt;
  57. cnt.reserve(2*n);
  58. cnt.max_load_factor(0.7);
  59. cnt[0]=1;
  60.  
  61. long long cur=0;
  62. for(int i=1;i<=n;i++){
  63. if(S[i]==S[i-1]+1){
  64. cur += cnt[S[i]];
  65. }else{
  66. cur -= cnt[S[i]];
  67. }
  68. bad += cur;
  69. cnt[S[i]]++;
  70. }
  71. }
  72.  
  73. cout << total - bad << "\n";
  74. return 0;
  75. }
  76.  
Success #stdin #stdout 0.01s 16348KB
stdin
5
1 1 3 2 2
stdout
-2