「SHOI2015」腦洞治療儀
阿新 • • 發佈:2021-11-14
\(\text{Naive Solition}\)
當然是 \(ODT\) 暴力啦
\(Luogu\) 煞費苦心加強了資料,於是就過不了了。。。
不過 \(LibreOJ\) 上可以過
#include <cstdio> #include <iostream> #include <set> #define re register #define iter set<node>::iterator using namespace std; inline void read(int &x) { x = 0; char ch = getchar(); for(; !isdigit(ch); ch = getchar()); for(; isdigit(ch); x = (x<<3) + (x<<1) + (ch^48), ch = getchar()); } int n, m; struct node{ int l, r; mutable int v; inline node(int l, int r, int v):l(l), r(r), v(v){}; inline bool operator < (const node &a) const {return l < a.l;} }; set<node> T; inline iter split(int x) { if (x > n) return T.end(); iter it = --T.upper_bound(node{x, 0, 0}); if (it->l == x) return it; int l = it->l, r = it->r, v = it->v; T.erase(it), T.insert(node{l, x - 1, v}); return T.insert(node{x, r, v}).first; } inline void assign(int l, int r, int v) { iter itr = split(r + 1), itl = split(l); T.erase(itl, itr), T.insert(node{l, r, v}); } inline int QuerySum(int l, int r) { iter itr = split(r + 1), itl = split(l); int sum = 0; for(re iter it = itl; it != itr; ++it) sum += it->v * (it->r - it->l + 1); return sum; } inline void Modify(int l, int r, int x, int y) { int sum = QuerySum(l, r); assign(l, r, 0); iter itr = split(y + 1), itl = split(x); for(re iter it = itl; it != itr && sum; ++it) if (it->v == 0) { int len = it->r - it->l + 1; if (len <= sum) sum -= len, it->v = 1; else assign(it->l, it->l + sum - 1, 1), sum = 0; } } inline int QueryLong(int l, int r) { iter itr = split(r + 1), itl = split(l); int mx = 0, sum = 0; for(re iter it = itl; it != itr; ++it) { if (it->v == 0) sum += (it->r - it->l + 1); else mx = (mx < sum ? sum : mx), sum = 0; } return (mx < sum ? sum : mx); } int main() { read(n), read(m), T.insert(node{1, n, 1}); for(int op, l, r, x, y; m; --m) { read(op); if (op == 0) read(l), read(r), assign(l, r, 0); else if (op == 1) read(l), read(r), read(x), read(y), Modify(l, r, x, y); else read(l), read(r), printf("%d\n", QueryLong(l, r)); } }