結果
問題 | No.674 n連勤 |
ユーザー |
![]() |
提出日時 | 2020-10-11 17:55:08 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 21 ms / 2,000 ms |
コード長 | 4,157 bytes |
コンパイル時間 | 2,006 ms |
コンパイル使用メモリ | 199,736 KB |
最終ジャッジ日時 | 2025-01-15 06:40:41 |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define ALL(x) begin(x),end(x)#define rep(i,n) for(int i=0;i<(n);i++)#define debug(v) cout<<#v<<":";for(auto x:v){cout<<x<<' ';}cout<<endl;#define mod 1000000007using ll=long long;const int INF=1000000000;const ll LINF=1001002003004005006ll;int dx[]={1,0,-1,0},dy[]={0,1,0,-1};// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;}template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;}struct IOSetup{IOSetup(){cin.tie(0);ios::sync_with_stdio(0);cout<<fixed<<setprecision(12);}} iosetup;template<typename T>ostream &operator<<(ostream &os,const vector<T>&v){for(int i=0;i<(int)v.size();i++) os<<v[i]<<(i+1==(int)v.size()?"":" ");return os;}template<typename T>istream &operator>>(istream &is,vector<T>&v){for(T &x:v)is>>x;return is;}// 閉区間の範囲を管理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 contains(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 contains(T x){return contains(x,x);}// insert[l,r], 増加量を返すT insert(T l,T 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);}else ite=next(ite);while(r>ite->second){sum_erased+=ite->second-ite->first+1;ite=st.erase(ite);}if(ite->first-1<=r and r<=ite->second){sum_erased+=ite->second-ite->first+1;r=ite->second;st.erase(ite);}st.emplace(l,r);// マージ後の区間が[l,r]になっている.これが欲しければこれを返すようにする// https://yukicoder.me/problems/no/674return r-l+1;// 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);// 次へ}else ite=next(ite);while(ite->second<=r){ret+=ite->second-ite->first+1;ite=st.erase(ite);}// 右端が区間の間にあるかif(ite->first<=r and r<=ite->second){ret+=r-ite->first+1;if(r<ite->second) 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,~)int 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;else return 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";}};signed main(){ll d,q;cin>>d>>q;RangeSet<ll> st;ll res=0;while(q--){ll l,r;cin>>l>>r;chmax(res,st.insert(l,r));cout<<res<<"\n";}return 0;}