Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int DIM = 200010;
  5. const long long int INF= 1000000000;
  6. struct TreeNode{
  7. long long kp=0,sump=0;
  8. };
  9. long long int n,l,r,sum=0,a[DIM],modv[4*DIM+10]={0};
  10. TreeNode t[4*DIM];
  11. long long next1[DIM];
  12. map<long long ,long long >m;
  13. void BuildTree(int v,int tl,int tr)
  14. {
  15. /*if(tl==tr)t[v].sump=0;
  16. else{
  17. int tm=(tl+tr)/2;
  18. BuildTree(2*v+1, tl, tm);
  19. BuildTree(2*v+2, tm+1, tr);
  20. //t[v].sump = t[2*v+1].sump + t[2*v+2].sump;
  21. }*/
  22. //for(int i=0;i<=4*DIM)modv[i]=INF;
  23. }
  24. long long SumTree(int v,int tl,int tr,int ll,int rr)
  25. {
  26. if(ll <= tl && tr<=rr) return t[v].sump;
  27. if(rr < tl || tr < ll) return 0;
  28. int tm = (tl+tr) / 2;
  29. return SumTree(2*v+1,tl,tm,ll,rr) + SumTree(2*v+2, tm+1, tr, ll, rr);
  30. }
  31. void AddInterval(int v,int tl,int tr,int ll,int rr)
  32. {
  33. if(ll <= tl && tr<=rr){
  34. t[v].kp++;
  35. t[v].sump=tr-tl+1;
  36. return;
  37. }
  38. if(rr<tl || tr<ll)return;
  39. int tm=(tl+tr)/2;
  40.  
  41. AddInterval(2*v+1,tl,tm,ll,rr);
  42. AddInterval(2*v+2,tm+1,tr,ll,rr);
  43.  
  44. }
  45. void DeleteInterval(int v,int tl,int tr,int ll,int rr)
  46. {
  47. if(ll <= tl && tr<=rr){
  48. if(t[v].kp==1)
  49. {
  50. t[v].kp--;
  51. t[v].sump=t[2*v+1].sump+t[2*v+2].sump;
  52.  
  53. }
  54. else if(t[v].kp!=0)
  55. {
  56. t[v].kp--;
  57.  
  58. }
  59. return;
  60.  
  61. }
  62. if(rr<tl || tr<ll)return;
  63. int tm=(tl+tr)/2;
  64. DeleteInterval(2*v+1,tl,tm,ll,rr);
  65. DeleteInterval(2*v+2,tm+1,tr,ll,rr);
  66. if(t[v].kp==0)
  67. t[v].sump=t[2*v+1].sump+t[2*v+2].sump;
  68.  
  69. }
  70. int main()
  71. {
  72. long long res=0;
  73. scanf("%lld",&n);
  74. for(int i=1;i<=n;i++)
  75. {
  76. scanf("%lld",&a[i]);
  77. next1[i]=n+1;
  78. }
  79.  
  80. for(int i=n;i>=1;i--)
  81. {
  82. if(m[a[i]]!=0)next1[i]=m[a[i]];
  83. m[a[i]]=i;
  84. }
  85. m.clear();
  86. for(int i=1;i<=n;i++)
  87. {
  88. if(m[a[i]]==0)
  89. {
  90. AddInterval(0,1,n,i,next1[i]-1);
  91. m[a[i]]=1;
  92. }
  93.  
  94.  
  95. }
  96.  
  97. res+=n-SumTree(0,1,n,1,n);
  98. for(int i=2;i<=n;i++)
  99. {
  100. DeleteInterval(0,1,n,i-1,next1[i-1]-1);
  101. AddInterval(0,1,n,next1[i],next1[next1[i]]);
  102. res+=n-i-SumTree(0,1,n,1,n);
  103. }
  104. printf("%lld",res);
  105.  
  106.  
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement