Ёлка для енота В стране енотов есть n городов, расположенных в ряд. Еноты любят гигантские ёлки, каждую из которых они устанавливают так, что она накрывает города с номерами в отрезке чётной длины от l до r включительно.

Ёлочным треугольником последовательности b1, ..., bk чётной длины назовём набор последовательностей Ti. Первая последовательность совпадает с данной (T1 = b1, ..., bk), а каждая из оставшихся получена удалением первого и последнего элемента из предыдущей (Ti = bi, ..., bk - i + 1). Например, ёлочный треугольник последовательности 1, 2, 3, 4, 5, 6 выглядит так:

Ёлкой последовательности c1, ..., ck чётной длины называется последовательность ёлочных треугольников последовательностей S1, ..., Sk/2, где Si = ci, ..., ck - i + 1. При этом центр каждого треугольника совпадает с центром ёлки. Например, ёлка последовательности 1, 2, 3, 4, 5, 6 выглядит так:

В каждом городе есть свой вид украшений: в i-м городе красота украшений равна ai. Когда еноты устанавливают гигантскую ёлку, накрывающую города с номерами в отрезке [l, r], то каждый город под этой ёлкой вешает свои украшения на все позиции в ёлке, под которыми этот город находится. Например, если накрыто шесть городов, то четвёртый накрытый город вешает украшения на все позиции, обозначенные четвёркой на рисунке выше.

Красота ёлки - сумма значений красоты каждого использованного украшения.

Вам даны значения красоты украшений, используемых в каждом городе, и описания k гигантских ёлок, которые ставили еноты. Енот Дмитрий хочет работать аналитиком, и в качестве тестового задания ему предложили упорядочить данный вам список из ёлок по возрастанию значений красоты. С сортировкой он справится и сам, а найти значения красоты каждой ёлки он попросил вас.

Поскольку красота ёлки может быть очень большой, достаточно найти её значение по модулю 998244353.

Формат входных данных
В первой строке задано число n (2 ≤ n ≤ 1000000) - число городов.

Во второй строке через пробел заданы n чисел a1, a2, ..., an (1 ≤ ai ≤ 109) - красота украшений, используемых в каждом из городов.

В третьей строке задано число k (1 ≤ k ≤ 1000000) - число ёлок.

В i-й из последующих k строк содержатся два числа l и r (1 ≤ l < r ≤ n) - номера первого и последнего городов, которые украшают ёлку с номером i. Гарантируется, что этот диапазон чётной длины, то есть (r - l + 1) делится на 2.

Формат результата
Необходимо вывести k строк, i-я из которых содержит суммарную красоту украшений на i-й ёлке по модулю 998244353.

danilaandriyanov danilaandriyanov    2   14.11.2020 13:00    1

Ответы
denis20043601 denis20043601  14.12.2020 13:02

#include <bits/stdc++.h>

using namespace std;

int main(){

       ios_base::sync_with_stdio(0);

       cin.tie(0);cout.tie(0);

       int N,k;

       int a[1000000];

       map <pair <int, int>, int> mem;

       cin >> N;

       //b.reserve(N);

       memset(a,0,sizeof a);

       //memset(b,0,b.size()*sizeof int);

       for (int i=0;i<N;i++)

               cin >> a[i];

       cin >> k;

       for (int i=0;i<k;i++){

       int tmp,tmp2,tmp3,tmp4,sum{0};

       cin >> tmp >> tmp2;

       tmp--;tmp2--;

       if (mem.find({tmp,tmp2})!=mem.end()) {cout<< mem[ {tmp,tmp2} ] << endl; continue;}

       tmp3=tmp;

       tmp4=tmp2;

       for(int x=0;x<(tmp4-tmp3)/2+1;x++){

       for(int z=0;z<(tmp2-tmp)/2+1;z++){

       if (mem.find({tmp,tmp2})!=mem.end()) {sum= (sum+mem[ {tmp,tmp2} ])%998244353; break;}

       for(int j=tmp+z;j<=tmp2-z;j++){

       sum=(sum+a[j])%998244353;

       }}

       tmp++;tmp2--;

       }

       cout << sum << endl;

       mem[{tmp3,tmp4}]=sum;

       }

       return 0;

}

Объяснение:

ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика