经典动态二分图问题。

考虑solve(l,r)分治成l,mid和mid+1,r。先将区间[mid+1,r]中的点全部加入图中,若此时存在奇环则ans[l..mid]全部为0,否则递归到左边。

递归完左边后将右边的点全部删去,左边点全部加入,按同样的方法处理右边。

判断奇环使用可撤销带权并查集,注意多组数据不要用memset。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int T,n,m,top,cnt,u,v;
int fa[N],sz[N],d[N],ans[N],h[N],nxt[N],to[N];
struct P{ int a,b,c; }s[*N];
struct S{ int x,y; };
void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } void init(){ cnt=; rep(i,,n) fa[i]=i,sz[i]=,d[i]=,h[i]=; } S get(int x){
if (fa[x]==x) return (S){x,};
S t=get(fa[x]); return (S){t.x,t.y^d[x]};
} void uni(int x,int y){
int t1=get(x).y; x=get(x).x;
int t2=get(y).y; y=get(y).x;
if (sz[x]<sz[y]) swap(x,y);
s[++top]=(P){,y,y}; s[++top]=(P){,x,sz[x]}; s[++top]=(P){,y,};
fa[y]=x; d[y]=t1^t2^; sz[x]+=sz[y];
} void cancel(int x){
if (s[x].a==) fa[s[x].b]=s[x].c;
if (s[x].a==) sz[s[x].b]=s[x].c;
if (s[x].a==) d[s[x].b]=s[x].c;
} void solve(int l,int r){
if (l==r) { ans[l]=; return; }
int mid=(l+r)>>,tmp=top; bool flag=;
rep(u,mid+,r)
for (int i=h[u]; i; i=nxt[i]){
int v=to[i];
if (v>=l && v<=mid) continue;
if (get(u).x!=get(v).x) uni(u,v);
else if (get(u).y==get(v).y) { flag=; break; }
}
if (flag) rep(i,l,mid) ans[i]=; else solve(l,mid);
while (top>tmp) cancel(top--); flag=;
rep(u,l,mid)
for (int i=h[u]; i; i=nxt[i]){
int v=to[i];
if (v>mid && v<=r) continue;
if (get(u).x!=get(v).x) uni(u,v);
else if (get(u).y==get(v).y) { flag=; break; }
}
if (flag) rep(i,mid+,r) ans[i]=; else solve(mid+,r);
while (top>tmp) cancel(top--);
} int main(){
freopen("hdu5354.in","r",stdin);
freopen("hdu5354.out","w",stdout);
for (scanf("%d",&T); T--; ){
scanf("%d%d",&n,&m); init();
rep(i,,m) scanf("%d%d",&u,&v),add(u,v),add(v,u);
solve(,n);
rep(i,,n) printf("%d",ans[i]); puts("");
}
return ;
}

最新文章

  1. UIKit框架
  2. Lua与C的交互
  3. 2016年11月2日--Window.document对象
  4. why add \n to http response.responseText
  5. 转:java多线程--同步容器
  6. sikuli常用方法学习
  7. VC++ 在类中添加多线程操作
  8. c#调用api(FindFirstFile,FindNextFile)高效遍历目录文件【转载】
  9. 大到可以小说的Y组合子(一)
  10. background-position 具体的使用说明
  11. IOS软件国际化(本地化Localizable)
  12. 前台ajax加载数据
  13. (纪念第一道完全自己想的树DP)CodeForces 219D Choosing Capital for Treeland
  14. Android 7.0 存储系统—Vold与MountService分析(二)(转 Android 9.0 分析)
  15. Android Studio升级到3.1.4后打开旧项目警告:The `android.dexOptions.incremental` property is deprecated and it has no effect on the build process.
  16. 在Ubuntu下运行 apt-get update命令后出现错误:
  17. silverlight中 设置 头像(添加图片)
  18. 获取自定义data的几种属性
  19. HBuilder使用夜神模拟器调试Android应用
  20. netty服务端实现心跳超时的主动拆链

热门文章

  1. UOJ#31 【UR #2】猪猪侠再战括号序列
  2. 【Matlab】让Matlab程序发出声音
  3. python 异步IO( asyncio) 协程
  4. python基础===抽象
  5. 【模板】SPOJ FACT0 大数分解 miller-rabin &amp; pollard-rho
  6. scrapy抓取学院新闻报告
  7. Window Server 2008 R2 安装 Share Point 2013
  8. DateTimeToUnix/UnixToDateTime 对接时间转换
  9. Guava Cache 使用笔记
  10. beatfullsoup