Районная олимпиада 2019-2020 информатика


Задача C. Мейрамхана

Ограничение по времени:
1 second
Ограничение по памяти:
256 megabytes

Мейрамханада $n$ даяршы бар. Олар $1$-ден $n$-ға дейін нөмірленген. Үстелде $m$ стақан тұр. Олар $1$-ден $m$-ге дейін нөмірленген. Бастапқыда барлық стақан бос. Әр даяршы бірнеше стақанға сусын құюы керек. $i$-ші даяршы $l_i$-ден $r_i$-ге дейінгі стақандарға $x_i$ миллилитр сусын құюы керек. Бір даяршы ұйықтап қалып, стақандарға сусын құюды ұмытып кетті. Одан басқа барлық даяршылар тапсырмаларын орындады. Сізге әр стақандағы сусын мөлшері берілген. Сізге ұйықтап қалу мүмкін даяршылардың тізімін табу керек.
Формат входного файла
Бірінші жолда $n$ және $m$ $(1 <= n, m <= 10^5)$ — даяршылар саны және стақандар саны берілген. Келесі $n$ жолдарда $l_i$, $r_i$ және $x_i$ $(1 <= l_i <= r_i <= m$, $1 <= x_i <= 10^3)$ үш сандар берілген. Келесі жолда $m$ бүтін сандар берілген, $a_1$, $a_2$, $\dots$, $a_m$, мұнда $a_i$ $i$-ші стақандағы сусынның миллилитр санын көрсетеді.
Формат выходного файла
Ұйықтап қалу мүмкін даяршылардың нөмірлерін өсу ретінде шығарыңыз.
Система оценки
Бұл есеп $10$ тесттан тұрады. Әр тест $10$ баллға бағаланады:
  1. $1 <= n, m <= 100$. 1-2 нөмердегі тесттер.
  2. $1 <= n, m <= 3000$. 3-5 нөмердегі тесттер.
  3. $1 <= n, m <= 10^5$. 6-10 нөмердегі тесттер
Пример:
Вход
5 4
1 3 2
2 4 3
1 3 2
3 4 1
3 3 1
2 5 7 4
Ответ
1 3
( Aibar Kuanyshbay )
посмотреть в олимпиаде

Комментарий/решение:

  0
2020-01-01 14:02:53.0 #

С новым годом. Не проходит по времяни в 6 том тесте. Буду благодарен, если найдете другие варианты решение. :)

кодты корсету/жасыру

  3
2020-01-02 04:52:37.0 #

В своем решение вы полностью проходите по отрезку [l, r]. Это решение будет работать но так как вы делаете это 10^5 раз итоговая асимптотика выходит O(nm), что очень медленно. Задача решается с помощью дерева отрезков или же так как задача без обновлений, то есть офлайн можно итоговый массив получить вот так:

При каждом считывании l, r, x в дополнительном массиве на индексе l добавьте x, в индексе r + 1 отнимите x. Затем поступите префикс сумму по этому массиву и это будет итоговый массив.

пред. Правка 2   -1
2020-12-02 19:56:44.0 #

  0
2020-11-28 10:28:37.0 #

кодты корсету/жасыру

  0
2020-12-19 22:45:21.0 #

n, m = input().split()

n, m = int(n), int(m)

lrx = [[]for i in range(n)]

for i in range(n):

lrx[i] = input().split()

for j in range(3):

lrx[i][j] = int(lrx[i][j])

a= input().split()

for i in range(len(a)):

a[i] = int(a[i])

a_full = [0]*m

for i in range(n):

l=lrx[i][0]

r=lrx[i][1]

x=lrx[i][2]

for j in range(l-1,r):

a_full[j]+=x

mistake = [0]*3

l = float('inf')

for i in range(m):

if a[i] != a_full[i]:

mistake[2] = a_full[i]-a[i]

if i<l:

mistake[0] = l = i+1

mistake[1]= i+1

maybe=[]

for i in range(n):

if lrx[i][0] == mistake[0] and lrx[i][1] == mistake[1] and lrx [i][2] == mistake[2]:

maybe.append(i+1)

for i in maybe:

print(i)

пред. Правка 3   0
2022-02-08 13:19:12.0 #

...

  0
2022-02-08 12:35:33.0 #

кодты корсету/жасыру