*在#里发他一直WA这道CF题,然后我就去看了看,感觉还挺有趣的,那我就在这里整理一下我的思路..毕竟一边听歌..

题意: 给个图,每条边初始无色,每次给一个询问(e,c)表示把e涂成颜色c,如果此时颜色c组成的子图是一个二分图就涂色并输出YES,否则回撤这个操作并输出NO.(offline available)

其实加边删边维护联通性的时候我们维护一棵最大删除时间生成树,关于二分图判定的部分其实只需要检查一条边两端点在生成树上的距离的奇偶性就好了.然而这个做法是离线的,我们没法知道这个最大删除时间是多少..

先考虑在线做法: 动态图连通性的在线做法加上维护树形态的LCT查询链长度就可以了,不过空间复杂度为nlog^2n不是很可以接受啊..

我们考虑用每条边的预计删除时间(<=删除时间)代替删除时间做,每次执行询问(e,c)的时候先查询可行性,要是不可行的话我们可以发现这条e的预计最大删除时间被延长了(被延长到下一次删除),如果可行的话我们就直接加入这条边.因为这条边的预计最大删除时间是只增不减的所以维护的时候不会出现什么鬼畜问题了..

然后感觉需要处理一些小细节..?那就这样吧..

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int MM=500500,MN=500500;
  6. struct sn;typedef sn*sp;sp n;
  7. struct ed;struct dt;
  8. struct ed{int u,v,c;dt*d;}E[MM];
  9. struct dt{ed*e;int r;sp u,v,w;}P[MM]={{E,MM,0,0,0}},*dp=P;
  10. struct qr{int c;dt*r;}Q[MM];
  11. #define ms(a,b) (b->r<a->r?b:a)
  12. #define ts(a,b) (b->r<a->r?a=b:a)
  13. struct sn{
  14. sp c[2],f,t;
  15. dt*v,*m;
  16. int r,s;
  17. void U(){m=ms(c[0]->m,c[1]->m),ts(m,v),s=c[0]->s+c[1]->s+(v==P);}
  18. void R(){r^=1,swap(c[0],c[1]);}
  19. void D(){r?c[0]->R(),c[1]->R(),r=0:0;}
  20. void J(int z){
  21. sp F=f;F->D(),D(),t=F->t,(f=F->f)->c[F->f->c[1]==F]=this;
  22. c[!z]=(F->c[z]=c[!z])->f=F;F->f=this;F->U();
  23. }
  24. void S(){
  25. D();for(int z;f!=n;)
  26. f->f!=n?(f->c[1]==this)==(z=f->f->c[1]==f)?f->J(z):J(!z),J(z):J(f->c[1]==this);
  27. U();
  28. }
  29. void E(sp z=n){
  30. S();if(c[1]!=n)c[1]->t=this,c[1]->f=n;
  31. (c[1]=z)->f=this,U();
  32. }
  33. }tr[MM*3],*tp=tr+1;
  34. sp A(sp b){for(b->E();b->t;b=b->t)b->t->E(b);return b;}
  35. sp Z(sp b){return (b=A(b))->R(),b;}
  36. sp W(sp b){for(b->S();b->c[0]!=n;b=b->c[0])b->D();return b->S(),b;}
  37. void L(sp u,sp v){Z(u)->t=v;}
  38. void B(sp u,sp v){u->E(),v->E(),(u->t==v?u:v)->t=0;}
  39. sp nd[55][MN],el[MM];
  40. sp M(int c,int i){return !nd[c][i]?*(nd[c][i]=tp)=(sn){n,n,n,0,P,P,0,1},tp++:nd[c][i];}
  41. int main(){
  42. (n=tr)->v=P,n->m=P;int N,m,C,q;scanf("%d%d%d%d",&N,&m,&C,&q);
  43. for(int i=1;i<=m;++i)scanf("%d%d",&E[i].u,&E[i].v);
  44. for(int i=1;i<=q;++i)
  45. scanf("%d%d",&N,&C),E[N].d?E[N].d->r=i-1:0,(E[N].d=++dp)->e=E+N,Q[i]=(qr){C,dp};
  46. for(int i=1;i<=m;++i)E[i].d?E[i].d->r=q:0;
  47. for(int i=1,_;i<=q;++i){
  48. dt*m,*c=Q[i].r;
  49. sp u=M(C=Q[i].c,c->e->u),v=M(C,c->e->v),w=(Z(u),A(v));
  50. m=w->m,_=w->s;
  51. if(W(w)==u){
  52. if(m->r>=i&&_&1){
  53. if(puts("NO"),!(C=c->e->c))continue;
  54. if((m=c->e->d)->w){B(m->u,m->w),B(m->v,m->w),m->w=0;goto ln;}
  55. else{Z(u=m->u),m=(w=A(m->v))->m;if(W(w)!=u)goto ln;goto ct;}
  56. }puts("YES");
  57. ct:if(m->r<c->r)B(m->u,m->w),B(m->v,m->w),m->w=0;
  58. else{c->e->c=C,c->e->d=c,c->w=0,c->u=M(C,c->e->u),c->v=M(C,c->e->v);continue;}
  59. }else puts("YES");
  60. ln:c->e->d=c,c->e->c=C,*(c->w=tp)=(sn){n,n,n,0,c,c,0,0};
  61. L(tp,c->u=M(C,c->e->u)),L(tp++,c->v=M(C,c->e->v));
  62. }return 0;
  63. }

