HackerEarth Challenge-- Deepu和Array

时间:2014-12-22 11:21:29

标签: algorithm data-structures segment-tree interval-tree

[挑战结束]

问题:

一系列积极因素。 Deepu想要减少数组的元素。他调用函数Hit(X),它将数组中所有大于X的元素减少1。

他会多次调用这个数组。多次调用Hit(X)后打印数组。

输入:

n -----数组10 ^ 5中没有元素。

n个元素----- 1< = element< = 10 ^ 9。

x -----没有对Hit(X)x元素的调用----- 1< = element< = 10 ^ 9。

输出:

在调用Hit(X)x次后打印数组。

时间限制 - 5秒。

我的解决方案超出了时间限制。

我的方法:

  1. 保留原始数组
  2. 在数组中创建一对数组元素及其索引的向量对向量元素进行排序[升序]。
  3. 执行C ++ STL的LowerBound()以获取元素的位置 向量,其中元素等于给出元素x。
  4. 来自这个元素 减少大于x的元素1直到结束 来自该对中索引的原始数组。
  5. 重复步骤3& 4为 每个x。
  6. 打印原始阵列。
  7. 我认为我的解决方案具有复杂性n ^ 2.

    有人可以给我一个优化的解决方案

    由于

    My Code

        #define _CRT_DISABLE_PERFCRIT_LOCKS
    
        // lower_bound/upper_bound example
        #include <iostream>     // std::cout
        #include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
        #include <vector>       // std::vector
        #include <utility>
    
        using namespace std;
    
    
        bool pairCompare(const std::pair<long long int, unsigned int>& firstElem, const std::pair<long long int, unsigned int>& secondElem) {
            return firstElem.first < secondElem.first;
    
        }
    
        int main() {
    
            ios_base::sync_with_stdio(false);
            cin.tie(NULL);
    
            unsigned int n, m;
    
            long long int arr[100000], x,temp;
    
            vector<pair<long long int, unsigned int> > vect(100000);
    
            cin >> n;
    
            for (unsigned int i = 0; i < n; i++)
            {
                cin >> temp;
                arr[i] = temp;
    
                vect[i].first = temp;
                vect[i].second = i;
            }
    
            sort(vect.begin(), vect.begin() + n, pairCompare);
    
    
            cin >> m;
    
            vector<pair<long long int, unsigned int> >::iterator low;
    
    
    
            while (m--)
            {
                        cin >> x;
    
    
    
                low = lower_bound(vect.begin(), vect.begin() + n, make_pair(x,2), pairCompare);
    
                if (low != vect.begin() + n)
                {
    
                        for (unsigned int i = low - vect.begin(); i < n; i++)
                        {
    
                            if (vect[i].first != x)
                            {
                                vect[i].first -= 1;
    
                                arr[vect[i].second] -= 1;
                            }
                        }
                }
    
    
    
    
            }
    
    
            for (unsigned int i = 0; i < n; i++)
            {
    
                cout << arr[i]<<" ";
            }
    
    
            return 0;
        }
    

1 个答案:

答案 0 :(得分:1)

首先按非递减顺序对输入数组进行排序。在运行每个更新操作之后,输入数组将保持排序状态,因为我们正在查找大于x的元素并递减它们,因此可能发生的最坏情况是在操作之后某些元素变为等于x:数组仍然已排序。

您可以使用延迟段树更新快速更新范围。您必须记住原始位置,以便最后打印数组。