結果
| 問題 |
No.674 n連勤
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-04-14 15:48:23 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 10,115 bytes |
| コンパイル時間 | 4,596 ms |
| コンパイル使用メモリ | 243,036 KB |
| 最終ジャッジ日時 | 2025-01-05 10:12:06 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 TLE * 3 |
ソースコード
#pragma GCC optimize ("O3")
#pragma GCC target ("avx")
#include "bits/stdc++.h"
using namespace std;
using ll = long long int;
#define debug(v) {printf("L%d %s > ",__LINE__,#v);cout<<(v)<<endl;}
#define debugv(v) {printf("L%d %s > ",__LINE__,#v);for(auto e:(v)){cout<<e<<" ";}cout<<endl;}
#define debuga(m,w) {printf("L%d %s > ",__LINE__,#m);for(int x=0;x<(w);x++){cout<<(m)[x]<<" ";}cout<<endl;}
#define debugaa(m,h,w) {printf("L%d %s >\n",__LINE__,#m);for(int y=0;y<(h);y++){for(int x=0;x<(w);x++){cout<<(m)[y][x]<<" ";}cout<<endl;}}
#define ALL(v) (v).begin(),(v).end()
#define repeat(cnt,l) for(remove_const<decltype(l)>::type cnt=0;(cnt)<(l);++(cnt))
#define rrepeat(cnt,l) for(auto cnt=(l)-1;0<=(cnt);--(cnt))
#define iterate(cnt,b,e) for(auto cnt=(b);(cnt)!=(e);++(cnt))
#define diterate(cnt,b,e) for(auto cnt=(b);(cnt)!=(e);--(cnt))
const ll MD = 1000000007ll; const long double PI = 3.1415926535897932384626433832795L;
template<typename T1, typename T2> inline void assert_equal(T1 expected, T2 actual) { if (!(expected == actual)) { cerr << "assertion fault: expected=" << expected << " actual=" << actual << endl; abort(); } }
template<typename T1, typename T2> inline void assert_less(T1 actual, T2 threshold) { if (!(actual < threshold)) { cerr << "assertion fault: " << actual << " < (const)" << threshold << endl; abort(); } }
template<typename T1, typename T2> inline void assert_eqless(T1 actual, T2 threshold) { if (!(actual <= threshold)) { cerr << "assertion fault: " << actual << " <= (const)" << threshold << endl; abort(); } }
template<typename T1, typename T2> inline ostream& operator <<(ostream &o, const pair<T1, T2> p) { o << '(' << p.first << ':' << p.second << ')'; return o; }
template<typename Vec> inline ostream& _ostream_vecprint(ostream &o, const Vec& p) { o << '['; for (auto& e : p) o << e << ','; o << ']'; return o; }
template<typename T> inline ostream& operator<<(ostream& o, const vector<T>& v) { return _ostream_vecprint(o, v); }
template<typename T, size_t S> inline ostream& operator<<(ostream& o, const array<T, S>& v) { return _ostream_vecprint(o, v); }
template<typename T> inline T& maxset(T& to, const T& val) { return to = max(to, val); }
template<typename T> inline T& minset(T& to, const T& val) { return to = min(to, val); }
void bye(string s, int code = 0) { cout << s << endl; exit(code); }
mt19937_64 randdev(8901016);
template<typename T> inline T rand(T l, T h) { return uniform_int_distribution<T>(l, h)(randdev); }
template<> inline double rand<double>(double l, double h) { return uniform_real_distribution<double>(l, h)(randdev); }
template<> inline float rand<float>(float l, float h) { return uniform_real_distribution<float>(l, h)(randdev); }
#if defined(_WIN32) || defined(_WIN64)
#define getchar_unlocked _getchar_nolock
#define putchar_unlocked _putchar_nolock
#elif defined(__GNUC__)
#else
#define getchar_unlocked getchar
#define putchar_unlocked putchar
#endif
namespace {
#define isvisiblechar(c) (0x21<=(c)&&(c)<=0x7E)
class MaiScanner {
public:
template<typename T> void input_integer(T& var) {
var = 0; T sign = 1;
int cc = getchar_unlocked();
for (; cc<'0' || '9'<cc; cc = getchar_unlocked())
if (cc == '-') sign = -1;
for (; '0' <= cc && cc <= '9'; cc = getchar_unlocked())
var = (var << 3) + (var << 1) + cc - '0';
var = var * sign;
}
inline int c() { return getchar_unlocked(); }
inline MaiScanner& operator>>(int& var) { input_integer<int>(var); return *this; }
inline MaiScanner& operator>>(long long& var) { input_integer<long long>(var); return *this; }
inline MaiScanner& operator>>(string& var) {
int cc = getchar_unlocked();
for (; !isvisiblechar(cc); cc = getchar_unlocked());
for (; isvisiblechar(cc); cc = getchar_unlocked())
var.push_back(cc);
return *this;
}
template<typename IT> void in(IT begin, IT end) { for (auto it = begin; it != end; ++it) *this >> *it; }
};
class MaiPrinter {
public:
template<typename T>
void output_integer(T var) {
if (var == 0) { putchar_unlocked('0'); return; }
if (var < 0)
putchar_unlocked('-'),
var = -var;
char stack[32]; int stack_p = 0;
while (var)
stack[stack_p++] = '0' + (var % 10),
var /= 10;
while (stack_p)
putchar_unlocked(stack[--stack_p]);
}
inline MaiPrinter& operator<<(char c) { putchar_unlocked(c); return *this; }
inline MaiPrinter& operator<<(int var) { output_integer<int>(var); return *this; }
inline MaiPrinter& operator<<(long long var) { output_integer<long long>(var); return *this; }
inline MaiPrinter& operator<<(char* str_p) { while (*str_p) putchar_unlocked(*(str_p++)); return *this; }
inline MaiPrinter& operator<<(const string& str) {
const char* p = str.c_str();
const char* l = p + str.size();
while (p < l) putchar_unlocked(*p++);
return *this;
}
template<typename IT> void join(IT begin, IT end, char sep = '\n') { for (auto it = begin; it != end; ++it) *this << *it << sep; }
};
}
MaiScanner scanner;
MaiPrinter printer;
struct SegmentTreeS {
struct Node {
ll val_;
bool lazy_ = false;
unique_ptr<Node> bottom[2];
Node(ll v, bool lz = false) : val_(v), lazy_(lz) {
}
inline void setup_bottom() {
if (!bottom[0]) bottom[0].reset(new Node(0));
if (!bottom[1]) bottom[1].reset(new Node(0));
}
inline void apply_lazy() {
bottom[0]->lazy_ = true;
bottom[0]->val_ = val_ / 2;
bottom[1]->lazy_ = true;
bottom[1]->val_ = val_ / 2;
}
void set_range(ll begin, ll end, ll left, ll right) {
if (end <= left || right <= begin) return; // out of range
if (begin <= left && right <= end) {
val_ = right - left;
lazy_ = true;
return;
}
setup_bottom();
if (lazy_) apply_lazy();
ll center = (right + left) / 2;
bottom[0]->set_range(begin, end, left, center);
bottom[1]->set_range(begin, end, center, right);
val_ = (bottom[0]->val_ + bottom[1]->val_);
}
void reset_range(ll begin, ll end, ll left, ll right) {
if (end <= left || right <= begin) return; // out of range
if (begin <= left && right <= end) {
val_ = right - left;
lazy_ = true;
return;
}
setup_bottom();
if (lazy_) apply_lazy();
ll center = (right + left) / 2;
bottom[0]->reset_range(begin, end, left, center);
bottom[1]->set_range(begin, end, center, right);
val_ = (bottom[0]->val_ + bottom[1]->val_);
}
ll count_range(ll begin, ll end, ll left, ll right) {
if (end <= left || right <= begin) return 0;
if (begin == left && right == end) return val_;
if (val_ == 0) return val_;
if (val_ == right - left) return min(right, end) - max(left, begin);
ll center = (right + left) / 2;
return
bottom[0]->count_range(begin, end, left, center)
+ bottom[1]->count_range(begin, end, center, right);
}
};
ll width;
Node root;
SegmentTreeS(ll w) :root(0, false) {
width = 8;
while (width < w) width <<= 1;
}
inline void set_range(ll begin, ll end) {
root.set_range(begin, end, 0, width);
}
inline void reset_range(ll begin, ll end) {
root.reset_range(begin, end, 0, width);
}
inline ll count_range(ll begin, ll end) {
return root.count_range(begin, end, 0, width);
}
};
ll D, Q;
// ll dfs_left(const SegmentTreeS::Node& node, ll index, ll left, ll right) {
// cout << '<' << make_pair(left, right) << endl;
// if (index < left) return index;
// if (node.val_ == 0) return index;
// if (node.val_ == right - left) return left;
// ll center = (right + left) / 2;
// ll ans = dfs_left(*node.bottom[1], index, center, right);
// if (index <= ans) minset(ans, dfs_left(*node.bottom[0], index, left, center));
// return ans;
// }
// ll dfs_right(const SegmentTreeS::Node& node, ll index, ll left, ll right) {
// cout << '>' << make_pair(left, right) << endl;
// if (right <= index) return index;
// if (node.val_ == 0) return index;
// if (node.val_ == right - left) return right - 1;
// ll center = (right + left) / 2;
// ll ans = dfs_right(*node.bottom[0], index, left, center);
// if (ans <= index) maxset(ans, dfs_right(*node.bottom[1], index, center, right));
// return ans;
// }
typedef ll bsearch_t;
bsearch_t bin_search(bsearch_t false_val, bsearch_t true_val, function<bool(bsearch_t)> func) {
while (abs(true_val - false_val) > 1) {
bsearch_t c = (true_val + false_val) / 2;
(func(c) ? true_val : false_val) = c;
}
return true_val;
}
int main() {
scanner >> D >> Q;
SegmentTreeS seg(D + 1);
ll ans = 0;
repeat(lop, Q) {
ll a, b;
scanner >> a >> b;
++b;
maxset(ans, b - a);
seg.set_range(a, b);
// ll left = dfs_left(seg.root, a, 0, seg.width);
// ll right = dfs_right(seg.root, b - 1, 0, seg.width);
//
// cout << make_pair(right, left) << endl;
//
// maxset(ans, right - left + 1);
ll left = bin_search(-1, a, [&](ll x) {return seg.count_range(x, a + 1) == a + 1 - x; });
ll right = bin_search(D+1, b, [&](ll x) {return seg.count_range(b-1, x) == x - b + 1; });
maxset(ans, right - left);
printer << ans << '\n';
}
return 0;
}