• BZOJ 4025 二分图


    听说,一个优秀的oier是题目喂出来的

    题目

    n个点m条边,总时间为T。

    每天边有一个存在的时间。问对于每个时间,该图是否为二分图。

    解题思路

    学过图论,我们知道一个图是二分图,当且仅当他没有奇环。

    显然如果两个点不连通,那么我们可以在其中直接连边,无需考虑其他条件。所以我们知道需要一个并查集。

    一开始发现边会消失,然后就自闭了。

    经过dalao提点,发现有种叫可撤销并查集的东西。

    考虑到对于每条边的存在时间,它可以被表示为线段树上的 log n 个节点。

    遍历一遍线段树,然后把当前节点的边加入。递归左右儿子,然后撤销边。

    判断奇环考虑暴力跳,会挂。套一个启发式合并。

    启发式合并必须是根与根之间连边,所以我们要对连边稍作处理,把边权改一改,就可以等价于直接连边了。

    代码

    #include<bits/stdc++.h>
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    using namespace std;
    const int sz=2e5+527;
    int n,m,T;
    int dep[sz],f[sz],d[sz];
    queue<int>q[sz<<1];
    int getfa(int x) { return x==f[x]?x:getfa(f[x]); }
    int getdis(int x) { return x==f[x]?0:d[x]^getdis(f[x]); }
    struct Edge{
    	int u,v,w;
    }e[sz];
    void insert(int o,int l,int r,int x,int y,int num){
    	if(x<=l&&r<=y) return (void)(q[o].push(num));
    	int mid=(l+r)>>1;
    	if(x<=mid) insert(lson,x,y,num);
    	if(mid<y) insert(rson,x,y,num);
    }
    void resum(stack<Edge>S){
    	while(!S.empty()){
    		d[f[S.top().u]=S.top().u]=0;
    		dep[S.top().v]-=S.top().w;
    		S.pop();
    	}
    }
    void solve(int o,int l,int r){
    	stack<Edge>S;
    	while(!q[o].empty()){
    		int num=q[o].front();
    		q[o].pop();
    		int x=e[num].u,y=e[num].v;
    		int fx=getfa(x),fy=getfa(y);
    		int w=getdis(x)^getdis(y)^1;
    		if(fx==fy&&w){
    			for(int i=l;i<=r;i++) puts("No");
    			return (void)(resum(S));
    		}
    		if(fx!=fy){
    			if(dep[fx]>dep[fy]) swap(fx,fy),swap(x,y);
    			Edge cur=(Edge){fx,fy,0};
    			f[fx]=fy,d[fx]=w;
    			if(dep[fx]==dep[fy]) ++dep[fy],cur.w=1;
    			S.push(cur);
    		}
    	}
    	if(l==r){ resum(S);return (void)(puts("Yes")); }
    	int mid=(l+r)>>1;
    	solve(lson);
    	solve(rson);
    	resum(S);
    }
    int main(){
    	scanf("%d%d%d",&n,&m,&T);
    	int u,v,L,R;
    	for(int i=1;i<=n;i++) f[i]=i;
    	for(int i=1;i<=m;i++){
    		scanf("%d%d%d%d",&u,&v,&L,&R);
    		L++;
    		e[i]=(Edge){u,v,1};
    		insert(1,1,T,L,R,i);
    	}
    	solve(1,1,T);
    }
    
  • 相关阅读:
    产品经理的十宗罪,你犯了几宗?
    产品经理的10大顾虑
    【FastAPI 学习 七】GET和POST请求参数接收以及验证
    【FastAPI 学习 六】异常处理
    【FastAPI 学习 五】统一响应json数据格式
    前端展示(三)
    前端展示(二)
    前端设计(一)
    后端流程分析
    生成词云图
  • 原文地址:https://www.cnblogs.com/river-flows-in-you/p/11286120.html
Copyright © 2020-2023  润新知