[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 ) .右下角是 ( ...
随机推荐
- web移动端常见问题(二)
1.input光标颜色 默认情况下,光标颜色与字体颜色color相同,但也可以通过caret-color属性来单独设置 但是IOS的光标与字体颜色无关,默认是蓝色 可以单独设置光标颜色,这样ios也有 ...
- kube-apiserver 高可用,keepalived + haproxy
为什么要做高可用 在生产环境中,kubernetes 集群中会多多个 master 节点,每个 master 节点上都会部署 kube-apiserver 服务,实现高可用.但是 client 访问 ...
- PowerShell一键下载Nuget某个包的所有版本
一转眼好几年没有写博客了,来博客园冒个泡,最近由于工作需要,内网办公,幸运的是只需要上传一个*.nupkg一个包信息就可以在私有nuget下载到了,下面就用PowerShell编写下载脚本,需要注意的 ...
- ThreeJs-06详解灯光与阴影
一.gsap动画库 1.1 基本使用和原理 首先直接npm安装然后导入 比如让一个物体,x轴时间为5s 旋转同理 动画的速度曲线,可以在官网的文档找到 1.2 控制动画属性与方法 当然这里面也有一些方 ...
- OS之《线程管理》
进程是系统资源分配的最小单位,线程是最小的执行单位. 然而,现在的高级设计底层还是基于这个理论基础实现的.比如java的线程,还有最新版本的JDK的协程都是在为了更好的让CPU执行任务. 线程是为了使 ...
- Flutter ListView报错RenderBox was not laid out: RenderViewport#680c1 NEEDS-LAYOUT NEEDS-PAINT
RenderBox was not laid out: RenderViewport#680c1 NEEDS-LAYOUT NEEDS-PAINT 使用ListView.builder()布局时,如果 ...
- 用 erlang 描述 tcc
Transaction 视为一个 Actor. start_transaction(Order) -> p1 = spawn(start_order(self, Order.subOrder1) ...
- 【前端】【H5 API】实现全屏显示功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【Linux】当初的学习笔记
目录 Linux 笔记 linux基本概念 linux终端四部分 linux的实质 linux系统操作命令 查询用户 who who -H whoami 修改密码 快速切换到用户目录 sshd sys ...
- postgres
10.67 su - app docker pull postgres:12.15 docker run -d --name pgsql12 -p 5432:5432 -e "POSTG ...