結果
問題 | No.674 n連勤 |
ユーザー |
![]() |
提出日時 | 2017-03-27 21:42:33 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 123 ms / 2,000 ms |
コード長 | 2,162 bytes |
コンパイル時間 | 1,682 ms |
コンパイル使用メモリ | 103,956 KB |
実行使用メモリ | 12,968 KB |
最終ジャッジ日時 | 2024-09-14 12:13:31 |
合計ジャッジ時間 | 4,266 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
#include <algorithm> #include <cfloat> #include <climits> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <functional> #include <iostream> #include <map> #include <memory> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std; typedef long long ll; #define sz size() #define pb push_back #define mp make_pair #define fi first #define se second #define all(c) (c).begin(), (c).end() #define rep(i,a,b) for(ll i=(a);i<(b);++i) #define clr(a, b) memset((a), (b) ,sizeof(a)) #define ctos(c) string(1,c) #define print(x) cout<<#x<<" = "<<x<<endl; #define MOD 1000000007 #define A 250 ll dh[60300]; ll dl[60300]; ll dd[60300]; ll dddh[300]; ll dddl[300]; ll geth(ll p){ ll index = p/A; if(dddh[index]==-1){ return dh[p]; } else{ return dddh[index]; } } ll getl(ll p){ ll index = p/A; if(dddl[index]==-1){ return dl[p]; } else{ return dddl[index]; } } int main(){ ll n,q; cin>>n>>q; clr(dh,-1); clr(dl,-1); clr(dd,-1); clr(dddh,-1); clr(dddl,-1); set<ll> se; vector<pair<ll,ll> > vp; rep(i,0,q){ ll a,b; cin>>a>>b; a++;b++; vp.pb(mp(a,b)); se.insert(a); se.insert(b); } vector<ll> vse(all(se)); map<ll,ll> ma; rep(i,0,vse.sz){ dd[i+1]=vse[i]; ma[vse[i]] = i+1; } vector<pair<ll,ll> > vp1; rep(i,0,vp.sz){ vp1.pb(mp(ma[vp[i].fi],ma[vp[i].se])); } ll mx = 0; rep(i,0,vp1.sz){ ll a1,b1; ll a = vp1[i].fi; ll b = vp1[i].se; ll pa = getl(a-1); if(pa==-1)a1 = a; else { if(dd[a]-1<=dd[geth(a-1)]){ a1 = pa; } else{ a1 = a; } } ll pb = geth(b+1); if(pb==-1)b1 = b; else { if(dd[getl(b+1)]<=dd[b]+1){ b1 = pb; } else{ b1 = b; } } ll index1 = a1/A; ll index2 = b1/A; rep(j,index1*A,(index1+1)*A){ if(a1 <= j && j <= b1){ dl[j] = a1; dh[j] = b1; } } rep(j,index2*A,(index2+1)*A){ if(a1 <= j && j <= b1){ dl[j] = a1; dh[j] = b1; } } rep(j,index1+1,index2){ dddl[j] = a1; dddh[j] = b1; } mx = max(mx,dd[b1]-dd[a1]+1); printf("%lld\n", mx); } return 0; }