結果
| 問題 |
No.618 labo-index
|
| コンテスト | |
| ユーザー |
sekiya9311
|
| 提出日時 | 2017-12-20 01:05:28 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,184 bytes |
| コンパイル時間 | 2,161 ms |
| コンパイル使用メモリ | 187,156 KB |
| 実行使用メモリ | 21,628 KB |
| 最終ジャッジ日時 | 2024-12-16 02:45:21 |
| 合計ジャッジ時間 | 10,306 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 33 WA * 2 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
// 区間加算,区間参照
// 半開区間!!!
template<typename T = int>
class RangeAddQuery {
private:
vector<T> data, lazy;
int sz;
void push(int k, int l, int r) {
if (this->lazy[k]) {
this->data[k] += this->lazy[k] * (r - l);
if (k * 2 + 2 < sz * 2 - 1) {
this->lazy[2 * k + 1] += this->lazy[k];
this->lazy[2 * k + 2] += this->lazy[k];
}
this->lazy[k] = 0;
}
}
void add(int l, int r, int L, int R, int k, T val) {
this->push(k, l, r);
if (L <= l && r <= R) {
this->lazy[k] += val;
this->push(k, l, r);
} else if (R <= l || r <= L) {
return;
} else if (r - l > 1) {
const int mid = (l + r) / 2;
this->add(l, mid, L, R, k * 2 + 1, val);
this->add(mid, r, L, R, k * 2 + 2, val);
data[k] = data[k * 2 + 1] + data[k * 2 + 2];
}
}
T query(int l, int r, int L, int R, int k) {
this->push(k, l, r);
if (L <= l && r <= R) {
return data[k];
} else if (R <= l || r <= L) {
return 0;
} else {
const int mid = (l + r) / 2;
const T left = this->query(l, mid, L, R, k * 2 + 1);
const T right = this->query(mid, r, L, R, k * 2 + 2);
return left + right;
}
}
public:
RangeAddQuery(const int n) {
this->sz = 1;
while (this->sz < n) this->sz <<= 1;
this->data.resize(this->sz * 2 - 1);
this->lazy.resize(this->sz * 2 - 1);
}
void add(int l, int r, T val) {
this->add(0, this->sz, l, r, 0, val);
}
T query(int l, int r) {
return this->query(0, this->sz, l, r, 0);
}
};
const int MAX = 1e5 + 10;
int Q;
long long t[MAX], x[MAX], prevX[MAX];
vector<pair<int, long long>> addCntIdx;// addCntIdx[i] = i番目に入ってきたやつのidx, その時点での区間加算値
map<long long, int> comp;
RangeAddQuery<long long> raq(MAX);
int main() {
scanf("%d", &Q);
for (int i = 0; i < Q; i++) {
scanf("%lld%lld", t + i, x + i);
}
{
set<long long> se;
long long range = 0;
for (int i = 0; i < Q; i++) {
if (t[i] == 1) {
// add
se.insert(x[i] - range);
addCntIdx.emplace_back(i, range);
} else if (t[i] == 2) {
// erase
} else {
// up power
range += x[i];
}
}
{
int cnt = 0;
for (long long e : se) {
comp[e] = cnt++;
}
comp[*max_element(begin(se), end(se))] = cnt + 1;
}
}
{
long long range = 0;
int hCnt = 0;
for (int i = 0; i < Q; i++) {
if (t[i] == 1) {
// add
const int idx = comp[x[i] - range];
raq.add(idx, idx + 1, 1);
hCnt++;
} else if (t[i] == 2) {
// erase
const auto idxAndRageAddVal = addCntIdx[x[i] - 1];
const int idx = addCntIdx[x[i] - 1].first;
const long long preRange = addCntIdx[x[i] - 1].second;
const int cmpIdx = comp[x[idx] - preRange];
raq.add(cmpIdx, cmpIdx + 1, -1);
hCnt--;
} else {
// up power
range += x[i];
}
long long low = 0, high = hCnt + 1;
while (high - low > 1) {
const long long mid = low + (high - low) / 2;
//cerr << mid << endl;
auto itr = comp.lower_bound(mid - range);
if (raq.query(itr->second, MAX) >= mid) {
low = mid;
} else {
high = mid;
}
}
printf("%lld\n", low);
}
}
return 0;
}
sekiya9311