Advertisement
pb_jiang

LC2444

Oct 15th, 2022
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. class Solution {
  2.     using ll = long long;
  3.     vector<int> nextMink;
  4.     vector<int> nextMaxk;
  5.     vector<int> cutoff;
  6.    
  7.     ll calc(int beg, int end) {
  8.         if (beg >= end) return 0;
  9.         int n = max(nextMink[beg], nextMaxk[beg]);
  10.         if (n >= end) return 0;
  11.         return end - n;
  12.     }
  13. public:
  14.     long long countSubarrays(vector<int>& ns, int minK, int maxK) {
  15.         ll ret = 0;
  16.        
  17.         for (int i = 0; i < ns.size(); ++i) {
  18.             if (ns[i] > maxK || ns[i] < minK) cutoff.push_back(i);
  19.         }
  20.         nextMink = vector<int>(ns.size());
  21.         nextMaxk = vector<int>(ns.size());
  22.         int last_mink = INT_MAX, last_maxk = INT_MAX;
  23.         for (int i = ns.size() - 1; i >= 0; --i) {
  24.             if (ns[i] == minK) last_mink = i;
  25.             if (ns[i] == maxK) last_maxk = i;
  26.             nextMink[i] = last_mink;
  27.             nextMaxk[i] = last_maxk;
  28.         }
  29.         cutoff.push_back(ns.size());
  30.         for (int i = 0, j = 0; i < ns.size(); ++i) {
  31.             if (i != cutoff[j]) {
  32.                 ret += calc(i, cutoff[j]);
  33.             } else {
  34.                 ++j;
  35.             }
  36.         }
  37.         return ret;
  38.     }
  39. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement