結果

問題 No.3017 交互浴
コンテスト
ユーザー yantaro
提出日時 2025-12-07 16:20:09
言語 C++17
(gcc 13.3.0 + boost 1.89.0)
結果
AC  
実行時間 448 ms / 2,000 ms
コード長 4,704 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,963 ms
コンパイル使用メモリ 206,840 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2025-12-07 16:20:42
合計ジャッジ時間 29,243 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 55
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include<bits/stdc++.h>
//#include<atcoder/all>
using namespace std;
//using namespace atcoder;

using ll = long long;
using ld = long double;

//using mint = modint; //mint::set_mod(M);
//using mint = modint998244353;
//using mint = modint1000000007;

template<class T> using pq = priority_queue<T>; //大きい順
template<class T> using pq_g = priority_queue<T, vector<T>, greater<T>>; //小さい順

#define vec_unique(v) v.erase(unique(v.begin(), v.end()), v.end()) //重複削除
#define vec_iota(v) iota(v.begin(), v.end(), 0) //0, 1, 2, 3, ..., n - 1にセット
#define concat(a, b) a.insert(a.end(), b.begin(), b.end())
#define debug(x) cerr << #x << " = " << x << endl
#define maxvalue(array) *max_element(array.begin(), array.end())
#define minvalue(array) *min_element(array.begin(), array.end())
#define sumvalue(array) accumulate(array.begin(), array.end(), 0ll)
#define popcount(x) __builtin_popcountll(x)

int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
//int dx[8] = {1, 1, 0, -1, -1, -1, 0, 1};
//int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};

#define INF 2e18
#define INF2 2e9

template <class T>
struct range_set {
   private:
	const T TINF = std::numeric_limits<T>::max() / 2;
	T sum;
	std::set<std::pair<T, T>> st;
   public:
	range_set() : sum(0) {
		st.emplace(-TINF, -TINF);
		st.emplace(TINF, TINF);
	}
	//[l, r) is covered?
	bool covered(const T l, const T r) {
		assert(l <= r);
		if(l == r) return true;
		auto itr = prev(st.upper_bound({l, TINF}));
		return itr->first <= l and r <= itr->second;
	}
	//[x, x + 1) is covered?
	bool covered(const T x) { return covered(x, x + 1); }
	// return section which covers[l, r)
	// if not exists, return[-TINF, -TINF)
	std::pair<T, T> covered_by(const T l, const T r) {
		assert(l <= r);
		if(l == r) return {-TINF, -TINF};
		auto itr = prev(st.upper_bound({l, TINF}));
		if(itr->first <= l and r <= itr->second) return *itr;
		return {-TINF, -TINF};
	}
	// return section which covers[x, x + 1)
	// if not exists, return[-TINF, -TINF)
	std::pair<T, T> covered_by(const T x) { return covered_by(x, x + 1); }
	// insert[l, r), and return increment
	T insert(T l, T r) {
		assert(l <= r);
		if(l == r) return T(0);
		auto itr = prev(st.upper_bound({l, TINF}));
		if(itr->first <= l and r <= itr->second) return T(0);
		T sum_erased = T(0);
		if(itr->first <= l and l <= itr->second) {
			l = itr->first;
			sum_erased += itr->second - itr->first;
			itr = st.erase(itr);
		} else
			itr = next(itr);
		while(r > itr->second) {
			sum_erased += itr->second - itr->first;
			itr = st.erase(itr);
		}
		if(itr->first <= r) {
			sum_erased += itr->second - itr->first;
			r = itr->second;
			st.erase(itr);
		}
		st.emplace(l, r);
		sum += r - l - sum_erased;
		return r - l - sum_erased;
	}
	// insert[x, x + 1), and return increment
	T insert(const T x) { return insert(x, x + 1); }
	// erase [l, r), and return decrement
	T erase(const T l, const T r) {
		assert(l <= r);
		if(l == r) return T(0);
		auto itr = prev(st.upper_bound({l, TINF}));
		if(itr->first <= l and r <= itr->second) {
			if(itr->first < l) st.emplace(itr->first, l);
			if(r < itr->second) st.emplace(r, itr->second);
			st.erase(itr);
			sum -= r - l;
			return r - l;
		}
		T ret = T(0);
		if(itr->first <= l and l < itr->second) {
			ret += itr->second - l;
			if(itr->first < l) st.emplace(itr->first, l);
			itr = st.erase(itr);
		} else
			itr = next(itr);
		while(itr->second <= r) {
			ret += itr->second - itr->first;
			itr = st.erase(itr);
		}
		if(itr->first < r) {
			ret += r - itr->first;
			st.emplace(r, itr->second);
			st.erase(itr);
		}
		sum -= ret;
		return ret;
	}
	// erase [x, x + 1), and return decrement
	T erase(const T x) { return erase(x, x + 1); }
	int size() const { return (int)st.size() - 2; }
	T mex(const T x = 0) const {
		auto itr = prev(st.upper_bound({x, TINF}));
		if(itr->first <= x and x < itr->second)
			return itr->second;
		else
			return x;
	}
	T sum_all() const { return sum; }
	std::set<std::pair<T, T>> get() const {
		std::set<std::pair<T, T>> res;
		for(auto &p : st) {
			if(std::abs(p.first) == TINF) continue;
			res.emplace(p.first, p.second);
		}
		return res;
	}
	void dump() const {
		std::cout << "range_set:";
		for(auto &p : st) {
			if(std::abs(p.first) == TINF) continue;
			std::cout << "[" << p.first << "," << p.second << "),";
		}
		std::cout << '\n';
	}
};


int main() {
    int n;
    cin >> n;
    range_set<int> st;
    vector<int> h(n);
    for(int i = 0; i < n; i++) {
        cin >> h[i];
        if(i % 2 == 0) st.insert(1, h[i] + 1);
        else st.erase(1, h[i] + 1);

        cout << st.sum_all() << endl;
    }


    //cout << fixed << setprecision(15) << << endl;
    return 0;
}
0