fork download
  1. // ROOT : DRAGON3012009 : Wa In Real Life
  2. #include <bits/stdc++.h>
  3. #define ll int
  4. #define el "\n"
  5. #define _ROOT_ int main()
  6. #define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
  7. #define FORD(i,r,l) for(int i = r ; i >= l ; i --)
  8. #define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
  9. #define fi first
  10. #define se second
  11. #define M 1000000007
  12. #define MAXN 1000001
  13. #define OFFSET 500000
  14. #define INF (1ll<<60)
  15. #define BLOCK 425
  16. #define NAME "file"
  17. #define debug(a) cerr << #a << " = " << a << endl ;
  18. #define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
  19. using namespace std;
  20. const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
  21. const ll NMOD = 1;
  22.  
  23. ll n, q ;
  24. ll a[MAXN];
  25. ll cnt[MAXN ] ;
  26. ll freg[MAXN ] ;
  27. ll cur[MAXN ] ;
  28. vector<ll> cpr ;
  29.  
  30. void init()
  31. {
  32. cin >> n ;
  33. FOR(i, 1, n ) cin >> a[i] ;
  34. FOR(i, 1, n ) cpr.push_back(a[i]) ;
  35. compare(cpr ) ;
  36. FOR(i, 1, n ) a[i] = lower_bound(cpr.begin(), cpr.end(), a[i] ) - cpr.begin() + 1 ;
  37. }
  38.  
  39. void solve()
  40. {
  41. long long ans = 0 ;
  42. FOR(i, 1, n ) cnt[a[i]] ++ ;
  43. ll val = cpr.size() ;
  44. FOR(value, 1, val )
  45. {
  46. if(cnt[value ] < BLOCK ) continue ;
  47. ll tot = 0 ;
  48. ll sum = 0 ;
  49. ll ex = 0 ;
  50. freg[OFFSET ] = 1 ;
  51. FOR(i, 1, n )
  52. {
  53. if(a[i] == value )
  54. {
  55. sum ++ ;
  56.  
  57. tot += freg[OFFSET + sum - 1] ;
  58. ans += tot ;
  59. ex += tot ;
  60. }
  61. else if(a[i] != value )
  62. {
  63. sum -- ;
  64. tot -= freg[OFFSET + sum ] ;
  65. ans += tot ;
  66. ex += tot ;
  67. }
  68. freg[sum + OFFSET ] ++ ;
  69. // debug(tot ) ;
  70. // debug(value ) ;
  71. }
  72. // debug(ex ) ;
  73. sum = 0 ;
  74. freg[OFFSET ] = 0 ;
  75. FOR(i, 1, n )
  76. {
  77. if(a[i] == value ) sum ++ ;
  78. else sum -- ;
  79. freg[OFFSET + sum ] = freg[OFFSET + sum - 1 ] = freg[OFFSET + sum + 1 ] = 0 ;
  80. }
  81. }
  82.  
  83.  
  84. FOR(i, 1, n )
  85. {
  86. ll lim = i + 2 * BLOCK ;
  87. lim = min(lim, n ) ;
  88. pair<ll,ll> fr = {0, 0 } ;
  89. FOR(j, i, lim )
  90. {
  91. cur[a[j]] ++ ;
  92. fr = max(fr, {cur[a[j]], a[j] }) ;
  93. if(cnt[fr.se ] < BLOCK && fr.fi * 2 > j - i + 1 ) ans ++ ;
  94. }
  95. FOR(j, i, lim ) cur[a[j]] = 0 ;
  96.  
  97. }
  98. cout << ans << el ;
  99. }
  100.  
  101. _ROOT_
  102. {
  103. // freopen(NAME".inp" , "r" , stdin);
  104. // freopen(NAME".out" , "w", stdout) ;
  105. ios_base::sync_with_stdio(0);
  106. cin.tie(0);
  107. cout.tie(0);
  108. int t = 1; // cin >> t ;
  109. while(t--)
  110. {
  111. init();
  112. solve();
  113. }
  114. return (0&0);
  115. }
  116.  
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
0