CF576E的更多相关文章

  1. 【CF576E】Painting Edges 线段树按时间分治+并查集

    [CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...

  2. CF576E Painting Edges

    首先,有一个很暴力的nk的做法,就是对每种颜色分别开棵lct来维护. 实际上,有复杂度与k无关的做法. 感觉和bzoj4025二分图那个题的区别就在于这个题是边dfs线段树边拆分区间.

  3. CF938G Shortest Path Queries 和 CF576E Painting Edges

    这两道都用到了线段树分治和按秩合并可撤销并查集. Shortest Path Queries 给出一个连通带权无向图,边有边权,要求支持 q 个操作: x y d 在原图中加入一条 x 到 y 权值为 ...

  4. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  5. IOI 2020 集训队作业胡扯

    首先安慰自己:做的没集训队快很正常-- 很正常-- 做不完也很正常-- 很正常-- 全都不会做也很正常-- 很正常-- 表格 试题一 完成情况 试题二 完成情况 试题三 完成情况 cf549E cf6 ...

  6. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

  7. IOI 2020 国家集训队作业

    \(\checkmark\) 试题一 完成情况 试题二 完成情况 试题三 完成情况 cf549E cf674G arc103_f \(\checkmark\) cf594E agc034_f agc0 ...

随机推荐

  1. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  2. 关于FloatingActionButton

    由于FloatingActionButton本质上是ImageView,跟ImageView相关的就不介绍,这里重点介绍新加的几个属性. app:fabSize:FloatingActionButto ...

  3. php 设计模式--准备篇

    要了解设计模式 首先我们要先了解 php的命名空间和类的自动载入的功能 下面我们来说一下 命名空间 概念缘由:比如一个a.php的文章 但是我们需要两个 此时同一个目录下不可能存在两个a.php 那么 ...

  4. 【编码】_C#中编码名称(Name)与页面标识(CodePage)的关系_编码gb2312的获取

    在写C#代码时,发现VS提供没有直接提供gb2312的中文编码, 所以,需要找到对应编码名称的codepage来调用想要的编码方式. 下面是微软编程提供的所有编码信息,包括编码名称,编码代码页标识符, ...

  5. C#-WebForm-★内置对象简介★Request-获取请求对象、Response相应请求对象、Session全局变量(私有)、Cookie全局变量(私有)、Application全局公共变量、ViewState

    内置对象: 1.Request - 获取请求对象 用法:接收传值 protected void Page_Load(object sender, EventArgs e) { TextBox1.Tex ...

  6. SSH框架的简单上传功能的实现

    1.创建项目. 2.导入开发包. 3.配置web.xml. 配置内容就是配置struct2的内容如下: <?xml version="1.0" encoding=" ...

  7. Django模版语言 格式化显示 后台datatime()时间

    Django模版语言 格式化显示 后台datatime()时间 场景描述:

  8. JS 中如何将<br/> 替换成 /n

    JS 中如何将<br/> 替换成 /n function a() { var data = "aaaa<br/>bbbb<br/>cccc"; ...

  9. windows bat批处理语法简析

    第一节先介绍windows批处理.这个起源于跟旁边同事学习在windows用命令行办公,渐渐地有些批处理功能就需要了,于是专门抽出了几天学习了一下.我认为文档最重要的功能是为了备忘,择取了很多文档的例 ...

  10. .NET开发人员值得关注的七个开源项目 .

    NET开发人员值得关注的七个开源项目 软近几年在.NET社区开源项目方面投入了相当多的时间和资源,不禁让原本对峙的开源社区阵营大吃一惊,从微软.NET社区中的反应来看,微软.NET开发阵营对开源工具的 ...