ABC 333
Table of Contents
https://atcoder.jp/contests/abc333
A. Three Threes
https://atcoder.jp/contests/abc333/tasks/abc333_a
B. Pentagon
https://atcoder.jp/contests/abc333/tasks/abc333_b
C. Repunit Trio
https://atcoder.jp/contests/abc333/tasks/abc333_c
D. Erase Leaves
https://atcoder.jp/contests/abc333/tasks/abc333_d
E. Takahashi Quest
https://atcoder.jp/contests/abc333/tasks/abc333_e
2026/2/23 カッコ列の類似問題と知った状態で自力 AC
https://atcoder-novisteps.vercel.app/workbooks/141
void solve() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
using P = pair<int, int>;
vector<P> queries(N);
rep(i, N) {
int t, x;
cin >> t >> x;
x--;
queries[i] = {t, x};
}
// ポーションをすべて拾ってモンスターをすべてのモンスターを倒すことができるか確認
{
vint his(N);
for (auto [t, x] : queries) {
if (t == 1) {
his[x]++;
} else {
his[x]--;
if (his[x] < 0) {
cout << -1 << endl;
return;
}
}
}
}
// 無駄にポーションを持ちたくないので、モンスターが出現するタイミングと近いポーションを拾うのが最適なので後ろから調べてどのポーションを拾うかを決定する
vint must_use(N), monster(N);
for (int i = N - 1; i >= 0; i--) {
auto [t, x] = queries[i];
if (t == 1) {
if (monster[x]) {
must_use[i] = 1;
monster[x]--;
}
} else {
monster[x]++;
}
}
// 拾うポーションを決めた状態でシミュレーションして最大保持数を調べる
ll sum = 0, ans = 0;
vint portion(N);
vint track;
rep(i, N) {
auto [t, x] = queries[i];
if (t == 1) {
int u = 0;
if (must_use[i]) {
sum++;
chmax(ans, sum);
u = 1;
}
track.push_back(u);
} else {
sum--;
}
}
cout << ans << endl;
print(track);
}
F. Bomb Game 2
https://atcoder.jp/contests/abc333/tasks/abc333_f