[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 ) .右下角是 ( ...
随机推荐
- 揭秘UGO SQL审核功能4大特性,让业务平滑迁移至GaussDB
业务挑战 数据库是企业应用系统的核心,SQL作为数据库查询.更新等操作的标准语言,重要性不言而喻.然而在实际的SQL开发过程中,也面临着诸多挑战: 数据库应用开发人员的SQL能力良莠不齐,经常写出不符 ...
- OAuth2 当前登录用户修改
1.业务说明 有些情况下,我们希望用户登录后,可以修改用户的某些信息,比如修改当前的公司信息. 2.实现方法 @Resource TokenStore tokenStore; public JsonR ...
- 通过NPOI读取 excel指定Sheet 到 DataTable
public static DataTable ReadExcelToDataTable(string fileName, string sheetName = null, bool isFirstR ...
- 【矩阵压缩】codeforces 1980 E. Permutation of Rows and Columns
题目链接 https://codeforces.com/problemset/problem/1980/E 题意 共输入\(T\)组测试用例,每组测试用例第一行输入两个整数\(n, m\),分别代表输 ...
- 从底层源码深入分析Spring的IoC容器初始化过程
IOC容器的初始化整体过程 Spring是如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的?这主要会经过以下 4 步: 从XML中读取配置文 ...
- ast-hook-for-js-RE安装
# ast-hook-for-js-RE安装 1.项目地址 点我去 2.clone到本地 git clone https://github.com/CC11001100/ast-hook-for-js ...
- kubernetes批量删除长期处于Terminating状态的namespace
环境是k3s 1.19.1版本 有时候跑实验,实验总是卡住,而且还删不了ns,一跑又n个 强行删除有风险,强删需谨慎!! 创建脚本 delns.sh #!/bin/bash for i in &quo ...
- tc端口流量控制(带宽限速)
tc qdisc add dev ens192 root handle 1: htbtc class add dev ens192 parent 1: classid 1:1 htb rate 80m ...
- virtualbox设置了共享文件夹却无权限访问
在virtualbox中设置共享文件夹后,然后登陆ubuntu系统访问共享文件夹,发现没有权限.查看共享文件夹的属性可知,共享文件夹的所有者是root,所属的组是vboxsf.以用户登录的时候,自然是 ...
- 龙哥收集的Github资源——Python量化不要自己造轮子
打开github后,在搜索框中输入下面的项目作者及项目名称,然后点一下 All Github 搜索 格式 user:xxxxx in:name xxxxxxxxxxxxx 举例 user:Cken ...