Выполнить M операций вычисления количества нулевых элементов на отрезке

94
29 апреля 2021, 00:00

Задан числовой массив A [1..N]. Необходимо выполнить M операций вычисления количества нулевых элементов на отрезке [L, R].

Входные данные

Первая строка входного файла INPUT.TXT содержит число N – размер массива (N ≤ 105). Во второй строке записаны N чисел – элементы массива, целые числа от 0 до 105. Третья строка содержит натуральное число M – количество запросов (M ≤ 30 000). Следующие M строк содержат пары чисел L и R (1 ≤ L ≤ R ≤ N), описывающие отрезки.

Выходные данные

В выходной файл OUTPUT.TXT для каждого запроса выведите через пробел количество нулевых элементов.

Я написал структуру данных, но в моем коде есть подвох. Помогите найти мою ошибку или написать правильный код.

#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const ll N = 1e5 + 5;
const ll MAX = 2e5 + 123;
const ll MOD = 1e9 + 7;
using namespace std;
ll n, m, a[ N ];
vector< ll > v;
int main()
{
    scanf( "%I64d", &n );
    ll len = ceil( sqrt( n ) );
    vector< ll > b( n );
    for( ll i = 0; i < n; i ++ )
    { 
        scanf( "%I64d", &a[ i ] );
        b[ i ] = 0;
    }
    for( ll i = 0; i < n; i ++ )
    {
        b[ i / len ] += a[ i ] == 0;
    }
    scanf( "%I64d", &m );
    while( m -- )
    {
        ll l, r, sum = 0;
        scanf( "%I64d%I64d", &l, &r );
        ll c_l = l / len, c_r = r / len;
        if( c_l == c_r )
        {
            for( ll i = l; i <= r; i ++ ) 
                if( a[ i ] == 0 ) 
                    sum ++;
        }
        else 
        {
            for (int i=l, end=(c_l+1)*len-1; i<=end; ++i)
                if( !a[ i ] )
                    sum ++;
            for (int i=c_l+1; i<=c_r-1; ++i)
                sum += b[i];
            for (int i=c_r*len; i<=r; ++i)
                if( !a[ i ] )
                    sum ++;
        }
        v.push_back( sum );
    }
    for( ll i = 0; i < v.size(); i ++ ) 
        cout << v[ i ] << ' ';
}
Answer 1

Для этой задачи достаточно сделать массив, в котором записаны количества нулевых элементов по K-ю ячейку включительно.

0  1  2  3  4  5  6   индекс    
.  3  0  2  1  0  5   входной массив
0  0  1  1  1  2  2   накопленная сумма количества нулей

Тогда ответ на запрос - это просто разность B[R]-B[L-1]

С(2,5) = B[5] - B[1] = 2 - 0 = 2
READ ALSO
Отладка программ Qt C++

Отладка программ Qt C++

Досталась в наследство программа Over 100 тысяч сток кодаКогда в Qt Creator запускаю в режиме дебага, в консоль каждые 10 секунд сыпятся 12 сообщений

114
QTcpServer POST multipart/form-data проблемы

QTcpServer POST multipart/form-data проблемы

Не могу найти как обрабатывать сигналы POST в QTcpServerНа сервер посылаются данные в следующем виде

95
Соединение Kinect с Arduino

Соединение Kinect с Arduino

Нужно данные от сенсора kinect передать в программу на Arduino, как это проще всего сделать? Очень желательно, чтобы использовался только язык C/C++

100
Ошибка при копировании файла QFile в Windows

Ошибка при копировании файла QFile в Windows

Создаю файл, пишу в него текст, потом хочу скопироватьНо функция copy возвращает false

77