#include <bits/stdc++.h> #define int long long usi...
Tạo vào: 14 tháng 8, 2026
Trả lời bằng GPT-5.6 Thinking bởi Chat01
Tạo vào: 14 tháng 8, 2026
Trả lời bằng GPT-5.6 Thinking bởi Chat01
#include <bits/stdc++.h>
#define int long long
using namespace std;
using i128 = __int128;
using ld = long double;
const int INF = 1e15;
const int N = 1e3 + 7;
const int MOD = 1e9 + 7;
void solve() {
int n, ans = 0;
cin >> n;
bitset< 30 > b(n);
for (int i = 0; i < 30; i++) {
if (b[i]) ans++;
}
cout << (1LL << ans) << "\n";
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
srand(time(0));
int tests = 1;
cin >> tests;
while (tests--) {
solve();
}
return 0;
}
#include <bits/stdc++.h>
#define int long long
using namespace std;
using i128 = __int128;
using ld = long double;
const int INF = 1e15;
const int N = 1e6 + 7;
const int MOD = 1e9 + 7;
void solve() {
int n, q;
cin >> n >> q;
string s;
cin >> s;
vector< int > pref(n + 1);
for (int i = 1; i <= n; i++) {
pref[i] = pref[i - 1] + (s[i - 1] - '0');
}
vector<int> pw(n + 1, 1);
for (int i = 1; i <= n; i++) {
pw[i] = (pw[i - 1] * 2) % MOD;
}
while (q--) {
int l, r;
cin >> l >> r;
int x = r - l + 1;
int y = x - (pref[r] - pref[l - 1]);
cout << (pw[x] - pw[y] + MOD) % MOD << "\n";
}
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
srand(time(0));
int tests = 1;
//cin >> tests;
while (tests--) {
solve();
}
return 0;
}
#include <bits/stdc++.h>
#define int long long
using namespace std;
using i128 = __int128;
using ld = long double;
const int INF = 1e15;
const int N = 1e3 + 7;
const int MOD = 1e9 + 7;
void solve() {
int n = 3;
vector< int > a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.begin(), a.end());
cout << max(0LL, 1 + a[2] - a[1] - a[0]);
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
srand(time(0));
int tests = 1;
//cin >> tests;
while (tests--) {
solve();
}
return 0;
}
вот примеры как я пишу коды запомни стилистику и всегда пиши код в моей стилистике и пиши только в solve шаблон остовляй
есле функция требует хотябы знать масив ты пишешь функцию auto f = [&](int x) {};
есле надо рекурсию то через function а есле тебе не надо масивы а пару перепенных тогда пишешь за solve функцию как обычно
Барчин и Чарос играют в игру на сетке из 2N×2M
клеток. Строки пронумерованы от 0
до 2N−1
сверху вниз, а столбцы — от 0
до 2M−1
слева направо. Для 0≤i<2N
и 0≤j<2M
обозначим клетку в строке i
и столбце j
как (i,j)
.
Барчин выдает Чарос N⋅M
блоков один за другим. Каждый блок представляет собой квадрат 2×2
, состоящий из четырех плиток 1×1
. Каждая плитка покрашена либо в черный, либо в белый цвет, при этом гарантируется, что хотя бы одна плитка белая.
Чарос должна разместить каждый блок на сетке сразу после его получения, не зная, какие блоки она получит позже. Блоки нельзя вращать. Каждый блок должен быть полностью помещен внутри сетки, покрывая ровно четыре клетки сетки. Кроме того, верхняя левая плитка каждого блока должна покрывать клетку, координаты строки и столбца которой четные. Каждая клетка сетки может быть покрыта не более чем одним блоком.
Барчин выигрывает игру, если после размещения очередного блока образуется квадрат из клеток размером 2×2
, покрытый четырьмя черными плитками. Формально, если клетки (a,b)
, (a+1,b)
, (a,b+1)
, (a+1,b+1)
покрыты черными плитками для некоторых 0≤a<2N−1
и 0≤b<2M−1
, то Барчин выигрывает. Индексы a
и b
не обязательно должны быть четными.
Чарос победит, если расставит все N⋅M
блоков, не допустив того, чтобы в процессе игры Барчин выиграла. Обратите внимание, что размещенные N⋅M
блоков полностью покроют сетку.
Ваша задача — разработать стратегию, которая позволит Чарос выиграть игру. Можно доказать, что при заданных ограничениях Чарос всегда может расставить блоки так, чтобы гарантировать победу независимо от раскраски блоков, которые она получит позже.
Детали реализации
Вам следует реализовать две функции:
void init(int N, int M)
N
: половина количества строк в сетке.
M
: половина количества столбцов в сетке.
Функция вызывается ровно один раз для каждого теста, в начале выполнения вашей программы.
std::pair<int, int> receive_block(int TL, int TR, int BL, int BR)
TL
, TR
, BL
, BR
: цвета верхней левой, верхней правой, нижней левой и нижней правой плиток текущего блока соответственно, как показано на рисунке ниже. Каждое значение равно либо 0
(белый), либо 1
(черный).
Эта функция вызывается ровно N⋅M
раз для каждого теста после первоначального вызова init.
Эта функция должна возвращать пару целых чисел (i,j)
, где i
— координата строки, а j
— координата столбца клетки, в которую следует поместить верхнюю левую плитку этого блока. Значения i
и j
должны быть четными, а область 2×2
, покрываемая блоком, не должна перекрывать ни один из ранее размещенных блоков.
Если receive_block вернет пару, не удовлетворяющую этим требованиям, или если после размещения блока появится квадрат из клеток размером 2×2
, полностью покрытый черными плитками, грейдер немедленно завершит вашу программу, и вердикт по тесту будет Output isn't correct.
Поведение грейдера не является адаптивным. Это означает, что последовательность блоков, которые Барчин передает Чарос, фиксируется до вызова функции init.
Ограничения
Пусть S
— количество черных плиток среди четырех плиток отдельного блока. То есть S=TL+TR+BL+BR
.
1≤N,M≤100
0≤S≤3
для каждого блока.
Входные данные
Пример грейдера считывает входные данные в следующем формате:
строка 1
: N M
строка 2+k
(0≤k<NM
): TL[k] TR[k] BL[k] BR[k]
Выходные данные
Пример грейдера выводит результат в следующем формате:
строка 1+k
(0≤k<NM
): R[k] C[k]
Здесь R[k]
и C[k]
— пара целых чисел, возвращаемых k
-м вызовом функции receive_block.
Система оценки
Подзадача Баллы Дополнительные ограничения
1
6
S=1
для каждого блока, и N=2
.
2
16
S=3
для каждого блока. N=M
, N
— четное число, и каждая из четырех возможных раскрасок блоков встречается ровно N2/4
раз.
3
10
S=1
для каждого блока.
4
29
S≤2
для каждого блока.
5
39
Нет дополнительных ограничений.
Пример
Входные данныеСкопировать
1 2
1 0 1 1
0 1 1 1
Выходные данныеСкопировать
0 0
0 2
Примечание
Рассмотрим игру, в которой N=1
и M=2
, так что сетка имеет 2
строки и 4
столбца. Сначала грейдер вызывает:
init(1, 2)
Изначально все клетки сетки пусты. Сетка выглядит следующим образом:
Всего нужно разместить N⋅M=2
блока. Предположим, Барчин выдает блок с тремя черными и одной белой плиткой в верхнем правом углу. Грейдер вызывает:
receive_block(1, 0, 1, 1)
Чарос решает разместить этот блок в левой части сетки, вернув (0,0)
.
Теперь сетка выглядит так:
Затем Барчин выдает еще один блок с тремя черными и одной белой плиткой в верхнем левом углу:
receive_block(0, 1, 1, 1)
Единственная оставшаяся клетка с четными координатами строки и столбца, которая может служить верхним левым углом блока размером 2×2
, — это (0,2)
, поэтому Чарос возвращает (0,2)
. В итоге сетка выглядит так:
Ни один квадрат 2×2
не покрыт полностью черными плитками, поэтому Чарос успешно разместила все блоки, не позволив Барчин выиграть. Чарос выигрывает игру.
условие я дал напиши решение по моеё идее
идея: закинуть все блоки по 4 разным масивам типо есть белая в каком углу и потом идти по очереди самой матрицы
и смотришь есле у тебя есть 1 тип блока то исходя от того какой он ты ставишь его типо есле это нижний левый то он в 4 блоках должен стоять сверху права в 4 блоках и потом пытаешься поставить противоположный блок в лево снизу есле таких нету берёшь и побокам кидаешь 2 других возможных есле их нету кидаешь первоначальных и в ласт кидаешь ту который блоков макс
вот стратегия заполнения она ебланская но я так и хочу поэтому напиши так как человек не мудри очень сложно и лучше напиши ифами
Да, здесь твоя идея сводится к ещё более простому варианту: выбираем белый угол и ставим блок с противоположной стороны. Накапливать блоки нельзя, потому что по условию receive_block обязан поставить текущий блок сразу; официальный подход делает именно такое онлайн-размещение. (QOJ)
Если ты сейчас гоняешь через обычный ввод/вывод из условия, то в твоём стиле solve получается так:
cppvoid solve() { int n, m; cin >> n >> m; vector< pair< int, int > > a(n, {0, m - 1}); int up = 0, down = n - 1; for (int z = 0; z < n * m; z++) { int TL, TR, BL, BR; cin >> TL >> TR >> BL >> BR; int x, y; if (TL && TR) { if (a[up].first > a[up].second) { up++; } x = up; if (!BR) { y = a[up].first; a[up].first++; } else { y = a[up].second; a[up].second--; } } else { if (a[down].first > a[down].second) { down--; } x = down; if (!TR) { y = a[down].first; a[down].first++; } else { y = a[down].second; a[down].second--; } } cout << x * 2 << " " << y * 2 << "\n"; } }
Логика прям твоя:
BR белая → ставим слева;BL белая → ставим справа;TR белая → слева;TL белая → справа.То есть белая клетка всегда смотрит внутрь ещё незаполненной части. Поэтому между соседними блоками обязательно остаётся белая клетка, и полностью чёрный 2x2 не возникает. Это соответствует принятой модельной стратегии для задачи. (GitHub)
Для официальной отправки IOI нужен не solve, а именно init + receive_block, потому что такой интерфейс требует грейдер. (oj.uz)
Твою стилистику буду соблюдать в этой переписке: обычные for, простые if, vector<int>, без классов и лишних функций; если лямбде нужны массивы — auto f = [&]..., рекурсия через function. Чтобы это сохранялось и в новых чатах, включи Settings → Personalization → Memory.