洛谷

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. Android几个比较有用的插件

    1.Android  Drawable Importer 2.Android ButterKnife Zelezny 使用方法,在SetContentView上右键,Generate 3.Androi ...

  2. Jrebel for Android 安装使用

    1.打开File-Setting-plugin-browse repositories.然后点击Manger repositories添加我们的私人存储库 http://dl.zeroturnarou ...

  3. Python 生成requirement 使用requirements.txt安装类库

    快速生成requirement.txt的安装文件 (CenterDesigner) xinghe@xinghe:~/PycharmProjects/CenterDesigner$ pip freeze ...

  4. 【全文转载】Precision Helper:最佳免费 CHM 制作软件

    跳至内容 善用佳软 IT义工的个人博客: 善用佳软= (善意+善于)应用优秀软件 xbeta= x(未知数)+β(改进测试版) Precision Helper:最佳免费 CHM 制作软件 许多用户都 ...

  5. springboot06-swagger2 自动化api文档

    1.springboot 项目中添加swagger2依赖: <dependency> <groupId>org.springframework.boot</groupId ...

  6. 查看 Centos 7 的MAC 地址

    查看 Centos 7 的 MAC 地址  ens*** 网卡名称# cat /sys/class/net/eno16777736/address  查看内核版本 uname -a 查看系统版本 ca ...

  7. ubuntu 18.04/18.10解决create-react-app:command not found问题

    npm config set prefix /usr/local sudo npm install -g create-react-app create-react-app my-app

  8. 线段树模板(hdu1166)

    #include <set> #include <map> #include <queue> #include <stack> #include < ...

  9. scrapy模拟用户登录

    scrapy框架编写模拟用户登录的三种方式: 方式一:携带cookie登录,携带cookie一般请求的url为登录后的页面,获取cookie信息应在登录后的页面获取,cookie参数应转成字典形式 # ...

  10. MatrixBG 代码瀑布的实现

    黑客帝国中代码瀑布是怎么实现的呢? 我们可以通过 window.innerWidth获取屏幕的宽度W,并规定字符的大小size,那么屏幕中共有 W/size 列字符出现, 我们不断的去更改每一列中文字 ...