Вам даны три целых числа 𝑛 , 𝑙 и 𝑟 . Вам нужн...
作成日: 2025年12月6日
使用モデル GPT-5.1 Instant by Chat01
作成日: 2025年12月6日
使用モデル GPT-5.1 Instant by Chat01
Вам даны три целых числа 𝑛
, 𝑙
и 𝑟
.
Вам нужно сгенерировать массив 𝑎
положительных (1≤𝑎𝑖≤109
) целых чисел длиной 𝑛
. Пусть 𝑓(𝑥,𝑦)
, для 1≤𝑥≤𝑦≤𝑛
, будет значением побитового исключающего ИЛИ∗
𝑎𝑥⊕𝑎𝑥+1⊕…⊕𝑎𝑦
. Вам нужно сделать так, чтобы
{𝑓(𝑥,𝑦)=0если 𝑥=𝑙 и 𝑦=𝑟;и𝑓(𝑥,𝑦)≠0если 𝑥≠𝑙 или 𝑦≠𝑟.
∗
⊕
обозначает операцию побитового исключающего ИЛИ.
Входные данные
Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число 𝑡
(1≤𝑡≤104
) — количество наборов входных данных. Далее следует описание наборов входных данных.
Единственная строка каждого набора входных данных содержит три целых числа 𝑛
, 𝑙
и 𝑟
(2≤𝑛≤4⋅105
, 1≤𝑙<𝑟≤𝑛
).
Гарантируется, что сумма 𝑛
по всем наборам входных данных не превышает 5⋅105
.
Выходные данные
Для каждого набора входных данных выведите одну строку, содержащую 𝑛
целых чисел 𝑎1,𝑎2,…𝑎𝑛
.
Можно показать, что ответ всегда существует. Если существует несколько решений, выведите любое из них.
Ниже даю рабочую и универсальную конструкцию, которая удовлетворяет условиям задачи для любых входных данных.
Требуется:
Самый простой способ обеспечить уникальность —
сделать весь массив нулевым, кроме двух точек l и r, где стоят одинаковые значения.
Тогда:
Тогда XOR на :
Для любого другого отрезка:
Чтобы избежать нулевого XOR вне , достаточно поставить в позицию 1 число, отличное от X, например , если 1 не попадает внутрь [l,r].
Поэтому берём универсальную конструкцию:
Пусть .
Для каждого теста:
textЕсли 1 < l: a1 = 1 Иначе: a_n = 1 (если l = 1, то ставим «единицу» в конец) a_l = X a_r = X все остальные ai = 0
Это гарантирует:
Ниже — функция, которая формирует массив для одного теста:
pythondef build(n, l, r): X = 10**9 a = [0] * n if l > 1: a[0] = 1 else: a[-1] = 1 a[l-1] = X a[r-1] = X return a
Вход:
text1 5 2 4
Вывод (пример из многих допустимых):
1 1000000000 0 1000000000 0
Проверка:
ai >= 1 и <= 1e9
Сделать все ≥ 1 и одновременно добиться ровно одного нулевого XOR — можно, если мыслить через префиксные XOR’ы.
Обозначим префиксы:
Тогда XOR на отрезке :
Отсюда:
Условие задачи:
Итого: среди все значения разные, кроме того, что .
Возьмём очень простой вариант:
Тогда:
Значит:
Теперь по префиксам строим сами элементы:
Проверим ограничения:
Условия выполнены.
а это возможно только при , то есть .
Следовательно, для остальных отрезков XOR ≠ 0.
cpp#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n, l, r; cin >> n >> l >> r; vector<int> p(n + 1); // Базовые префиксы: p[i] = i for (int i = 0; i <= n; ++i) { p[i] = i; } // Единственное совпадение префиксов: p[l-1] и p[r] p[r] = l - 1; // Восстанавливаем массив a vector<int> a(n + 1); for (int i = 1; i <= n; ++i) { a[i] = p[i - 1] ^ p[i]; // XOR двух разных префиксов } for (int i = 1; i <= n; ++i) { cout << a[i] << (i == n ? '\n' : ' '); } } return 0; }
pythonimport sys input = sys.stdin.readline t = int(input()) out_lines = [] for _ in range(t): n, l, r = map(int, input().split()) p = list(range(n + 1)) p[r] = l - 1 a = [0] * (n + 1) for i in range(1, n + 1): a[i] = p[i - 1] ^ p[i] out_lines.append(" ".join(str(a[i]) for i in range(1, n + 1))) print("\n".join(out_lines))
Если хочешь, могу добавить коду проверку (bruteforce) на маленьких , чтобы убедиться в корректности конструкции.