Я нашел в Интернете проблему программирования и подумал, есть ли более эффективное решение для этого.
Проблема: Вам предоставляется список из n чисел вместе с номером X, который относится к максимальному количеству различных чисел, которые могут содержаться в смежном подмассиве.Нам нужно сосчитать все такие смежные подмассивы, которые удовлетворяют условию, наложенному X.
Input В первой строке два числа n и x;количество чисел и максимальное количество уникальных чисел в подмассиве.
Пример:
5 2
1 2 3 1 1
ans = 10
explanation: ([1],[2],[3],[1],[1],[1,2],[2,3],[3,1],[1,1],[3,1,1])
Мой подход Перебрать все подмассивы списка с помощью двух циклови подсчитать количество уникальных чисел в соответствующем подмассиве (используя набор).Конечно, должен быть более эффективный способ рассчитать это?Извините, если этот вопрос здесь не относится, не стесняйтесь редактировать его.
РЕДАКТИРОВАТЬ: исправленный код nellex, который иногда дает неправильный ответ
int main() {
int n, x;
cin >> n >> x;
vector<int> a;
for (int i = 1; i <= n; i++) {
int b;
cin >> b;
a.push_back(b);
}
int ans = 0, end = 1;
set<int> uniq;
map<int, int> freq;
for (int start = 0; start < n; start++) {
cout << start << " and end=" << end << endl;
while (uniq.size() <= x && end < n) {
if (uniq.size() == x && freq[a[end]] == 0) {
break;
}
uniq.insert(a[end]);
freq[a[end]]++;
end++;
}
cout << "added " << end << " - " << start << " to ans" << endl;
ans += end - start;
freq[a[start]]--;
if (freq[a[start]] == 0) {
uniq.erase(a[start]);
}
}
cout << ans;
}
РЕДАКТИРОВАТЬ: ограничения 1-го теста:
1≤k≤n≤100
1≤xi≤10
Наибольшие ограничения:
1≤k≤n≤5⋅10^5
1≤xi≤10^9