結果
| 問題 |
No.674 n連勤
|
| コンテスト | |
| ユーザー |
suzuken_w
|
| 提出日時 | 2021-09-03 16:59:03 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 23 ms / 2,000 ms |
| コード長 | 3,115 bytes |
| コンパイル時間 | 2,495 ms |
| コンパイル使用メモリ | 218,896 KB |
| 最終ジャッジ日時 | 2025-01-24 04:27:39 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 |
ソースコード
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using P=pair<ll,ll>;
template<class T> using V=vector<T>;
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
const ll inf=(1e18);
//const ll mod=998244353;
const ll mod=1000000007;
const vector<int> dy={-1,0,1,0},dx={0,-1,0,1};
ll GCD(ll a,ll b) {return b ? GCD(b,a%b):a;}
ll LCM(ll c,ll d){return c/GCD(c,d)*d;}
struct __INIT{__INIT(){cin.tie(0);ios::sync_with_stdio(false);cout<<fixed<<setprecision(20);}} __init;
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
template<class T>void debag(const vector<T> &a){cerr<<"debag :";for(auto v:a)cerr<<v<<" ";cerr<<"\n";}
template<class T>void print(const vector<T> &a){for(auto v:a)cout<<v<<" ";cout<<"\n";}
template<typename T,typename U>
struct segment_set:set<pair<T,U>>{
bool merge;//隣接する区間を結合するか
segment_set(bool merge=false):merge(merge){
build();
}
void build(){
//オーバーフローに気を付ける
(*this).emplace(-numeric_limits<T>::max(),-numeric_limits<U>::max());
(*this).emplace(numeric_limits<T>::max(),numeric_limits<U>::max());
}
auto get(T p) const{
auto ite= upper_bound({p,p-1});
ite--;
if(ite->second<p)return (*this).end();
return ite;
}
// //[l,r]
ll add_segment(T l,U r){
if(merge)r++;
auto ite=(*this).upper_bound({l,r});
ite--;
if(ite->first<=l && l<=ite->second){
l=min(l,ite->first);
r=max(r,ite->second);
(*this).erase(ite);
}
ite=(*this).lower_bound({l,r});
while(1){
if(l<=ite->first && ite->first<=r){
r=max(r,ite->second);
ite=(*this).erase(ite);
}else{
break;
}
}
(*this).emplace(l,r);
return r-l;
}
//remove segment [l,r]
void remove(T l,U r){
if(merge)r++;
if(!same(l,r)){
assert(false);//区間をはみ出している
}
auto ite=(*this).upper_bound({l,r});
ite--;
if(ite->second<l)ite++;
if(ite->first>r||ite->second<l)return;
T nr=l,nl=r;
if(ite->first<nr)insert({ite->first,nr});
if(nl<ite->second)insert({nl,ite->second});
(*this).erase(ite);
}
bool same(T l,U r) const{
auto ite=get(l);
return (ite!=(*this).end() && get(l)==get(r));
}
};
int main(){
ll D,q;
cin>>D>>q;
ll ans=0;
segment_set<ll,ll> st(true);
for(int i=0;i<q;i++){
ll a,b;
cin>>a>>b;
chmax(ans,st.add_segment(a,b));
cout<<ans<<"\n";
}
}
suzuken_w