[CF576E] Painting Edges 题解
模版题的升级了。
使用二分图经典判定方法(一个点拆成两个点 \(x,x+n\),连边 \((x,y)\) 就是连接 \((x,y+n),(x+n,y)\),那么是否是二分图就等价于判断 \(x,x+n\) 是否都不在一个集合内),预处理出每个操作的 \(e_i\) 下一次出现的位置 \(nx_i\),每一次修改边相当于给 \((i,nx_i)\) 这个区间内的 \(c_i\) 颜色加了 \(e_i\) 这条边,那就是经典线段树分治了。
时间复杂度 \(O(n\log^2n\log k)\)。
#include<bits/stdc++.h>
using namespace std;
const int N=5e7+5,M=5e5+5;
int n,m,k,fa[N],sz[N],xc[M],yc[M];
int q,ls[M],nx[M],eg[M],c[M],lc[M];
inline int idx(int x,int cl){
return (cl-1)*2*n+x;
}struct mer{
int sz,x,y;
};stack<mer>st;
struct ed{
int x,y;
};vector<ed>g[4*M];
inline void init(){
for(int i=1;i<=2*n*k;i++)
fa[i]=i,sz[i]=1;
}inline int find(int x){
return fa[x]==x?x:find(fa[x]);
}inline void unite(int x,int y){
x=find(x),y=find(y);
if(x==y) return;
if(sz[x]<sz[y]) swap(x,y);
st.push({sz[x],x,y});
fa[y]=x,sz[x]+=sz[y];
}inline void chg(int x,int l,int r,int L,int R,ed e){
if(L>R) return;
if(L<=l&&r<=R){
g[x].push_back(e);
return;
}int mid=(l+r)/2;
if(L<=mid) chg(x*2,l,mid,L,R,e);
if(R>mid) chg(x*2+1,mid+1,r,L,R,e);
}inline void solve(int x,int l,int r){
int ans=1,ltp=st.size();
for(auto e:g[x]) unite(e.x,e.y);
int mid=(l+r)/2;
if(l!=r){
solve(x*2,l,mid);
solve(x*2+1,mid+1,r);
}else{
int xa=idx(xc[eg[l]],c[l]);
int ya=idx(yc[eg[l]],c[l]);
int xb=idx(xc[eg[l]]+n,c[l]);
int yb=idx(yc[eg[l]]+n,c[l]);
int xl=idx(xc[eg[l]],lc[eg[l]]);
int yl=idx(yc[eg[l]],lc[eg[l]]);
int xr=idx(xc[eg[l]]+n,lc[eg[l]]);
int yr=idx(yc[eg[l]]+n,lc[eg[l]]);
if(find(xa)==find(ya)){
if(lc[eg[l]]){
chg(1,1,q,l+1,nx[l],{xl,yr});
chg(1,1,q,l+1,nx[l],{xr,yl});
}cout<<"NO\n";
}else{
cout<<"YES\n",lc[eg[l]]=c[l];
chg(1,1,q,l+1,nx[l],{xa,yb});
chg(1,1,q,l+1,nx[l],{xb,ya});
}
}while(st.size()>ltp){
mer x=st.top();st.pop();
fa[x.y]=x.y,sz[x.x]=x.sz;
}
}int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>k>>q,init();
for(int i=1;i<=m;i++)
cin>>xc[i]>>yc[i];
for(int i=1;i<=q;i++){
cin>>eg[i]>>c[i];
nx[ls[eg[i]]]=i-1;
nx[ls[eg[i]]=i]=q;
}solve(1,1,q);
return 0;
}
[CF576E] Painting Edges 题解的更多相关文章
- CF938G Shortest Path Queries 和 CF576E Painting Edges
这两道都用到了线段树分治和按秩合并可撤销并查集. Shortest Path Queries 给出一个连通带权无向图,边有边权,要求支持 q 个操作: x y d 在原图中加入一条 x 到 y 权值为 ...
- CF576E Painting Edges
首先,有一个很暴力的nk的做法,就是对每种颜色分别开棵lct来维护. 实际上,有复杂度与k无关的做法. 感觉和bzoj4025二分图那个题的区别就在于这个题是边dfs线段树边拆分区间.
- 【CF576E】Painting Edges 线段树按时间分治+并查集
[CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- Codeforces 576E Painting Edges [分治,并查集]
洛谷 Codeforces 建议阅读这篇博客作为预备.无耻地打广告 思路 与bzoj4025很相似,思路也差不多,可以看上面那篇博客. 仍然是用二分图的充要条件:没有奇环. 然而这题难在每条边的存在时 ...
- Codeforces Round 319 # div.1 & 2 解题报告
Div. 2 Multiplication Table (577A) 题意: 给定n行n列的方阵,第i行第j列的数就是i*j,问有多少个格子上的数恰为x. 1<=n<=10^5, 1< ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- LeetCode Number of Connected Components in an Undirected Graph
原题链接在这里:https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/ 题目: Giv ...
- LeetCode 323. Number of Connected Components in an Undirected Graph
原题链接在这里:https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/ 题目: Giv ...
- AGC033 D~F——[ 值放到角标的DP ][ 思路+DP ][ 思路 ]
地址:https://atcoder.jp/contests/agc033/ D Complexity dp[ i ][ j ][ k ][ l ] 表示左上角是 ( i , j ) .右下角是 ( ...
随机推荐
- Conda + JuiceFS :增强 AI 开发环境共享能力
Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统,因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎. Conda 支持在不同的操作系统上重建相同的工作环境,但在环境共享复用方 ...
- 攻防世界:web习题之xff_referer
攻防世界:web习题之xff_referer 题目内容 https://adworld.xctf.org.cn/challenges/list 这道题的网页会首先会显示: 当成功修改ip地址之后会提示 ...
- git 基础操作 && 在"develop"分支修改动但不想提交切换到"master"分支(最后)
测试学习准备条件:一个目录,含不含有文件都可以,创建一个test.txt 1. 创建空仓库 git init 2. 修改过后,添加到本地仓库 添加指定的文件,如果一个以上,文件名空格隔开 git ad ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 — Vision Kit(2)
1.问题描述: 人脸活体检测返回上一页App由沉浸式变为非沉浸式多了上下安全区域. 解决方案: 检测结束后需要自己去设置沉浸式配置. 2.问题描述: Vision Kit文字识别是本地识别,还是上传至 ...
- Windows10 64环境下用Qt5.12.12自带的mingw730_64构建编译OpenCV4.1.0时cmake-3.20.6中的参数配置
一.环境条件说明: 操作系统:Windows10 64环境 编译工具:用Qt5.12.12自带的mingw730_64构建 构建对象:编译OpenCV4.1.0的Release 64位和Debug 6 ...
- ant利用ivy从maven仓库下载项目所依赖的jar包默认的存储位置
ant利用ivy从maven仓库下载项目所依赖的jar包默认的存储位置为: 当前登录系统的用户目录下(如"C:\Users\Administrator\.ivy2\cache"), ...
- .net core反射练习-简易版IOC容器实现
实现一个简易的IOC容器 先说一下简单思路,参考ServiceCollection,需要一个注册方法跟获取实例方法,同时支持构造函数注入.那么只需要一个地方存储注册接口跟该接口的继承类,以及根据类的构 ...
- Solution Set -「NOIP Simu.」20221014
\(\mathscr{A}\sim\)「Unknown」tothecrazyones 有 \(n\) 堆石子, 第 \(i\) 堆有 \(a_i\) 个. Alice 和 Bob 轮流抓取, Al ...
- Redis学习笔记之Jedis
Jedis语法总结 Jedis是Java代码操作Redis的工具包,里面封装了操作Redis的方法 Jedis jedis = new Jedis(String ip , String port) 1 ...
- CDS标准视图:维护计划员组 I_MAINTENANCEPLANNERGROUP
视图名称:维护计划员组 I_MAINTENANCEPLANNERGROUP 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Maintenance Planne ...