洛谷

Codeforces


建议阅读这篇博客作为预备。无耻地打广告


思路

与bzoj4025很相似,思路也差不多,可以看上面那篇博客。

仍然是用二分图的充要条件:没有奇环。

然而这题难在每条边的存在时间不固定,无法一开始知道。

可以每次在加入这条边的时间点判断能否成功修改,确定接下来一段时间它的颜色是什么。

具体见代码。


代码

#include<bits/stdc++.h>
namespace my_std{
using namespace std;
#define pii pair<int,int>
#define fir first
#define sec second
#define MP make_pair
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define drep(i,x,y) for (int i=(x);i>=(y);i--)
#define go(x) for (int i=head[x];i;i=edge[i].nxt)
#define sz 505050
typedef long long ll;
template<typename T>
inline void read(T& t)
{
t=0;char f=0,ch=getchar();
double d=0.1;
while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();
while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();
if(ch=='.')
{
ch=getchar();
while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();
}
t=(f?-t:t);
}
template<typename T,typename... Args>
inline void read(T& t,Args&... args){read(t); read(args...);}
void file()
{
#ifndef ONLINE_JUDGE
freopen("a.txt","r",stdin);
#endif
}
// inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std; int n,m,K,Q;
struct hh{int u,v,col;}edge[sz];
int id[sz],las[sz],L[sz],R[sz],pre[sz],col[sz]; struct hhhh{int x,y,col;bool s;}; struct hhh
{
int fa[sz],f[sz],dep[sz];
int getfa(int x){return x==fa[x]?x:getfa(fa[x]);}
int getdis(int x){return x==fa[x]?0:f[x]^getdis(fa[x]);}
void cancel(hhhh a){f[fa[a.x]=a.x]=0;dep[a.y]-=a.s;}
bool connected(int x,int y){return getfa(x)==getfa(y);}
hhhh merge(int x,int y,int col)
{
int fx=getfa(x),fy=getfa(y);
if (dep[fx]>dep[fy]) swap(fx,fy),swap(x,y);
int w=getdis(x)^getdis(y)^1;
hhhh ret=(hhhh){fx,fy,col,0};
f[fx]=w;fa[fx]=fy;
if (dep[fx]==dep[fy]) ++dep[fy],ret.s=1;
return ret;
}
}G[55];
void cancel(stack<hhhh>S){while (!S.empty()) G[S.top().col].cancel(S.top()),S.pop();} vector<int>v[sz<<2];
#define ls k<<1
#define rs k<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
void insert(int k,int l,int r,int x,int y,int e)
{
if (x<=l&&r<=y) return (void)(v[k].push_back(e));
int mid=(l+r)>>1;
if (x<=mid) insert(lson,x,y,e);
if (y>mid) insert(rson,x,y,e);
}
void solve(int k,int l,int r)
{
stack<hhhh>S;
rep(i,0,(int)v[k].size()-1)
{
hh e=edge[v[k][i]];
if (!e.col) continue;
int x=e.u,y=e.v,col=e.col;
if (G[col].connected(x,y)) continue;
S.push(G[col].merge(x,y,col));
}
if (l==r)
{
hh e=edge[id[l]];
int w=G[col[l]].getdis(e.u)^G[col[l]].getdis(e.v)^1;
bool t=G[col[l]].connected(e.u,e.v);
cancel(S);
if (!t||!w) return (void)(puts("YES"),edge[id[l]].col=col[l]);
return (void)puts("NO");
}
int mid=(l+r)>>1;
solve(lson);solve(rson);
cancel(S);
} int main()
{
file();
int x,y;
read(n,m,K,Q);
rep(i,1,K) rep(j,1,n) G[i].fa[j]=j;
rep(i,1,m) read(x,y),edge[i]=(hh){x,y,0};
rep(i,1,Q)
{
read(x,y);
id[i]=x;col[i]=y;
if (las[x]) R[las[x]]=i-1;
pre[i]=las[x];las[x]=i;
L[i]=i+1,R[i]=Q;
}
rep(i,1,Q) if (L[i]<=R[i]) insert(1,1,Q,L[i],R[i],id[i]);
solve(1,1,Q);
return 0;
}

Codeforces 576E Painting Edges [分治,并查集]的更多相关文章

  1. Codeforces 1140F 线段树 分治 并查集

    题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...

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

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

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

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

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

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

  5. Codeforces 699D Fix a Tree 并查集

    原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...

  6. Codeforces 731C:Socks(并查集)

    http://codeforces.com/problemset/problem/731/C 题意:有n只袜子,m天,k个颜色,每个袜子有一个颜色,再给出m天,每天有两只袜子,每只袜子可能不同颜色,问 ...

  7. codeforces 400D Dima and Bacteria 并查集+floyd

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...

  8. hdu_5354_Bipartite Graph(cdq分治+并查集判二分图)

    题目链接:hdu_5354_Bipartite Graph 题意: 给你一个由无向边连接的图,问对于每一个点来说,如果删除这个点,剩下的点能不能构成一个二分图. 题解: 如果每次排除一个点然后去DFS ...

  9. BZOJ 4025: 二分图 [线段树CDQ分治 并查集]

    4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...

随机推荐

  1. 一个强大的VS代码搜索工具

    最近一直在寻找一款VS代码搜索插件,终于找到了一个不错的,仅支持vs2012以上. https://marketplace.visualstudio.com/items?itemName=mario- ...

  2. Linux C 编程

    主题链接地址:https://www.cnblogs.com/kele-dad/category/1194627.html

  3. hashMap源码分析1--翻译

    * Hash table based implementation of the <tt>Map</tt> interface. This* implementation pr ...

  4. JS算法练习三

    JS算法练习 1.生成一个长度为10的随机数组,使用冒泡法给数组排序 var arr=new Array(10); for (var i = 0; i <arr.length ; i++) { ...

  5. Rootkit介绍

    Rootkit 是一种特殊类型的 malware(恶意软件). Rootkit 之所以特殊是因为您不知道它们在做什么事情.Rootkit 基本上是无法检测到的,而且几乎不能删除它们. 虽然检测工具在不 ...

  6. php的2种域名转向写法

    第一种 echo '<meta http-equiv="Refresh" content="0;url=' . $url . '">' ; 第二种 ...

  7. day 10 - 1 函数进阶

    函数进阶 命名空间和作用域 命名空间 命名空间 有三种内置命名空间 —— python解释器 就是python解释器一启动就可以使用的名字存储在内置命名空间中 内置的名字在启动解释器的时候被加载进内存 ...

  8. Python11 RabbitMQ Redis

    本节内容 1.RabbitMQ 2.Redis RabbitMQ队列 安装 http://www.rabbitmq.com/install-standalone-mac.html 安装python r ...

  9. Spring重温(四)--Spring自动组件扫描

    通常情况下,声明所有的Bean类或组件的XML bean配置文件,这样Spring容器可以检测并注册Bean类或组件. 其实,Spring是能够自动扫描,检测和预定义的项目包并实例化bean,不再有繁 ...

  10. [转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?

    转载链接:https://www.zhihu.com/question/51325408/answer/125426642来源:知乎 这个问题无外乎有三个难点: 什么是sum 什么是reduce 什么 ...