結果
| 問題 | No.3017 交互浴 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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 |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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;
}