Олимпиадное программирование

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Олимпиадное программирование » acm.timus.ru » 1491. Нереальная история


1491. Нереальная история

Сообщений 1 страница 5 из 5

1

Ограничение времени: 1.0 секунды
Ограничение памяти: 64 МБ

Вы не поверите, но однажды в древности произошла такая история. На заседании круглого стола король Артур встал и сказал: «Пусть каждый рыцарь, сидящий от меня справа не более чем на b мест и не менее чем на a мест, получит по c золотых монет из моего кармана». Если занумеровать всех рыцарей числами от 1 до N против часовой стрелки, так что, рыцарь, сидящий справа от Артура, получит номер 1, а рыцарь, сидящий слева от Артура, — номер N, то получается, что он раздал по c золотых монет рыцарям с номерами a, a + 1, …, b.

Затем благородные рыцари, посмотрев на щедрый поступок Артура, начали вставать по очереди против часовой стрелки и говорить свою тройку чисел ai, bi, ci (1 ≤ i ≤ N). После каждого такого высказывания рыцари, сидящие справа от короля Артура не более чем на bi мест и не менее чем на ai мест, получали по ci золотых монет от короля.

Поскольку каждый рыцарь был очень благороден, то либо ai > i, либо bi < i. Ваша задача — помочь рыцарям выяснить, сколько монет каждый из них получил в дар.
Исходные данные

В первой строке записано количество рыцарей короля Артура N (1 ≤ N ≤ 100000). В следующей строке записаны целые числа a, b и c, названные Артуром (1 ≤ a ≤ b ≤ N, 1 ≤ c ≤ 10000). В следующих N строках перечислены тройки целых чисел ai, bi, ci, названные рыцарями (1 ≤ ai ≤ bi ≤ N, 1 ≤ ci ≤ 10000).
Результат

Выведите N чисел через пробел. i-тое число должно равняться количеству монет, которое получил в дар i-тый рыцарь.
Примеры
исходные данные

результат

4
2 3 2
2 4 1
3 4 1
1 2 1
1 1 1

2 4 4 2

7
1 7 1
2 3 4
3 5 3
1 2 1
5 7 4
2 4 10
3 4 2
1 6 3

5 19 23 19 11 8 5

Автор задачи: Александр Торопов
Источник задачи: XIII командный чемпионат школьников Свердловской области по программированию (14 октября 2006 года)

0

2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class Task_1491 {

public static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

public static int nextInt() throws IOException {
    in.nextToken();
    return (int)in.nval;
}

public static void main(String[] args) throws IOException {
    int a, arr[] = new int[100001], b, c, n = nextInt(), now = 0;
    for (int i=0; i<n+1; i++) {
    a = nextInt();
    b = nextInt();
    c = nextInt();
    arr[a-1]+=c;
    arr[b]-=c;
    }
    for (int i=0; i<n; i++) {
    now+=arr[i];
    out.print(now);
    out.print(" ");
    }
    out.flush();
}

}

0

3

На первый взгляд задача элементарная. Заводим массив int arr = new int[100001], затем в цикле с n+1 итерациями считываем каждый раз a, b, c и каждый раз пробегаем с помощью цикла по массиву, прибавляя к элементу arr[i] количество денег, которое он получил на этот раз. В конце просто выводим все элементы arr[].
Все бы хорошо, но такое решение не укладывается в ограничение по времени на 17-м тесте. Поэтому предлагаю следующее решение:

Идея решения:
Заводим массив int arr = new int[100001]. Элемент arr[i] будет означать, что начиная с данного рыцаря все будут получать дополнительно по arr[i] монет. arr[i] может принимать и отрицательное значение, это значит, что начиная с данного, все рыцари будут получать на arr[i] монет меньше. Если пробежать по всему массиву и на очередном шаге прибавлять к переменной now arr[i], то на каждом шаге в этой переменной мы будем иметь количество денег, которое получит i-й рыцарь, и просто выведем это значение на консоль.

Структуры данных:
int arr = new int[100001] (Элемент arr[i] будет означать, что начиная с данного рыцаря все будут получать дополнительно по arr[i] монет. arr[i] может принимать и отрицательное значение, это значит, что начиная с данного, все рыцари будут получать на arr[i] монет меньше)

now - переменная, в которой на i-й итерации в последнем цикле будет храниться количество денег, получаемое i-м рыцарем

Алгоритм:
Считываем n. Запускаем цикл с n+1 итерацией. На каждой итерации считываем три числа: a, b, c. К переменной arr[a-1] прибавляем c, из переменной arr[b] вычитаем c. Запускаем следующий цикл с n итерациями. На i-й итерации прибавляем к now arr[i], после чего выводим now.

Примечание:
Использовал быстрый способ ввода-вывода данных, который рекомендуют на acm.timus.ru, без него задача также не проходит на 17-м тесте ограничение по времени.

0

4

А что нельзя было оставить массив одномерным и написать
arr[a-1]+=c;
arr[b]-=c;
А во втором цикле
now+=arr[i];

0

5

Вообще-то, да :) Исправлю решение

0


Вы здесь » Олимпиадное программирование » acm.timus.ru » 1491. Нереальная история