結果
| 問題 |
No.511 落ちゲー 〜手作業のぬくもり〜
|
| コンテスト | |
| ユーザー |
e869120
|
| 提出日時 | 2018-06-10 11:49:40 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,266 ms / 4,000 ms |
| コード長 | 1,630 bytes |
| コンパイル時間 | 701 ms |
| コンパイル使用メモリ | 77,072 KB |
| 実行使用メモリ | 8,064 KB |
| 最終ジャッジ日時 | 2024-11-24 12:42:47 |
| 合計ジャッジ時間 | 10,323 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 32 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
long long H, W, N, X[100009], A[100009], B[100009], bit[100009];
long long Backet = 300, D[1009]; vector<long long>F[1009];
long long refresh(long long l, long long r, long long x, long long E) {
long long sum = 0, A = D[E];
for (int i = E*Backet; i < (E + 1)*Backet; i++) {
if (l <= i && i <= r) {
if (bit[i] + A >= H - x && bit[i] + A < H) sum++; bit[i] += x;
}
}
F[E].clear();
for (int i = E*Backet; i < (E + 1)*Backet; i++) F[E].push_back(bit[i]);
sort(F[E].begin(), F[E].end());
return sum;
}
long long gets(long long p, long long x) {
int pos1 = lower_bound(F[p].begin(), F[p].end(), H - D[p]) - F[p].begin();
long long sum = 0;
for (int i = pos1 - 1; i >= 0; i--) {
if (F[p][i] >= (H - x) - D[p]) sum++;
else break;
}
D[p] += x;
return sum;
}
long long add(long long l, long long r, long long x) {
if (l / Backet == r / Backet) {
return refresh(l, r, x, l / Backet);
}
long long L = l / Backet, R = r / Backet, ret = 0;
ret += refresh(l, r, x, L);
ret += refresh(l, r, x, R);
for (int i = L + 1; i <= R - 1; i++) ret += gets(i, x);
return ret;
}
int main() {
cin >> N >> W >> H;
long long A1 = 0, B1 = 0;
for (int i = 1; i <= W; i++) F[i / Backet].push_back(0);
for (int i = 1; i <= N; i++) {
cin >> A[i] >> B[i] >> X[i];
long long G = add(X[i], X[i] + A[i] - 1, B[i]);
if (i % 2 == 1) A1 += G;
else B1 += G;
//cout << "! " << i << " " << A1 << " " << B1 << endl << endl;
}
if (A1 > B1) cout << "A" << endl;
else if (A1 < B1) cout << "B" << endl;
else cout << "DRAW" << endl;
return 0;
}
e869120