Advertisement
elkcl

alloc

Jan 6th, 2022
544
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <bits/stdc++.h>
  2.  
  3. #pragma GCC optimize("Ofast")
  4. #pragma GCC optimize("O3")
  5. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2")
  6. using namespace std;
  7. typedef long long ll;
  8. typedef long double ld;
  9.  
  10. /*
  11. ⣿⣿⣷⡁⢆⠈⠕⢕⢂⢕⢂⢕⢂⢔⢂⢕⢄⠂⣂⠂⠆⢂⢕⢂⢕⢂⢕⢂⢕⢂
  12. ⣿⣿⣿⡷⠊⡢⡹⣦⡑⢂⢕⢂⢕⢂⢕⢂⠕⠔⠌⠝⠛⠶⠶⢶⣦⣄⢂⢕⢂⢕
  13. ⣿⣿⠏⣠⣾⣦⡐⢌⢿⣷⣦⣅⡑⠕⠡⠐⢿⠿⣛⠟⠛⠛⠛⠛⠡⢷⡈⢂⢕⢂
  14. ⠟⣡⣾⣿⣿⣿⣿⣦⣑⠝⢿⣿⣿⣿⣿⣿⡵⢁⣤⣶⣶⣿⢿⢿⢿⡟⢻⣤⢑⢂
  15. ⣾⣿⣿⡿⢟⣛⣻⣿⣿⣿⣦⣬⣙⣻⣿⣿⣷⣿⣿⢟⢝⢕⢕⢕⢕⢽⣿⣿⣷⣔
  16. ⣿⣿⠵⠚⠉⢀⣀⣀⣈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣗⢕⢕⢕⢕⢕⢕⣽⣿⣿⣿⣿
  17. ⢷⣂⣠⣴⣾⡿⡿⡻⡻⣿⣿⣴⣿⣿⣿⣿⣿⣿⣷⣵⣵⣵⣷⣿⣿⣿⣿⣿⣿⡿
  18. ⢌⠻⣿⡿⡫⡪⡪⡪⡪⣺⣿⣿⣿⣿⣿⠿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃
  19. ⠣⡁⠹⡪⡪⡪⡪⣪⣾⣿⣿⣿⣿⠋⠐⢉⢍⢄⢌⠻⣿⣿⣿⣿⣿⣿⣿⣿⠏⠈
  20. ⡣⡘⢄⠙⣾⣾⣾⣿⣿⣿⣿⣿⣿⡀⢐⢕⢕⢕⢕⢕⡘⣿⣿⣿⣿⣿⣿⠏⠠⠈
  21. ⠌⢊⢂⢣⠹⣿⣿⣿⣿⣿⣿⣿⣿⣧⢐⢕⢕⢕⢕⢕⢅⣿⣿⣿⣿⡿⢋⢜⠠⠈
  22. ⠄⠁⠕⢝⡢⠈⠻⣿⣿⣿⣿⣿⣿⣿⣷⣕⣑⣑⣑⣵⣿⣿⣿⡿⢋⢔⢕⣿⠠⠈
  23. ⠨⡂⡀⢑⢕⡅⠂⠄⠉⠛⠻⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢋⢔⢕⢕⣿⣿⠠⠈
  24. ⠄⠪⣂⠁⢕⠆⠄⠂⠄⠁⡀⠂⡀⠄⢈⠉⢍⢛⢛⢛⢋⢔⢕⢕⢕⣽⣿⣿⠠⠈
  25. */
  26. #define all(a) a.begin(), a.end()
  27. #define FNAME ""
  28. //#define int ll
  29. typedef pair<int, int> pii;
  30. #define _ << ' ' <<
  31. #define vec vector
  32. #ifndef HOME
  33. #define cerr \
  34.     if (0) cerr
  35. #endif
  36.  
  37. const int max_memory = 1e8;
  38.  
  39. int pos_memory = 0;
  40. char memory[max_memory];
  41.  
  42. void* operator new(size_t n) {
  43.     char *res = memory + pos_memory;
  44.     pos_memory += n;
  45.     assert(pos_memory <= max_memory);
  46.     return (void*) res;
  47. }
  48. void operator delete(void *){}
  49.  
  50. bool chkmax(int &a, int b, bool eq = false) {
  51.     if (a < b) {
  52.         a = b;
  53.         return true;
  54.     }
  55.     return a == b && eq;
  56. }
  57. bool chkmin(int &a, int b, bool eq = false) {
  58.     if (a > b) {
  59.         a = b;
  60.         return true;
  61.     }
  62.     return a == b && eq;
  63. }
  64. #ifdef int
  65. const int INF = 2e16;
  66. #else
  67. const int INF = 2e9;
  68. #endif
  69.  
  70. mt19937 gen(time(0));
  71. const int MAXN = 1e5 + 123;
  72. //set<int> st;
  73. struct Node {
  74.     int l, r;
  75.     int ind;
  76. };
  77. Node nd[MAXN];
  78. int rest[MAXN];
  79. int lst = 1;
  80. int nn() {
  81.     return lst++;
  82. }
  83. int f[MAXN];
  84. int lf[MAXN];
  85. int rg[MAXN];
  86. int a[MAXN];
  87. void solve() {
  88.     //code here
  89.     int n, k;
  90.     cin >> n >> k;
  91.  
  92.     vec<pii> vc;
  93.     vc.resize(n);
  94.     int pos = 0;
  95.     for (int i = 0; i < n; ++i) {
  96.         int x;
  97.         cin >> x;
  98.         a[i + 1] = x;
  99.         vc[pos++]={-x, i + 1};
  100.     }
  101.     {
  102.         stack<pii> st;
  103.         st.push({INF, -1});
  104.         for (int i = 1; i <= n; ++i) {
  105.             while (st.top().first < a[i]) {
  106.                 st.pop();
  107.             }
  108.             lf[i] = st.top().second;
  109.             st.push({a[i], i});
  110.         }
  111.  
  112.     }
  113.     {
  114.         stack<pii> st;
  115.         st.push({INF, -1});
  116.         for (int i = n; i >= 1; --i) {
  117.             while (st.top().first <= a[i]) {
  118.                 st.pop();
  119.             }
  120.             rg[i] = st.top().second;
  121.             st.push({a[i], i});
  122.         }
  123.  
  124.     }
  125.     sort(all(vc));
  126.     ll ans =0 ;
  127.  
  128.     for (auto [X, i]: vc) {
  129.         X = -X;
  130. //        st.insert(i);
  131.         int ind = nn();
  132.         rest[i] = ind;
  133.         if (lf[i] != -1) {
  134.             int l = rest[lf[i]];
  135.             nd[ind].l = l;
  136.             nd[l].r = ind;
  137.         } else {
  138.             nd[ind].l = -1;
  139.         }
  140.         if (rg[i] != -1) {
  141.             int r = rest[rg[i]];
  142.             nd[ind].r = r;
  143.             nd[r].l = ind;
  144.         } else {
  145.             nd[ind].r = -1;
  146.         }
  147.         nd[ind].ind = i;
  148. //        for (int i = 0; i < 2 * k + 10; ++i) {
  149. //            f[i] = -1;
  150. //        }
  151.         //TODO переписать эту хрень на двусвязный список
  152.         int fi= k + 1;
  153.         f[k] = i;
  154.         int indf = nd[ind].r;
  155.         for (int j = 0; j < k - 1; ++j) {
  156.             if (indf == -1) break;
  157.             f[fi++] = (nd[indf].ind);
  158.             indf= nd[indf].r;
  159.         }
  160.  
  161.         if (indf == -1) {
  162.             f[fi]=n + 1;
  163.         } else {
  164.             f[fi]= (nd[indf].ind);
  165.         }
  166.         int forw = fi --;
  167.  
  168.         fi = k - 1;
  169.         for (int j = 0; j < k - 1; ++j) {
  170.             if (nd[ind].l == -1) break;
  171.             ind = nd[ind].l;
  172.             f[fi--] = (nd[ind].ind);
  173.         }
  174.  
  175.         int back = fi + 1;
  176.         if (nd[ind].l == -1 ) {
  177.             f[fi] = 0;
  178.         } else {
  179.             ind = nd[ind].l;
  180.             f[fi] = nd[ind].ind;
  181.         }
  182.         forw = min(forw - k, k);
  183.         for (int i = back; i <= forw; ++i) {
  184.             int j = i + k;
  185.             int c = f[i] - f[i - 1];
  186.             int d = f[j] - f[j - 1];
  187.             ans += 1ll * c * d * X;
  188.         }
  189.     }
  190.     cout << ans;
  191.     //
  192. }
  193. signed main() {
  194. #ifdef HOME
  195.     freopen("input.txt", "r", stdin);
  196.     //freopen("input.txt", "w", stdout);
  197. #else
  198.     if (FNAME != "") {
  199.         freopen(FNAME ".in", "r", stdin);
  200.         freopen(FNAME ".out", "w", stdout);
  201.     }
  202. #endif
  203.     ios_base::sync_with_stdio(false);
  204.     cin.tie(nullptr);
  205.     int tt = 1;
  206.     //    cin >> tt;
  207.     for (int req = 0; req < tt; ++req) {
  208.         unsigned start = clock();
  209.  
  210.         solve();
  211.  
  212.         unsigned end = clock();
  213.         cerr << "WorkTime: " << (end - start) / (double) CLOCKS_PER_SEC << '\n';
  214.         cout << '\n';
  215.  
  216.     }
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement