結果
| 問題 |
No.1014 competitive fighting
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-03-20 22:29:48 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 154 ms / 2,000 ms |
| コード長 | 2,312 bytes |
| コンパイル時間 | 1,657 ms |
| コンパイル使用メモリ | 176,156 KB |
| 実行使用メモリ | 9,856 KB |
| 最終ジャッジ日時 | 2024-07-07 12:52:49 |
| 合計ジャッジ時間 | 8,292 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 51 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define repr(i, n) for (int i = (n) - 1; i >= 0; i--)
#define range(a) a.begin(), a.end()
constexpr int U = 1 << 17;
ll seg[U * 2];
void update(int k, ll v) {
k += U;
seg[k] = v;
while (k > 1) {
k /= 2;
seg[k] = max(seg[k * 2], seg[k * 2 + 1]);
}
}
ll query(int l, int r) {
l += U;
r += U - 1;
ll res = LLONG_MIN;
while (l <= r) {
if ((l & 1) == 1) res = max(res, seg[l++]);
if ((r & 1) == 0) res = max(res, seg[r--]);
l >>= 1;
r >>= 1;
}
return res;
}
template<class T>
struct BIT {
int n;
vector<T> dat;
BIT(int n_) : n(n_), dat(n_ + 1) {}
void update(int k, T v) {
assert(0 <= k && k < n);
for (int i = k + 1; i < dat.size(); i += i & -i) {
dat[i] += v;
}
}
T query(int k) {
assert(0 <= k && k <= n);
T res = 0;
for (int i = k; i > 0; i -= i & -i) {
res += dat[i];
}
return res;
}
T query(int l, int r) {
assert(0 <= l && l <= r && r <= n);
return query(r) - query(l);
}
T point(int k) {
return query(k + 1) - query(k);
}
};
int main() {
int N; cin >> N;
vector<ll> A(N), B(N), C(N);
rep(i, N) {
cin >> A[i] >> B[i] >> C[i];
}
vector<int> ord(N);
rep(i, N) ord[i] = i;
sort(range(ord), [&](int i, int j) {
return A[i] < A[j];
});
vector<ll> AA(N);
rep(i, N) {
AA[i] = A[ord[i]];
}
BIT<int> imp(N);
BIT<int> yet(N);
int now = 0;
vector<ll> ans(N, LLONG_MIN);
auto f = [&](auto f, int i) -> void {
if (imp.point(i)) return;
int j = upper_bound(range(AA), B[ord[i]] - C[ord[i]]) - AA.begin();
if (yet.query(j)) {
imp.update(i, 1);
return;
}
yet.update(i, 1);
while (now < j) {
int tmp = now++;
if (tmp != i) f(f, tmp);
}
yet.update(i, -1);
if (imp.query(j) > 0) {
imp.update(i, 1);
return;
}
ll tmp = query(0, j);
if (tmp == LLONG_MIN) {
tmp = 0;
}
ans[ord[i]] = tmp + B[ord[i]];
update(i, ans[ord[i]]);
};
rep(i, N) {
f(f, i);
}
rep(i, N) if (imp.point(i)) ans[ord[i]] = LLONG_MIN;
rep(i, N) {
if (ans[i] == LLONG_MIN) {
cout << "BAN\n";
} else {
cout << ans[i] << '\n';
}
}
}