C/C++

Превышено максимальное время работы в коде с++

Условие:
Перестановкой назовем массив, состоящий из n различных целых чисел от 0 до n − 1 в произвольном порядке. Например, [ 2 , 1 , 0 , 4 , 3 ] является перестановкой, а [ 0 , 1 , 1 ] и [ 0 , 2 ] — нет. На день рождения Пете подарили перестановку p 1 , p 2 , … , p n . Счастье Пети определяется как количество пар ( i , j ) , таких что 1 ≤ i p j . Пете разрешено многократно выполнять следующую операцию: переместить первый элемент перестановки в ее конец. Например, если изначально у Пети была перестановка [ 1 , 2 , 0 , 4 , 3 ] , то после применения операции у него будет перестановка [ 2 , 0 , 4 , 3 , 1 ] . Для каждого k от 0 до n − 1 выведите значение счастья Пети, если он выполнит данную операцию k раз. Формат входных данных Первая строка содержит число n ( 2 ≤ n ≤ 3 ⋅ 10 5 ) — размер перестановки. Вторая строка содержит записанные через пробел числа p 1 , p 2 , … , p n — перестановку чисел от 0 до n − 1 . Формат выходных данных В следующих n строках выведите числа a 0 , a 1 , … , a n − 1 , где a k — счастье Пети при условии, что он k раз переместил первый элемент перестановки в ее конец.

Мой код (c++):

#include <iostream>
#include <vector>

using namespace std;

int main()
{
int n;
cin >> n;
vector <int> v;
for (int i = 0; i < n; ++i){
int a;
cin >> a;
v.push_back(a);
}
for (int i = 0; i < n; ++i){
v.push_back(v[i]);
}
for (int k = 0; k < n; ++k){
int c = 0;
for (int i = 0; i < n; ++i){
for (int j = i + 1; j < n; ++j){
if (v[i + k] > v[j + k]){
c++;
}
}
}
cout << c << endl;
}
return 0;
}

Код проходит все тесты, кроме последнего. В последнем сказано, что превышено максимальное время. Как можно это поправить?
  1. Считаем счастье исходной перестановки a[0] - можно и так, как у тебя сделано.
  2. Счастье всех следующих перестановок считается рекуррентной формулой:
 a[k] = a[k - 1] + n - 1 - 2 * v[k - 1]; 
Что-то вроде такого:
 int n;  
cin >> n;
vector v(n);
for (auto &e: v) { cin >> e; }
int c = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
c += v[i] > v[j];
}
}
for (auto e: v) {
cout
Nikolai Majar
Nikolai Majar
80 272
Лучший ответ
Юрий Цыпушкин данное решение выполняется слишком долго, думаю решение должно быть менее чем O(n^2).
Ну, у меня запустилось. Прогнал через отладчик, всё работает
Юрий Облап
Юрий Облап
54 497
 #include  
#include

using namespace std;

int main() {
int n;
cin >> n;
vector p(n);
for (int i = 0; i < n; ++i) {
cin >> p[i];
}

vector a(n);
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (p[i] > p[j]) {
a[0]++;
}
}
}

for (int k = 1; k < n; ++k) {
a[k] = a[k - 1];
if (p[k - 1] > p[n - 1]) {
a[k]--;
} else {
a[k]++;
}
for (int i = k; i < n - 1; ++i) {
if (p[i] > p[k - 1]) {
a[k]--;
} else {
a[k]++;
}
}
}

for (int k = 0; k < n; ++k) {
cout
ты видимо проходишь отбор, какие задачи ты решил, го обмен

Похожие вопросы