結果
問題 | No.618 labo-index |
ユーザー |
|
提出日時 | 2017-12-22 02:37:58 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 317 ms / 6,000 ms |
コード長 | 5,283 bytes |
コンパイル時間 | 2,645 ms |
コンパイル使用メモリ | 211,668 KB |
最終ジャッジ日時 | 2025-01-05 06:10:55 |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
ソースコード
#include <bits/stdc++.h>#define show(x) cerr << #x << " = " << x << endlusing namespace std;using ll = long long;template <typename T>constexpr T INF = numeric_limits<T>::max() / 16;template <typename T>ostream& operator<<(ostream& os, const vector<T>& v){os << "sz:" << v.size() << "\n[";for (const auto& p : v) {os << p << ",";}os << "]\n";return os;}template <typename Base>class BinaryIndexedTree{public:using T = typename Base::T;using AbelGroup = Base;BinaryIndexedTree(const int n) : data_num(n), size(1 << (__lg(2 * data_num - 1))), value(size + 1, AbelGroup::identity()) { assert(n > 0); }BinaryIndexedTree(const vector<T>& val) : data_num(val.size()), size(1 << (__lg(2 * data_num - 1))), value(size + 1, AbelGroup::identity()){for (int i = 1; i <= data_num; i++) {value[i] = val[i - 1];}for (int x = 1; x < size; x++) {value[x + (x & -x)] += value[x];}}T accumulate(const int a) const{assert(0 <= a and a < data_num);int ind = a + 1;T sum = AbelGroup::identity();while (ind > 0) {sum = op(sum, value[ind]);ind &= ind - 1;}return sum;}void add(const int a, const T& val){assert(0 <= a and a < data_num);int ind = a + 1;while (ind <= size) {value[ind] = op(value[ind], val);ind += ind & (-ind);}}void set(const int a, const T& val){const int v = get(a);add(a, op(val, op.inv(v)));}T get(const int a) const{assert(0 <= a and a < data_num);if (a == 0) {return accumulate(a);} else {return op(op.inv(accumulate(a - 1)), accumulate(a));}}int lowerBound(T w) const{if (w <= AbelGroup::identity()) {return 0;}int x = 0;for (int k = ((size == data_num) ? size : size / 2); k > 0; k /= 2) {if (x + k <= size and value[x + k] < w) {w = op(w, op.inv(value[x + k]));x += k;}}return x;}int upperBound(T w) const{if (w <= AbelGroup::identity()) {return 0;}int x = 0;for (int k = ((size == data_num) ? size : size / 2); k > 0; k /= 2) {if (x + k <= size and value[x + k] <= w) {w = op(w, op.inv(value[x + k]));x += k;}}return min(x, data_num);}const int data_num;private:const int size;const AbelGroup op{};vector<T> value;};struct Sum {using T = int;T operator()(const T& a, const T& b) const{return a + b;}T inv(const T& a) const{return -a;}static constexpr T identity(){return 0;}};ostream& operator<<(ostream& os, const BinaryIndexedTree<Sum>& bit){os << "[";for (int i = 0; i < bit.data_num; i++) {os << bit.get(i) << ",";}os << "]" << endl;return os;}int main(){cin.tie(0);ios::sync_with_stdio(false);ll Q;cin >> Q;using P = pair<int, ll>;vector<P> query(Q);vector<ll> comer{-INF<ll>};ll offset = 0; //今までどれだけ底上げしたかfor (int i = 0; i < Q; i++) {int t;ll x;cin >> t >> x;if (t == 1) {const ll power = x - offset;comer.push_back(power);query[i] = make_pair(t, power);} else if (t == 2) {const ll power = comer[x];query[i] = make_pair(t, power);} else {offset += x;query[i] = make_pair(t, x);}}sort(comer.begin(), comer.end());comer.erase(unique(comer.begin(), comer.end()), comer.end());map<ll, int> mp;for (int i = 0; i < comer.size(); i++) {mp[comer[i]] = i;}const int size = comer.size();BinaryIndexedTree<Sum> bit(size);offset = 0;int num = 0;for (const auto& q : query) {const int t = q.first;const ll x = q.second;if (t == 1) {bit.add(mp[x], 1);num++;} else if (t == 2) {bit.add(mp[x], -1);num--;} else {offset += x;}int inf = 0;int sup = size;while (inf < sup) {const int mid = (inf + sup) / 2;const int number = num - (mid == 0 ? 0 : bit.accumulate(mid - 1));const ll value = offset + comer[mid];if (value <= number) {if (inf == mid) {break;}inf = mid;} else {sup = mid;}}const int lnumber = num - (inf == 0 ? 0 : bit.accumulate(inf - 1));const ll lvalue = offset + comer[inf];const int rnumber = num - bit.accumulate(sup - 1);const ll rvalue = (sup == size ? INF<ll> : offset + comer[sup]);cout << max(lvalue, (ll)rnumber) << endl;}return 0;}