fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define FOR(i, a, b) for(int i = (a); i <= (b); ++i)
  5. #define FORD(i, a, b) for(int i = (a); i >= (b); --i)
  6. #define sz(a) (int)(a).size()
  7. #define all(a) (a).begin(), (a).end()
  8. #define bit(s, i) (((s) >> (i)) & 1)
  9. #define ii pair <int, int>
  10. #define fi first
  11. #define se second
  12. #define ll long long
  13. #define eb emplace_back
  14. #define pb push_back
  15. #define __builtin_popcount __builtin_popcountll
  16.  
  17. template <class X, class Y>
  18. bool maxi(X &x, Y y) {
  19. if(x < y) {
  20. x = y;
  21. return true;
  22. }
  23. return false;
  24. }
  25.  
  26. template <class X, class Y>
  27. bool mini(X &x, Y y) {
  28. if(x > y) {
  29. x = y;
  30. return true;
  31. }
  32. return false;
  33. }
  34.  
  35. void solve();
  36. int32_t main() {
  37. #define task "test"
  38. if(fopen(task".inp", "r")){
  39. freopen(task".inp", "r", stdin);
  40. freopen(task".out", "w", stdout);
  41. }
  42. cin.tie(0)->sync_with_stdio(0);
  43.  
  44. int tc = 1; //cin >> tc;
  45. FOR(i, 1, tc){
  46. solve();
  47. }
  48. }
  49.  
  50. const int N=3e5+5;
  51. const int LG=18;
  52.  
  53. int n,a[N],l[N],r[N],mx[N][LG+1];
  54.  
  55. int get(int L, int R){
  56. int lg=__lg(R-L+1);
  57. return max(mx[L][lg],mx[R-(1<<lg)+1][lg]);
  58. }
  59.  
  60. ll calc(int L, int M, int R, int vL, int vR){
  61. auto findL = [&](int val, int t)->int{
  62. int lb=L, rb=M, res=M+1;
  63. while(lb<=rb){
  64. int mb=(lb+rb)>>1;
  65. if(get(mb,M)<=val-t){
  66. res=mb;
  67. rb=mb-1;
  68. }
  69. else{
  70. lb=mb+1;
  71. }
  72. }
  73. return res;
  74. };
  75. auto findR = [&](int val, int t)->int{
  76. int lb=M, rb=R, res=M-1;
  77. while(lb<=rb){
  78. int mb=(lb+rb)>>1;
  79. if(get(M,mb)<=val-t){
  80. res=mb;
  81. lb=mb+1;
  82. }
  83. else{
  84. rb=mb-1;
  85. }
  86. }
  87. return res;
  88. };
  89.  
  90. int l1=findL(vR,0), l2=findL(vL,1)-1, r1=findR(vL,1)+1, r2=findR(vR,0);
  91. // cout<<l1<<" "<<l2<<" "<<r1<<" "<<r2<<'\n';
  92. return 1LL*(l2-l1+1)*(r2-M+1) + 1LL*(M-l2)*(r2-r1+1);
  93. }
  94.  
  95. void solve() {
  96. cin>>n;
  97. FOR(i,1,n) cin>>a[i];
  98. FOR(i,1,n){
  99. l[i]=i-1;
  100. while(l[i]>0&&a[l[i]]>a[i]) l[i]=l[l[i]];
  101. }
  102. FORD(i,n,1){
  103. r[i]=i+1;
  104. while(r[i]<=n&&a[r[i]]>a[i]) r[i]=r[r[i]];
  105. }
  106.  
  107. FOR(i,1,n) mx[i][0]=a[i];
  108. for(int i=1; 1<<i <=n; ++i){
  109. for(int j=1; j+(1<<i)-1 <= n; ++j){
  110. mx[j][i]=max(mx[j][i-1],mx[j+(1<<(i-1))][i-1]);
  111. }
  112. }
  113.  
  114. ll res=0;
  115. FOR(i,1,n){
  116. for(int d=1; d*a[i]<N; ++d){
  117. ll tmp=calc(l[i]+1,i,r[i]-1,a[i]*d,a[i]*(d+1)-1);
  118. // cout<<a[i]<<" "<<d<<" "<<tmp<<'\n';
  119. res=res+tmp*d;
  120. }
  121. }
  122. cout<<res<<'\n';
  123. // int tmp=calc(1,3,5,5,5);
  124. // cout<<tmp<<'\n';
  125. }
  126.  
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
0