正题

题目链接: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 )\)


code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. #define mp(x,y) make_pair(x,y)
  6. using namespace std;
  7. const int N=2e5+10;
  8. struct node{
  9. int x,y,d;
  10. }cl[N<<5];
  11. int n,m,T,tot,fa[N],dep[N];
  12. vector<pair<int,int> >e[N<<1];
  13. void Change(int x,int L,int R,int l,int r,pair<int,int> edg){
  14. if(L==l&&R==r){e[x].push_back(edg);return;}
  15. int mid=(L+R)>>1;
  16. if(r<=mid)Change(x*2,L,mid,l,r,edg);
  17. else if(l>mid)Change(x*2+1,mid+1,R,l,r,edg);
  18. else Change(x*2,L,mid,l,mid,edg),Change(x*2+1,mid+1,R,mid+1,r,edg);
  19. return;
  20. }
  21. int find(int x)
  22. {return (fa[x]==x)?x:find(fa[x]);}
  23. void coc(int x,int y){
  24. if(x==y)return;
  25. if(dep[x]>dep[y])swap(x,y);
  26. cl[++tot]=(node){x,y,dep[x]};
  27. fa[y]=x;dep[x]=max(dep[x]+1,dep[y]);
  28. return;
  29. }
  30. bool unionm(int x,int y){
  31. int fx=find(x),Fx=find(x+n);
  32. int fy=find(y),Fy=find(y+n);
  33. if(fx==fy)return 1;
  34. coc(fx,Fy);coc(fy,Fx);
  35. return 0;
  36. }
  37. void ClearTo(int bf){
  38. while(tot>bf){
  39. int x=cl[tot].x,y=cl[tot].y,d=cl[tot].d;
  40. fa[y]=y;dep[x]=d;tot--;
  41. }
  42. return;
  43. }
  44. void Solve(int x,int L,int R){
  45. int bf=tot,flag=0;
  46. for(int i=0;i<e[x].size();i++){
  47. flag|=unionm(e[x][i].first,e[x][i].second);
  48. if(flag)break;
  49. }
  50. if(flag){
  51. for(int i=L;i<=R;i++)
  52. printf("No\n");
  53. ClearTo(bf);return;
  54. }
  55. if(L==R){printf("Yes\n");ClearTo(bf);return;}
  56. int mid=(L+R)>>1;
  57. Solve(x*2,L,mid);
  58. Solve(x*2+1,mid+1,R);
  59. ClearTo(bf);return;
  60. }
  61. int main()
  62. {
  63. freopen("4.in","r",stdin);
  64. freopen("1.ans","w",stdout);
  65. scanf("%d%d%d",&n,&m,&T);
  66. for(int i=1;i<=m;i++){
  67. int l,r,u,v;
  68. scanf("%d%d%d%d",&u,&v,&l,&r);
  69. if(l==r)continue;
  70. Change(1,1,T,l+1,r,mp(u,v));
  71. }
  72. for(int i=1;i<=2*n;i++)fa[i]=i;
  73. Solve(1,1,T);
  74. return 0;
  75. }

bzoj4025-二分图【线段树分治,并查集】的更多相关文章

  1. bzoj4025二分图(线段树分治 并查集)

    /* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...

  2. [BZOJ4025]二分图(线段树分治,并查集)

    4025: 二分图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2191  Solved: 800[Submit][Status][Discuss] ...

  3. 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)

    传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...

  4. BZOJ4025 二分图(线段树分治+并查集)

    之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的 ...

  5. BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)

    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 Connec ...

  6. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

  7. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  8. BZOJ3237 AHOI2013连通图(线段树分治+并查集)

    把查询看做是在一条时间轴上.那么每条边都有几段存在时间.于是线段树分治就好了. 然而在bzoj上t掉了,不知道是常数大了还是写挂了. 以及brk不知道是啥做数组名过不了编译. #include< ...

  9. BZOJ4025 二分图 线段树分治、带权并查集

    传送门 如果边不会消失,那么显然可以带权并查集做(然后发现自己不会写带权并查集) 但是每条边有消失时间.这样每一条边产生贡献的时间对应一段区间,故对时间轴建立线段树,将每一条边扔到线段树对应的点上. ...

随机推荐

  1. pycharm使用Djiago创建第一个web项目

    安装PyCharm专业版(注意社区版创建Djiago需要配置,比较麻烦) 创建Djiago项目点上 1.Inherit glocal site-packages(不然pycharm不去下载Djiago ...

  2. 天地图API加载ArcGIS Server服务

    发布的服务需要选择WMS功能 wmsLayer = new T.TileLayer.WMS("http://127.0.0.1:6080/arcgis/services/Demo/Defau ...

  3. 08.SpringMVC之方法返回值

    返回ModelAndView Controller类方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view.之前我就已讲过,在此并不过多赘述. 返回void 在Cont ...

  4. 用宏实现HEX到ASCII ,ASCII 到HEX

    #define HEX2ASCII(value, data)  do{  \            value = (value > 0x09)?(value+0x7):value; \     ...

  5. LeetCoded第206题题解--反转链表

    反转一个单链表. 示例 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 方法一:递归 自始至 ...

  6. 如何在指定的地址上创建C++对象

    如果已经掌握在静态存储区上创建对象的方法,那么可以扩展一下,可以在任意地址上创建C++对象. 解决方案:-在类中重载new/delete操作符-在new的操作符重载函数中返回指定的地址-在delete ...

  7. 常用cron表达式

    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午12点 " ...

  8. ubuntu中用update-alternatives进行软件多版本设置、切换,以python配置为例

    以Python2.7和Python3.5设置为例: 在系统中添加Python2.7.Python3.5的选项,默认为Python3.5 sudo update-alternatives --insta ...

  9. PENETRATION第一步

    PENETRATION第一步 第一次去打靶机,本来都快成功了,电脑蓝屏警告了...(=_=) 靶机下载连接 (https://download.vulnhub.com/admx/AdmX_new.7z ...

  10. Qt5中用QLCDNumber显示时间

    编程中经常要用到时间的显示,因此在这总结一下在Qt中如何显示时间.废话不多说,直接上代码,简单明了,一看就懂~~ mydialog.h 文件 #ifndef MYDIALOG_H #define MY ...