Sunday, May 31, 2026

3943. Number of Pairs After Increment

 1.Problem

Number of Pairs After Increment - LeetCode

2.Idea

Use sqrt decomposition to maintain the segment element frequency count which also supports range update


3.Code

 class Solution {  
 public:  
   vector<int> numberOfPairs(vector<int>& nums1, vector<int>& nums2, vector<vector<int>>& queries) {  
     int n = nums2.size();  
     int k = sqrt(n);  
     int N = (n+k-1)/k;  
     vector<long long>nums22(nums2.begin(), nums2.end());  
     vector<unordered_map<long long, int>>arr(N);  
     vector<long long>add(N, 0);  
     // 1. Initialize blocks  
     for(int i = 0; i < N; ++i)  
       for(int j = i*k; j < min((i+1)*k, n); ++j)  
         ++arr[i][nums2[j]];  
     vector<int>rt;   
     rt.reserve(queries.size());  
     for(auto& q : queries)  
     {  
       if(q[0] == 1) // Range Addition  
       {  
         int st = q[1], end = q[2];  
         long long val = q[3];  
         for(int i = st; i <= end; ++i)  
         {  
           int idx = i/k;  
           // Fully covered block: apply lazy tag  
           if((i % k) == 0 && i + k - 1 <= end)  
           {  
             add[idx] += val;  
             i += k-1; // Jump to the end of the block  
           }  
           else // Partially covered block: manual update  
           {  
             --arr[idx][nums22[i]];  
             // Pruning: prevent hash map bloat  
             if(arr[idx][nums22[i]] == 0) arr[idx].erase(nums22[i]);  
             nums22[i] += val;  
             ++arr[idx][nums22[i]];  
           }  
         }  
       }  
       else // Query Pairs  
       {  
         int c = 0;  
         for(auto& num : nums1)  
         {  
           for(int i = 0; i < N; ++i)  
           {  
             // Calculate required target considering the block's lazy tag  
             long long tar = q[1] - num - add[i];  
             // Use find() to avoid accidental zero-value insertions  
             if(arr[i].find(tar) != arr[i].end())  
               c += arr[i][tar];  
           }  
         }  
         rt.push_back(c);  
       }  
     }  
     return rt;  
   }  
 };  

No comments:

Post a Comment