zoukankan      html  css  js  c++  java
  • 「SHOI2015」脑洞治疗仪

    \(\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));
    	}
    }
    
  • 相关阅读:
    匿名函数
    Python基础练习题5
    for循环实现一个注册小案例
    Python基础练习题4
    Python集合
    Python基础练习题3
    Python 元组和字典
    Python PEP8规范与python之禅
    Python基础练习题2
    常见的排序之冒泡排序
  • 原文地址:https://www.cnblogs.com/leiyuanze/p/15551214.html
Copyright © 2011-2022 走看看