【CF576E】Painting Edges

题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图。有q个询问,每次询问给出a,b代表将编号为a的边染成颜色b,但如果染色后不能满足所有颜色相同的边内部都是二分图就不染。问你每次是否能染成功。

$n,m,q\le 5\times 10^5,k\le 50$

题解:本题看起来要求在线,实质上完全可以离线。

如果没有不染这种操作的话,那么直接线段树按时间分治+并查集按秩合并就完事了。但如果有呢?我们先假设所有的都能染,那么每个操作都对应着线段树上的一段区间。在线段树处理到一个叶子时,如果发现不能染,那么就把这个操作对应的区间全都修改掉即可。时间复杂度还是一个log的。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=500010;
int n,m,K,Q,top;
int pa[maxn],pb[maxn],last[maxn],pre[maxn],nxt[maxn],qa[maxn],qb[maxn],f[51][maxn],rnk[51][maxn];
bool g[51][maxn];
int sa[maxn],sb[maxn];
vector<int> v[maxn<<2];
vector<int>::iterator it;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int rd()
{
int ret=0,f=1; char gc=nc();
while(!isdigit(gc)) {if(gc=='-') f=-f; gc=nc();}
while(isdigit(gc)) ret=ret*10+(gc^'0'),gc=nc();
return ret*f;
}
void updata(int l,int r,int x,int a,int b,int c)
{
if(a<=l&&r<=b)
{
v[x].push_back(c);
return ;
}
int mid=(l+r)>>1;
if(a<=mid) updata(l,mid,lson,a,b,c);
if(b>mid) updata(mid+1,r,rson,a,b,c);
}
void dfs(int l,int r,int x)
{
int now=top;
for(it=v[x].begin();it!=v[x].end();it++)
{
if(!qb[*it]) continue;
int x=pa[qa[*it]],y=pb[qa[*it]],z=qb[*it];
bool flag=1;
while(f[z][x]) flag^=g[z][x],x=f[z][x];
while(f[z][y]) flag^=g[z][y],y=f[z][y];
if(x==y) continue;
if(rnk[z][x]>rnk[z][y]) swap(x,y);
f[z][x]=y,g[z][x]=flag,sa[++top]=x,sb[top]=z;
if(rnk[z][x]==rnk[z][y]) rnk[z][y]++,sb[top]=-z;
}
if(l==r)
{
int x=pa[qa[l]],y=pb[qa[l]],z=qb[l];
bool flag=1;
while(f[z][x]) flag^=g[z][x],x=f[z][x];
while(f[z][y]) flag^=g[z][y],y=f[z][y];
if(x==y&&flag) qb[l]=qb[pre[l]],puts("NO");
else puts("YES");
while(top>now)
{
if(sb[top]<0) sb[top]=-sb[top],rnk[sb[top]][f[sb[top]][sa[top]]]--;
f[sb[top]][sa[top]]=0,top--;
}
return ;
}
int mid=(l+r)>>1;
dfs(l,mid,lson),dfs(mid+1,r,rson);
while(top>now)
{
if(sb[top]<0) sb[top]=-sb[top],rnk[sb[top]][f[sb[top]][sa[top]]]--;
f[sb[top]][sa[top]]=0,top--;
}
}
int main()
{
n=rd(),m=rd(),K=rd(),Q=rd();
int i;
for(i=1;i<=m;i++) pa[i]=rd(),pb[i]=rd();
for(i=1;i<=Q;i++)
{
qa[i]=rd(),qb[i]=rd();
if(last[qa[i]]) nxt[last[qa[i]]]=i,pre[i]=last[qa[i]];
last[qa[i]]=i,nxt[i]=Q+1;
}
for(i=1;i<=Q;i++) if(i+1<=nxt[i]-1) updata(1,Q,1,i+1,nxt[i]-1,i);
dfs(1,Q,1);
return 0;
}

【CF576E】Painting Edges 线段树按时间分治+并查集的更多相关文章

  1. BZOJ_4025_二分图_线段树按时间分治+并查集

    BZOJ_4025_二分图_线段树按时间分治+并查集 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简 ...

  2. 【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基

    4184: shallot Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 356  Solved: 180[Submit][Status][Discu ...

  3. 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包

    题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...

  4. BZOJ_4311_向量_线段树按时间分治

    BZOJ_4311_向量_CDQ分治+线段树按时间分治 Description 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y) ...

  5. BZOJ_4184_shallot_线段树按时间分治维护线性基

    BZOJ_4184_shallot_线段树按时间分治维护线性基 Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻 ...

  6. Bipartite Checking CodeForces - 813F (线段树按时间分治)

    大意: 动态添边, 询问是否是二分图. 算是个线段树按时间分治入门题, 并查集维护每个点到根的奇偶性即可. #include <iostream> #include <sstream ...

  7. Codeforces 1140F Extending Set of Points 线段树 + 按秩合并并查集 (看题解)

    Extending Set of Points 我们能发现, 如果把x轴y轴看成点, 那么答案就是在各个连通块里面的x轴的个数乘以y轴的个数之和. 然后就变成了一个并查集的问题, 但是这个题目里面有撤 ...

  8. BZOJ4399 魔法少女LJJ【线段树合并】【并查集】

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

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

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

随机推荐

  1. 461.汉明距离(c++实现)

    问题描述: 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意:0 ≤ x, y < 231. 示例: 输入: x = ...

  2. Windows如何安装pip

    下载这个文件:  https://bootstrap.pypa.io/get-pip.py 然后到下载目录执行Python命令:   (管理员权限执行) python get-pip.py

  3. 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节

    开篇介绍 最近有人问我有关文件处理中空值处理的相关问题: OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示? 为什么选中了 Keep Nulls 但是数据 ...

  4. iCloud无法导入vCard问题。fix the error when import vcard/vcf to icloud.

    问题描述:当登录icloud.com,进入通讯录的时候,导入VCF格式的联系人的时候会报错.如图: 1.从outlook的联系人中选一个联系人,导出联系人卡片-vCard文件 (如果是塞班手机,可以用 ...

  5. 玩魔兽争霸无故退出 提示框显示"0x21101663"指令引用的"0x02704acc"内存该存不能为"read" 确定就会终止程序

    20151002总结:下方法试过,没完全按照说的操作完,觉得有风险且那个read程序执行时间好长的,感觉有点干坏事的意思 ======================================= ...

  6. 基于CentOS搭建基于 ZIPKIN 的数据追踪系统

    系统要求:CentOS 7.2 64 位操作系统 配置 Java 环境 安装 JDK Zipkin 使用 Java8 -openjdk* -y 安装完成后,查看是否安装成功: java -versio ...

  7. 安装nginx和添加ssl证书

    一. 准备: 1. 需要有一台centos的服务器 2. 域名解析到服务器 3. 域名的nginx证书 二. 安装Nginx(输入下面的指令后:可访问实验机器外网 HTTP 服务http://118. ...

  8. java 高级用法整理

    一.retentionpolicy.class vs runtime区别 java5,增加了注解的功能:其中retentionpolicy注解的生命周期,提供了三种选择策略 source.class和 ...

  9. EasyUI tab问题记录

    1.  关闭当前tab 此代码放在  布局页中,然后所有的页面都可以随时关闭tab了,适当的根据你的项目,更改下js <script> function closetab(subtitle ...

  10. Chrome Debugger 温故而知新:上下文环境

    最早是在IOS开发中看到过这种调试方式.在无意间发现Chrome Debugger也可以.直接上图: 解释:默认的控制台想访问变量.都是只能访问全局的.但当我们用debugger; 断点进入到内部时, ...