Ограничение времени 2 секунды Ограничение памяти 2...
创建于:2026年4月16日
使用 GPT-5.4 Thinking 回答 Chat01
创建于:2026年4月16日
使用 GPT-5.4 Thinking 回答 Chat01
Ограничение времени 2 секунды
Ограничение памяти 256 Мб
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
На кольцевой дороге длины
L
L вокруг Байтбурга расположены
N
N населённых пунктов. На кольцевой дороге где-то введена точка отсчёта и задано направление. Для каждого населённого пункта известно расстояние
X
i
X
i
на котором от точки отсчёта вдоль заданного направления он находится.
Для развития окрестностей города мэр Байтбурга решил провести
M
M линий связи вдоль этой кольцевой дороги. При этом
i
i-ая линия будет соединять населённые пункты с номерами
A
i
A
i
и
B
i
B
i
(города пронумерованы натуральными числами от 1 до
N
N). В силу разной важности этих линий они могут выполняться с использованием различных материалов. Материал
i
i-ой линии характеризуется числом
R
i
R
i
, которое обозначает величину затухания сигнала на каждую единицу длины линии.
Сигнал можно передать на некоторое расстояние тогда и только тогда, когда мощность источника будет не меньше произведения этого расстояния на
R
i
R
i
– величину затухания сигнала на каждую единицу длины используемой линии. Так как мощности передатчика может не хватать, то может потребоваться наличие ретрансляторов. На
i
i-ой линии разрешено размещать не более
K
i
K
i
ретрансляторов. Так как ретрансляторы требуют периодического обслуживания, то их можно устанавливать только в населённых пунктах. Ретранслятор может передавать дальше только тот сигнал, который ему может быть передан с учетом расстояния и затухания. При ретрансляции сигнал дальше распространяется так, как будто ретранслятор был его источником.
Для единообразия оборудования все передатчики и ретрансляторы должны иметь одинаковую мощность
P
P. Требуется найти минимальное целочисленное значение
P
P при котором для каждой линии
i
i можно будет передавать сигналы между городами
A
i
A
i
и
B
i
B
i
.
Формат ввода
В первой строке вводятся три разделённых одиночными пробелами натуральных числа
N
N,
M
M и
L
L. Во второй строке вводится
N
N разделённых одиночными пробелами целых неотрицательных чисел
X
i
X
i
. В следующих
M
M строках вводится по три разделённых одиночными пробелами натуральных числа
A
i
A
i
,
B
i
B
i
,
R
i
R
i
и отделённое от них одним пробелом целое неотрицательное число
K
i
K
i
. Гарантируется, что для любого допустимого индекса
i
i будет выполняться условие
A
i
≠
B
i
A
i
=B
i
, а также что все значения
X
i
X
i
различны и
0
≤
X
i
<
L
0≤X
i
<L.
Формат вывода
В первой строке выведите единственное натуральное число – минимальное значение
P
P, достаточное для работы всех линий.
Пример 1
Ввод
Вывод
2 1 5
2 4
2 1 3 0
6
Пример 2
Ввод
Вывод
2 1 5
1 4
1 2 3 0
6
Пример 3
Ввод
Вывод
4 1 8
7 4 1 6
3 4 3 1
6
Примечания
В первом примере линия соединяет вдоль отрезка кольцевой дороги, не проходящего через начало отсчёта, населенные пункты, расположенные на расстояниях 2 и 4 от начала отсчёта вдоль выбранного направления.
Во втором примере линия соединяет вдоль отрезка кольцевой дороги, проходящего через начало отсчёта, населенные пункты, расположенные на расстояниях 1 и 4 от начала отсчёта вдоль выбранного направления.
В третьем примере линия соединяет вдоль отрезка кольцевой дороги, проходящего через начало отсчёта, населенные пункты, расположенные на расстояниях 1 и 6 от начала отсчёта вдоль выбранного направления. Ретранслятор установлен в промежуточном населённом пункте на расстоянии 7 от начала отсчёта в выбранном направлении.
Подзадачи данной задачи представлены в следующей таблице
№ Зависит от Ограничения Максимальный балл
1 –
2
≤
N
≤
300
2≤N≤300,
M
≤
1
0
5
M≤10
5
,
K
i
≤
5
K
i
≤5 29
2 –
2
≤
N
≤
25
2≤N≤25,
M
≤
1
0
5
M≤10
5
30
3 1, 2
2
≤
N
≤
300
2≤N≤300,
M
≤
1
0
5
M≤10
5
41
Во всех тестах
A
i
≤
N
A
i
≤N,
B
i
≤
N
B
i
≤N,
R
i
≤
1
0
9
R
i
≤10
9
,
N
≤
L
≤
1
0
5
N≤L≤10
5
,
K
i
≤
N
K
i
≤N.
Реши задачу на с++
cpp#include <bits/stdc++.h> using namespace std; using ll = long long; static const int INF = 1e9; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; int L; cin >> N >> M >> L; vector<int> X(N); for (int i = 0; i < N; ++i) cin >> X[i]; struct Query { int a, b, r, k; }; vector<Query> queries(M); for (int i = 0; i < M; ++i) { cin >> queries[i].a >> queries[i].b >> queries[i].r >> queries[i].k; --queries[i].a; --queries[i].b; } // Сортируем города по положению на кольце. vector<pair<int,int>> ord; ord.reserve(N); for (int i = 0; i < N; ++i) ord.push_back({X[i], i}); sort(ord.begin(), ord.end()); vector<int> pos(N); // позиции в отсортированном порядке vector<int> sortedId(N); // какой исходный id стоит на этой позиции vector<int> placeOfId(N); // где находится исходный id в отсортированном порядке for (int i = 0; i < N; ++i) { pos[i] = ord[i].first; sortedId[i] = ord[i].second; placeOfId[ord[i].second] = i; } // bestCW[s][e][k] = минимально возможная максимальная длина одного прыжка // на дуге по часовой стрелке от s до e, если разрешено не более k ретрансляторов. // Храним в одном массиве. int KMAX = N; size_t SZ = (size_t)N * N * (KMAX + 1); vector<int> bestCW(SZ, INF); auto idx = [N, KMAX](int s, int e, int k) -> size_t { return ((size_t)s * N + e) * (KMAX + 1) + k; }; // Для каждой стартовой вершины считаем DP на линейной развертке по часовой стрелке. for (int s = 0; s < N; ++s) { vector<int> y(N); // y[j] = расстояние от s до (s+j) по часовой стрелке, y[0]=0 y[0] = 0; for (int j = 1; j < N; ++j) { int to = (s + j) % N; y[j] = (to >= s ? pos[to] - pos[s] : L - pos[s] + pos[to]); } vector<int> prev(N, INF), cur(N, INF); prev[0] = 0; // seg = число отрезков, relays = seg - 1 for (int seg = 1; seg <= N - 1; ++seg) { fill(cur.begin(), cur.end(), INF); int ptr = seg - 1; // допустимый минимум для последней точки разбиения for (int j = seg; j <= N - 1; ++j) { auto cost = [&](int t) -> int { return max(prev[t], y[j] - y[t]); }; while (ptr + 1 < j && cost(ptr + 1) <= cost(ptr)) { ++ptr; } cur[j] = cost(ptr); int e = (s + j) % N; int relays = seg - 1; bestCW[idx(s, e, relays)] = cur[j]; } prev.swap(cur); } // Если ретрансляторов больше, чем промежуточных городов на дуге, // ответ уже не улучшается. for (int j = 1; j <= N - 1; ++j) { int e = (s + j) % N; int maxUseful = j - 1; int val = bestCW[idx(s, e, maxUseful)]; for (int k = maxUseful + 1; k <= N; ++k) { bestCW[idx(s, e, k)] = val; } } } auto cwDist = [&](int s, int e) -> int { if (e >= s) return pos[e] - pos[s]; return L - pos[s] + pos[e]; }; ll answer = 0; for (const auto &q : queries) { int u = placeOfId[q.a]; int v = placeOfId[q.b]; int dCW = cwDist(u, v); int dCCW = L - dCW; ll need; if (dCW < dCCW) { int step = (v - u + N) % N; // число дуг между соседями на дуге CW int k = min(q.k, step - 1); need = 1LL * bestCW[idx(u, v, k)] * q.r; } else if (dCCW < dCW) { int step = (u - v + N) % N; // CW от v до u = CCW от u до v int k = min(q.k, step - 1); need = 1LL * bestCW[idx(v, u, k)] * q.r; } else { // Если обе полуокружности одинаковы, можно выбрать лучшую из двух. int step1 = (v - u + N) % N; int k1 = min(q.k, step1 - 1); ll need1 = 1LL * bestCW[idx(u, v, k1)] * q.r; int step2 = (u - v + N) % N; int k2 = min(q.k, step2 - 1); ll need2 = 1LL * bestCW[idx(v, u, k2)] * q.r; need = min(need1, need2); } answer = max(answer, need); } cout << answer << '\n'; return 0; }
Для одной линии фиксированы:
R,K ретрансляторов.Если на этой дуге выбрать несколько промежуточных городов, то сигнал идёт прыжками между соседними выбранными точками.
Для мощности P каждый прыжок длины d возможен тогда и только тогда, когда P >= d * R.
Значит для линии надо минимизировать максимальную длину одного прыжка на нужной дуге, используя не более K ретрансляторов.
Тогда требуемая мощность для линии равна:
Общий ответ — максимум по всем линиям.
Города сортируются по координате на кольце.
Для каждой стартовой точки s рассматриваем все города по часовой стрелке как линейную последовательность.
Пусть:
y[j] — расстояние от s до j-го города по часовой стрелке,dp[t][j] — минимально возможный максимум прыжка, если дойти до j за t отрезков связи.Переход:
Здесь p — последняя точка, где стоит ретранслятор.
Так как:
dp[t-1][p] не убывает по p,y[j]-y[p] не возрастает по p,оптимальный p двигается только вправо, поэтому переходы для фиксированного t можно считать двумя указателями за O(N).
Итого:
O(N^3),M запросов: O(M).При N <= 300, M <= 1e5 это проходит с большим запасом.
Если хочешь, я могу ещё отдельно расписать доказательство корректности этого DP.