結果
問題 | No.674 n連勤 |
ユーザー |
|
提出日時 | 2024-04-08 20:12:46 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 24 ms / 2,000 ms |
コード長 | 6,667 bytes |
コンパイル時間 | 4,880 ms |
コンパイル使用メモリ | 200,568 KB |
最終ジャッジ日時 | 2025-02-20 23:13:39 |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
#line 2 "library/template/template.hpp"#include <bits/stdc++.h>#line 3 "library/template/macro.hpp"#define all(x) std::begin(x), std::end(x)#define rall(x) std::rbegin(x), std::rend(x)#define elif else if#define updiv(N, X) (((N) + (X) - (1)) / (X))#define sigma(a, b) ((a + b) * (b - a + 1) / 2)#define INT(...) \int __VA_ARGS__; \scan(__VA_ARGS__)#define LL(...) \ll __VA_ARGS__; \scan(__VA_ARGS__)#define STR(...) \string __VA_ARGS__; \scan(__VA_ARGS__)#define CHR(...) \char __VA_ARGS__; \scan(__VA_ARGS__)#define DOU(...) \double __VA_ARGS__; \scan(__VA_ARGS__)#define LD(...) \ld __VA_ARGS__; \scan(__VA_ARGS__)#define pb push_back#define eb emplace_back#line 3 "library/template/alias.hpp"using ll = long long;using ld = long double;using pii = std::pair<int, int>;using pll = std::pair<ll, ll>;constexpr int inf = 1 << 30;constexpr ll INF = 1LL << 60;constexpr int dx[8] = {1, 0, -1, 0, 1, -1, 1, -1};constexpr int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};constexpr int mod = 998244353;constexpr int MOD = 1e9 + 7;#line 3 "library/template/func.hpp"template <typename T>inline bool chmax(T& a, T b) { return ((a < b) ? (a = b, true) : (false)); }template <typename T>inline bool chmin(T& a, T b) { return ((a > b) ? (a = b, true) : (false)); }template <typename T, typename U>std::ostream &operator<<(std::ostream &os, const std::pair<T, U> &p) {os << p.first << " " << p.second;return os;}template <typename T, typename U>std::istream &operator>>(std::istream &is, std::pair<T, U> &p) {is >> p.first >> p.second;return is;}template <typename T>std::ostream &operator<<(std::ostream &os, const std::vector<T> &v) {for (auto it = std::begin(v); it != std::end(v);) {os << *it << ((++it) != std::end(v) ? " " : "");}return os;}template <typename T>std::istream &operator>>(std::istream &is, std::vector<T> &v) {for (T &in : v) {is >> in;}return is;}inline void scan() {}template <class Head, class... Tail>inline void scan(Head &head, Tail &...tail) {std::cin >> head;scan(tail...);}template <class T>inline void print(const T &t) { std::cout << t << '\n'; }template <class Head, class... Tail>inline void print(const Head &head, const Tail &...tail) {std::cout << head << ' ';print(tail...);}template <class... T>inline void fin(const T &...a) {print(a...);exit(0);}#line 3 "library/template/util.hpp"struct IOSetup {IOSetup() {std::cin.tie(nullptr);std::ios::sync_with_stdio(false);std::cout.tie(0);std::cout << std::fixed << std::setprecision(12);std::cerr << std::fixed << std::setprecision(12);}} IOSetup;#line 3 "library/template/debug.hpp"#ifdef LOCAL#include <debug.hpp>#else#define debug(...)#endif#line 8 "library/template/template.hpp"using namespace std;#line 3 "library/others/range-set.hpp"template <typename T>struct RangeSet {set<pair<T, T>> st;T TINF;RangeSet() : TINF(numeric_limits<T>::max() / 2) {st.emplace(TINF, TINF);st.emplace(-TINF, -TINF);}// [l,r] covered?bool covered(T l, T r) {assert(l <= r);auto ite = prev(st.lower_bound({l + 1, l + 1}));return ite->first <= l and r <= ite->second;}bool covered(T x) { return covered(x, x); }// [l, r]がカバーされているなら,その区間を返す.// されていないなら[-TINF,-TINF]を返すpair<T, T> covered_by(T l, T r) {assert(l <= r);auto ite = prev(st.lower_bound({l + 1, l + 1}));if (ite->first <= l and r <= ite->second) return *ite;return make_pair(-TINF, -TINF);}pair<T, T> covered_by(T x) { return covered_by(x, x); }// insert[l,r], 増加量を返すT insert(T l, T r) {assert(l <= r);auto ite = prev(st.lower_bound({l + 1, l + 1}));if (ite->first <= l and r <= ite->second) return T(0);T sum_erased = T(0);if (ite->first <= l and l <= ite->second + 1) {l = ite->first;sum_erased += ite->second - ite->first + 1;ite = st.erase(ite);} elseite = next(ite);while (r > ite->second) {sum_erased += ite->second - ite->first + 1;ite = st.erase(ite);}if (ite->first - 1 <= r) {sum_erased += ite->second - ite->first + 1;r = ite->second;st.erase(ite);}st.emplace(l, r);return r - l + 1 - sum_erased;}T insert(T x) { return insert(x, x); }// erase [l,r], 減少量を返すT erase(T l, T r) {assert(l <= r);auto ite = prev(st.lower_bound({l + 1, l + 1}));if (ite->first <= l and r <= ite->second) {// 完全に1つの区間に包含されているif (ite->first < l) st.emplace(ite->first, l - 1);if (r < ite->second) st.emplace(r + 1, ite->second);st.erase(ite);return r - l + 1;}T ret = T(0);if (ite->first <= l and l <= ite->second) {ret += ite->second - l + 1; // 消えたif (ite->first < l) st.emplace(ite->first, l - 1);ite = st.erase(ite); // 次へ} elseite = next(ite);while (ite->second <= r) {ret += ite->second - ite->first + 1;ite = st.erase(ite);}// 右端が区間の間にあるかif (ite->first <= r) {ret += r - ite->first + 1;st.emplace(r + 1, ite->second);st.erase(ite);}return ret;}T erase(T x) { return erase(x, x); }// number of rangeint size() { return (int)st.size() - 2; }// mex [x,~)T mex(T x = 0) {auto ite = prev(st.lower_bound({x + 1, x + 1}));if (ite->first <= x and x <= ite->second)return ite->second + 1;elsereturn x;}void output() {cout << "RangeSet : ";for (auto &p : st) {if (p.first == -TINF or p.second == TINF) continue;cout << "[" << p.first << ", " << p.second << "] ";}cout << "\n";}};#line 3 "A.cpp"int main() {LL(D);INT(Q);RangeSet<ll> st;ll res = 0;while (Q--) {LL(L, R);st.insert(L, R);auto seg = st.covered_by(L, R);chmax(res, seg.second - seg.first + 1);print(res);}}