結果
| 問題 | No.3446 Range Adjacent Differences |
| ユーザー |
kidodesu
|
| 提出日時 | 2026-02-12 22:03:08 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,736 bytes |
| 記録 | |
| コンパイル時間 | 2,315 ms |
| コンパイル使用メモリ | 200,596 KB |
| 実行使用メモリ | 55,040 KB |
| 最終ジャッジ日時 | 2026-02-18 20:52:00 |
| 合計ジャッジ時間 | 33,820 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 TLE * 9 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// 階層型ビットセットの最大範囲 (2^24 = 16,777,216)
const int MAX_VAL = 1 << 24;
const int D_SIZE = 20000005;
struct HierarchicalBitset {
vector<uint64_t> layers[4];
HierarchicalBitset() {
layers[0].resize(1);
layers[1].resize(64);
layers[2].resize(4096);
layers[3].resize(262144);
}
void add(int a) {
for (int i = 3; i >= 0; --i) {
int a0 = a & 63;
a >>= 6;
if (layers[i][a] & (1ULL << a0)) return;
layers[i][a] |= (1ULL << a0);
}
}
void dec(int a) {
for (int i = 3; i >= 0; --i) {
int a0 = a & 63;
a >>= 6;
layers[i][a] ^= (1ULL << a0);
if (layers[i][a]) break; // 上位層がまだ0でなければ停止
}
}
// Predecessor: a以下の最大値 (Pythonのbslに相当)
int bsl(int a) {
if (a < 0) return -1;
// aを含まない「未満」を探す場合は a -= 1 するが、元のコードは a+1 してから探索
// ここでは inclusive (a以下) として実装
for (int i = 3; i >= 0; --i) {
uint64_t mask = (1ULL << (a & 63)) | ((1ULL << (a & 63)) - 1);
uint64_t x = layers[i][a >> 6] & mask;
if (x) {
int rep = ((a >> 6) << 6) | (63 - __builtin_clzll(x));
for (int j = i + 1; j < 4; ++j) {
rep = (rep << 6) | (63 - __builtin_clzll(layers[j][rep]));
}
return rep;
}
a = (a >> 6) - 1;
if (a < 0) break;
}
return -1;
}
// Successor: a以上の最小値 (Pythonのbsrに相当)
int bsr(int a) {
if (a >= MAX_VAL) return -1;
for (int i = 3; i >= 0; --i) {
uint64_t mask = ~((1ULL << (a & 63)) - 1);
uint64_t x = layers[i][a >> 6] & mask;
if (x) {
int rep = ((a >> 6) << 6) | __builtin_ctzll(x);
for (int j = i + 1; j < 4; ++j) {
rep = (rep << 6) | __builtin_ctzll(layers[j][rep]);
}
return rep;
}
a = (a >> 6) + 1;
if (a >= (1 << (6 * i))) break;
}
return -1;
}
};
int D[D_SIZE];
int cnt0 = 0;
HierarchicalBitset X, Y;
void f0(int a) {
D[a]++;
if (D[a] > 1) {
cnt0++;
return;
}
int al = X.bsl(a - 1);
int ar = X.bsr(a + 1);
X.add(a);
if (al != -1 && ar != -1) {
int diff = ar - al;
if (--D[10000000 + diff] == 0) Y.dec(diff);
}
if (al != -1) {
int diff = a - al;
if (++D[10000000 + diff] == 1) Y.add(diff);
}
if (ar != -1) {
int diff = ar - a;
if (++D[10000000 + diff] == 1) Y.add(diff);
}
}
void f1(int a) {
D[a]--;
if (D[a] > 0) {
cnt0--;
return;
}
X.dec(a);
int al = X.bsl(a - 1);
int ar = X.bsr(a + 1);
if (al != -1 && ar != -1) {
int diff = ar - al;
if (++D[10000000 + diff] == 1) Y.add(diff);
}
if (al != -1) {
int diff = a - al;
if (--D[10000000 + diff] == 0) Y.dec(diff);
}
if (ar != -1) {
int diff = ar - a;
if (--D[10000000 + diff] == 0) Y.dec(diff);
}
}
struct Query {
int t, l, r, x, id;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<int> A(n);
for (int i = 0; i < n; ++i) cin >> A[i];
int block_size = max(1, (int)(n / sqrt(q + 1)));
vector<Query> queries(q);
for (int i = 0; i < q; ++i) {
string c;
cin >> queries[i].l >> queries[i].r >> queries[i].x >> c;
queries[i].l--;
queries[i].t = (c == "L" ? 0 : 1);
queries[i].id = i;
}
sort(queries.begin(), queries.end(), [&](const Query& a, const Query& b) {
int ablock = a.l / block_size;
int bblock = b.l / block_size;
if (ablock != bblock) return ablock < bblock;
return (ablock % 2 == 0) ? (a.r < b.r) : (a.r > b.r);
});
vector<int> ans(q);
int nl = 0, nr = 0;
for (auto& qry : queries) {
while (qry.l < nl) f0(A[--nl]);
while (nr < qry.r) f0(A[nr++]);
while (nl < qry.l) f1(A[nl++]);
while (qry.r < nr) f1(A[--nr]);
int res;
if (qry.t == 0) {
res = Y.bsl(qry.x);
if (cnt0 > 0) res = max(res, 0);
} else {
res = Y.bsr(qry.x);
}
ans[qry.id] = res;
}
for (int x : ans) cout << x << "\n";
return 0;
}
kidodesu