4025: 二分图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2667  Solved: 989[Submit][Status][Discuss] Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input 输入数据的第一行是三个整数n,m,T. 第2行到第m+1行,每行4个整数u,v,start,end…
传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的区间分别维护信息. 最后按线段树从上到下再从左到右的遍历方式一起统计答案. 这道题可以按时间建树,每次相当于在一段区间里增加边. 最后统计二分图就行了,这个问题可以用并查集解决. 然而我们回溯上去的时候是需要撤销操作的,因此需要用并查集按秩合并. 代码: #include<bits/stdc++.h…
之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的所有操作.(语死早)这样可以把操作的插入和删除改为只有插入. 具体到这题,由于并查集没法删除边,我们考虑线段树分治.之后要考虑的问题就是如何用并查集判断是否为二分图,也即是否含奇环.假设现在图中有一个偶环,若给偶环两点加了一条边,可以发现无论去掉原偶环上哪一条边都不会改变新出现环的奇偶性.于是我们只…
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<iostream> #define f1 first #define f2 second #define…
Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input 输入数据的第一行是三个整数n,m,T. 第2行到第m+1行,每行4个整数u,v,start,end.第i+1行的四个整数表示第i条边连接u,v两个点,这条边在start时刻出现,在第end时刻消失. Output 输出包含T行.在第i行中,如果第i时间段内这个图是二分图,那么输出"Yes"…
Description Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connected Disconnected Connected HINT N<=100000 M<=200000 K<=100000 Solution 线段树分治,根据询问把每条边存在的时间区间拆成几个区间,然后覆盖到线段树上,最后$DFS$一遍线段树.用带撤销的并查集维护一下连通块个数,到线段树叶子…
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内,那就把它用并查集并起来.最后对于一个询问,直接用并查集找就好了. 但是因为有撤销操作,所以在并查集合并的时候,我们将需要合并的两个点放进栈中,最后栈序撤销,所以只能考虑按秩合并而不能路径压缩. #include <map> #include <vector> #include <…
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> using namespace s…
正题 题目链接:https://darkbzoj.tk/problem/4025 题目大意 \(n\)个点\(m\)条边,每条边会在一个\(T\)以内的时间段内出现,对于任意一个\(T\)以内的时刻求图是否是一个二分图. \(1\leq n,T\leq 10^5,1\leq m\leq 2\times 10^5\) 解题思路 插边就暴力插到线段树的对应区间位置,然后考虑怎么判二分图. 可以用扩展域并查集,但是因为要撤回所以不能路径压缩,要用按秩合并. 时间复杂度\(O(n\log^2n )\)…
把查询看做是在一条时间轴上.那么每条边都有几段存在时间.于是线段树分治就好了. 然而在bzoj上t掉了,不知道是常数大了还是写挂了. 以及brk不知道是啥做数组名过不了编译. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<vector>…