結果

問題 No.833 かっこいい電車
ユーザー fine
提出日時 2019-05-24 21:50:50
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 142 ms / 2,000 ms
コード長 4,998 bytes
コンパイル時間 2,157 ms
コンパイル使用メモリ 184,280 KB
実行使用メモリ 9,984 KB
最終ジャッジ日時 2024-07-02 03:40:49
合計ジャッジ時間 4,933 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<int, int>;
// Description: set(map)O(log)
// #### attention! : [l, r] ( include r, not [l, r) )
class SegmentMap : public std::map<signed, signed> {
private:
bool flagToMergeAdjacentSegment;
public:
// if merge [l, c] and [c+1, r], set flagToMergeAdjacentSegment to true
SegmentMap(bool flagToMergeAdjacentSegment) :
flagToMergeAdjacentSegment(flagToMergeAdjacentSegment) {}
// __exist -> iterator pair(l, r) (contain p)
// noexist -> map.end()
auto get(signed p) const {
auto it = upper_bound(p);
if (it == begin() || (--it)->second < p) return end();
return it;
}
// insert segment [l, r]
void insert(signed l, signed r) {
auto itl = upper_bound(l), itr = upper_bound(r + flagToMergeAdjacentSegment);
if (itl != begin()) {
if ((--itl)->second < l - flagToMergeAdjacentSegment) ++itl;
}
if (itl != itr) {
l = std::min(l, itl->first);
r = std::max(r, std::prev(itr)->second);
erase(itl, itr);
}
(*this)[l] = r;
}
// remove segment [l, r]
void remove(signed l, signed r) {
auto itl = upper_bound(l), itr = upper_bound(r);
if (itl != begin()) {
if ((--itl)->second < l) ++itl;
}
if (itl == itr) return;
int tl = std::min(l, itl->first), tr = std::max(r, std::prev(itr)->second);
erase(itl, itr);
if (tl < l) (*this)[tl] = l - 1;
if (r < tr) (*this)[r + 1] = tr;
}
// Is p and q in same segment?
bool same(signed p, signed q) const {
const auto&& it = get(p);
return it != end() && it->first <= q && q <= it->second;
}
};
template <typename T>
struct SegmentTree {
int n;
vector<T> data;
T INITIAL_VALUE;
//使2
static T merge(T x, T y);
void updateNode(int k, T x);
SegmentTree(int size, T initial_value) {
n = 1;
INITIAL_VALUE = initial_value;
while (n < size) n *= 2;
data.resize(2 * n - 1, INITIAL_VALUE);
}
T getLeaf(int k) {
return data[k + n - 1];
}
void update(int k, T x) {
k += n - 1; //
updateNode(k, x);
while (k > 0) {
k = (k - 1) / 2;
data[k] = merge(data[k * 2 + 1], data[k * 2 + 2]);
}
}
//[a, b)
//k:, [l, r):
T query(int a, int b, int k, int l, int r) {
//[a, b)[l, r)
if (r <= a || b <= l) return INITIAL_VALUE;
//[a, b)[l, r)
if (a <= l && r <= b) return data[k];
else {
//
T vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
T vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
return merge(vl, vr);
}
}
//
T query(int a, int b) {
return query(a, b, 0, 0, n);
}
//: 使
//[a, b)
T query_fast(int a, int b) {
T vl = INITIAL_VALUE, vr = INITIAL_VALUE;
for (int l = a + n, r = b + n; l != r; l >>= 1, r >>= 1) {
if (l & 1) vl = merge(vl, data[l++ - 1]);
if (r & 1) vr = merge(data[--r - 1], vr);
}
return merge(vl, vr);
}
};
//使2
//
template <typename T>
T SegmentTree<T>::merge(T x, T y) {
return x + y;
}
template <typename T>
void SegmentTree<T>::updateNode(int k, T x) {
data[k] += x;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
int n, q;
cin >> n >> q;
SegmentMap sm(false);
SegmentTree<ll> st(n, 0);
for (int i = 0; i < n; i++) {
ll a;
cin >> a;
sm.insert(i, i);
st.update(i, a);
}
for (int i = 0; i < q; i++) {
int que, x;
cin >> que >> x;
x--;
if (que == 1) {
if (!sm.same(x, x + 1)) {
auto it1 = sm.get(x);
auto it2 = sm.get(x + 1);
P p(it1->first, it2->second);
sm.remove(it1->first, it1->second);
sm.remove(it2->first, it2->second);
sm.insert(p.first, p.second);
}
} else if (que == 2) {
if (sm.same(x, x + 1)) {
auto it = sm.get(x);
P p1(it->first, x), p2(x + 1, it->second);
sm.remove(it->first, it->second);
sm.insert(p1.first, p1.second);
sm.insert(p2.first, p2.second);
}
} else if (que == 3) {
st.update(x, 1);
} else {
auto it = sm.get(x);
cout << st.query(it->first, it->second + 1) << "\n";
}
}
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0