fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4.  
  5. struct Fenwick {
  6. int n; vector<int> bit;
  7. Fenwick(int n=0){init(n);}
  8. void init(int n_){ n=n_; bit.assign(n+1,0); }
  9. void add(int i,int v){ for(;i<=n;i+=i&-i) bit[i]+=v; }
  10. int sumPrefix(int i){ int s=0; for(;i>0;i-=i&-i) s+=bit[i]; return s; }
  11. };
  12.  
  13. int main(){
  14. ios::sync_with_stdio(false);
  15. cin.tie(nullptr);
  16. int N; cin>>N;
  17. vector<int>A(N+1); int maxA=0;
  18. for(int i=1;i<=N;i++){cin>>A[i]; maxA=max(maxA,A[i]);}
  19. vector<vector<int>>pos(maxA+1);
  20. for(int i=1;i<=N;i++) pos[A[i]].push_back(i);
  21. const int B=700;
  22. ll total=(ll)N*(N+1)/2;
  23. ll bad=0;
  24. for(int val=1;val<=maxA;val++){
  25. int k=pos[val].size();
  26. if(k<=B) continue;
  27. vector<int>S(N+1);
  28. for(int i=1;i<=N;i++) S[i]=S[i-1]+(A[i]==val?1:-1);
  29. vector<int>comp=S; sort(comp.begin(),comp.end());
  30. comp.erase(unique(comp.begin(),comp.end()),comp.end());
  31. Fenwick fw(comp.size()+2);
  32. for(int i=0;i<=N;i++){
  33. int id=lower_bound(comp.begin(),comp.end(),S[i])-comp.begin()+1;
  34. bad+=fw.sumPrefix(id-1);
  35. fw.add(id,1);
  36. }
  37. }
  38. for(int val=1;val<=maxA;val++){
  39. int k=pos[val].size();
  40. if(k==0||k>B) continue;
  41. vector<int>p; p.push_back(0);
  42. for(int x:pos[val]) p.push_back(x);
  43. p.push_back(N+1);
  44. for(int t=1;t<=k;t++){
  45. for(int i=1;i+t-1<=k;i++){
  46. int left_prev=p[i-1], left_first=p[i];
  47. int right_last=p[i+t-1], right_next=p[i+t];
  48. int Lstart=left_prev+1, Lend=left_first;
  49. if(Lstart>Lend) continue;
  50. int Rmin=right_last, Rmax_cap=right_next-1;
  51. if(Rmin>Rmax_cap) continue;
  52. ll Cconst=2LL*t-1-Rmin;
  53. int D=Rmax_cap-(2*t-2);
  54. int L1=max(Lstart,Rmin-(2*t-2)), L2=min(Lend,D);
  55. ll sum=0;
  56. if(L1<=L2){
  57. ll cnt=L2-L1+1;
  58. ll sumL=(ll)(L1+L2)*cnt/2;
  59. sum+=sumL+cnt*Cconst;
  60. }
  61. int L3=max(Lstart,D+1), L4=Lend;
  62. if(L3<=L4){
  63. ll cnt=L4-L3+1;
  64. ll valR=Rmax_cap-Rmin+1;
  65. if(valR>0) sum+=cnt*valR;
  66. }
  67. if(sum>0) bad+=sum;
  68. }
  69. }
  70. }
  71. cout<<total-bad<<"\n";
  72. }
  73.  
Success #stdin #stdout 0.01s 5336KB
stdin
4
2 1 1 3
stdout
3