Задача с магическим массивом

158
18 ноября 2019, 18:00

Падает решение задачи на последнем тесте выдавая Runtime error. Подскажите где в коде может быть ошибка.

Есть массив состоящий из n целых чисел a1, a2, ..., an. Нужно посчитать количество магических индексов в массиве а. Индекс x называется магическим, если он соответствует следующим правилам:

  1. 1 < x < n.
  2. ay ≤ ax, для каждого y (1 ≤ y < x).
  3. ax ≤ az, для каждого z (x ≤ z < n).

Вводные данные: Первая строка содержит целое число T, где T - количество тестов. Первая строка каждого теста содержит целое число n (1 ≤ n ≤ 10^6), где n - размер массива a. Вторая строка каждого теста содержит n целых чисел a1, a2, ..., an (1 ≤ ai ≤ 10^6), что дает массив a.

Вывод: Для каждого теста выведите в отдельной строке количество магических индексов в массиве a.

Примеры Ввода/Вывода:

+------------------+-------------------+
| стандартный ввод | стандартный вывод |
+------------------+-------------------+
| 2                | 3                 |
| 8                | 1                 |
| 2 1 3 4 6 5 7 9  |                   |
| 6                |                   |
| 4 2 7 9 8 10     |                   |
+------------------+-------------------+

В своем решении я сначала считывал весь массив а, а потом проверял каждый элемент соответствует ли он этим требованиям.

#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
    ios_base::sync_with_stdio( 0);
    int t, n;
    scanf("%d", &t);
    for( int i = 0; i < t; i++ )
    {
        int n;
        scanf("%d", &n);
        int* nn = new int[n];
        int rez = 0;
        for( int y = 0; y < n; y++ )
        {
            scanf("%d", &nn[y]);
        }
        for( int y = 0; y < n; y++ )
        {
            if( y > 0 && y < n-1 )
            {
                bool ats = true;
                int q = y; // q = 1
                while(q != 0)
                {
                    if( nn[y] < nn[q-1] ){ats = false; break;}
                    q--;
                }
                int g = n - 1;
                while(g > y)
                {
                    if( nn[y] > nn[g] ){ats = false; break;}
                    g--;
                }
                if(ats == true){rez++;}
            }
        }
        printf ("%d \n", rez);
    }
    return 0;
}
Answer 1

Для ускорения можно использовать следующее:

Проходим массив слева направо, поддерживая текущий максимум на каждый момент. Помечаем элементы, которые не меньше текущего максимума.

Проходим массив справа налево, определяя текущий минимум (с конца). Элементы, которые не не больше текущего минимума, и одновременно помечены при первом проходе - магические.

READ ALSO
Преобразовать файл в строку с битов

Преобразовать файл в строку с битов

Как преобразовать любой файл в строку, в которой файл будет представлен в бинарном виде?

120
Exception in thread &ldquo;main&rdquo; javax.persistence.PersistenceException: No Persistence provider for EntityManager named JPA

Exception in thread “main” javax.persistence.PersistenceException: No Persistence provider for EntityManager named JPA

Пересмотрела все похожие вопросы, заданные раннее, не нашла подходящего ответа

121
Двумерный ArrayList,JAVA

Двумерный ArrayList,JAVA

почему,когда я добавляю элементы в лист inter,уже после того,как я добавил 2 и 3 в сам двумерный лист,он автоматически продолжает добавлять 44 и 62 хотя...

153
Не корректный ввод текста в WebView

Не корректный ввод текста в WebView

Приложение грузит страницу с сайта в WebView ,на сайте нужно вводить данные в строкахПри вводе текста я не вижу что ввожу ,только после дополнительного...

143