[挑战结束]
问题:
一系列积极因素。 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秒。
我的解决方案超出了时间限制。
我的方法:
我认为我的解决方案具有复杂性n ^ 2.
有人可以给我一个优化的解决方案
由于
#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;
}
答案 0 :(得分:1)
首先按非递减顺序对输入数组进行排序。在运行每个更新操作之后,输入数组将保持排序状态,因为我们正在查找大于x的元素并递减它们,因此可能发生的最坏情况是在操作之后某些元素变为等于x:数组仍然已排序。
您可以使用延迟段树更新快速更新范围。您必须记住原始位置,以便最后打印数组。