• 并查集维护区间交、并


    有一个任意两数不同且长度为 \(n\) 的序列 \(a\),对它有 \(q\) 个信息,形如 \(a_l, a_{l+1},\cdots,a_r\) 的最小值是 \(r\) .

    问是否产生矛盾?

    矛盾分两类:

    1. 如果两个区间的最小值一样,但是这两个区间没有交集(每个数各不相同)
    2. 如果几个比较大的区间的并集包含了一些比较小的区间的交集

    后面这个就是相当于让搞一个数据结构,能维护

    1. 合并区间
    2. 问区间包含关系

    合并区间可以暴力并查集把每个 \([l,r]\) 内的 father 都链到 \(r\) 上,复杂度其实挺低(并查集的魔法均摊qwq)

    代码大概这样

    using namespace std;
    
    const int N = 1e6+500, Q = 25555, I = 0x3f3f3f3f;
    
    inline void chkmin(int& a, int b){if (a > b) a = b;}
    inline void chkmax(int& a, int b){if (a < b) a = b;}
    
    struct Input
    {
    	int l, r, v;
    	bool operator < (const Input& x)const{return v > x.v;}
    }inp[Q], t[Q];
    int n, q;
    
    struct Magic
    {
    	int fa[N]; // dsu
    	void init(){for (int i=0; i<=n+3; i++) fa[i] = i;}
    	void clear(){init();}
    	int get(int x){return fa[x] == x ? x : fa[x] = get(fa[x]);}
    	void merge(int l, int r)
    	{
    		for (int u = l; u <= r; u++)
    			fa[get(u)] = get(r+1); // dsu union
    	}
    	bool crs(int l, int r){return get(l) > r;}
    	Magic(){init();}
    }T;
    
    bool check(int r) // -> is NOT true
    {
    	T.clear();
    	for (int i=1; i<=r; i++) t[i] = inp[i];
    	sort(t+1, t+1+r);
    	int lmin, lmax, rmin, rmax;
    	lmin = lmax = t[1].l; rmin = rmax = t[1].r;
    	for (int i=2; i<=r; i++)
    	{
    		if (t[i].v == t[i-1].v) // Case 1
    		{
    			lmin = min(lmin, t[i].l); lmax = max(lmax, t[i].l);
    			rmin = min(rmin, t[i].r); rmax = max(rmax, t[i].r);
    			if (rmin < lmax) return true;
    			continue;
    		}                       // Case 2
    		if (T.crs(lmax, rmin)) return true;
    		T.merge(lmin, rmax);
    		lmin = lmax = t[i].l; rmin = rmax = t[i].r;
    	}
    	return T.crs(lmax, rmin);
    }
    
  • 相关阅读:
    撩妹技能 get,教你用 canvas 画一场流星雨
    git详细使用教程入门到精通(史上最全的git教程)
    Google Performance工具,你还不会用?Git走起。
    使用PIE.htc让万恶的IE内核浏览器IE678支持CSS3部分属性
    HTML编码规范
    Canvas制作的下雨动画
    Flex 布局教程:语法和实例
    CSS编码规范
    奇葩程序写的神一样的注释,被老板看见会不会开出呢?
    Vertical-Align你应该知道的一切
  • 原文地址:https://www.cnblogs.com/CDOI-24374/p/15624655.html
Copyright © 2020-2023  润新知