CF506D题解
Mr. Kitayuta's Colorful Graph
算法:根号分治。
题目大意先说一下:给一个 \(n\) 点 \(m\) 边的无向图,边有颜色。\(q\) 组询问,每次给出 \(u,v\),求有多少种颜色 \(c\),使得存在一条 \(u\) 到 \(v\) 的路径,这个路径中每条边的颜色都为 \(c\)。
数据范围:\(2\le n\le 10^5,1\le c\le m,q\le 10^5\)。
先考虑一个朴素的暴力,暴力对每个颜色加边,用并查集判连通性,暴力扫过每个询问,如果在一个颜色上这两个点是连通的,答案加 \(1\)。
发现这种做法在颜色非常多的时候要扫过每个颜色和每个询问的时间复杂度非常高,难以接受,所以要考虑优化。
我们怎么优化?上文提及了在颜色非常多的时候复杂度会爆炸,那么他有什么优势?当然是在颜色少的时候跑得很快,那么我们采取他的优势,想一想颜色多的时候的优秀的写法。
这里可以停顿 \(1\) 分钟,自己想一下。
我们可以发现,既然颜色多,边的数量不会太多,那么就证明每个颜色的边连接的点不会太多,所以我们可以暴力枚举这样的颜色的边连接的点,判断是否连通,如果连通就答案加 \(1\)。
但是会出现一个问题,如果这个点对不在询问里怎么办?这其实是无关紧要的,因为询问的我们会处理到,没有询问的随便加也不会影响。
所以我们记颜色 \(c\) 的边数为 \(cnt_c\),以 \(\sqrt m\) 为分界线,判断使用哪种暴力。
由于这道题的代码作者认为并不好写,所以下面放一下代码。
#include<bits/stdc++.h>
#define int long long
#define N 100005
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
int n,m,q,cnt[N];
int p[N];
vector<pii>e[N],qry,rqry,f[N];
map<int,bool>col;
map<pii,int>res;
int find(int x){
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
void force1(){
for(int i=1;i<=n;i++){
p[i]=i;
}
for(auto eu:col){
int c=eu.x;
if(cnt[c]<sqrt(m))continue;
for(auto edge:e[c]){
int a=edge.x,b=edge.y;
int fa=find(a),fb=find(b);
if(fa!=fb){
p[fa]=fb;
}
}
map<pii,bool>st;
for(auto eu:qry){
int a=eu.x,b=eu.y;
if(st[{a,b}])continue;
int fa=find(a),fb=find(b);
if(fa==fb)res[{a,b}]++;
st[{a,b}]=1;
}
for(auto color:e[c]){
int a=color.x,b=color.y;
p[a]=a;p[b]=b;
}
}
}
void force2(){
for(int i=1;i<=n;i++){
p[i]=i;
}
for(auto eu:col){
int c=eu.x;
if(cnt[c]>=sqrt(m))continue;
vector<int>ind;
map<int,bool>state;
for(auto edge:e[c]){
int a=edge.x,b=edge.y;
if(!state[a]){
state[a]=1;
ind.push_back(a);
}
if(!state[b]){
state[b]=1;
ind.push_back(b);
}
int fa=find(a),fb=find(b);
if(fa!=fb){
p[fa]=fb;
}
}
for(int i=0;i<ind.size();i++){
for(int j=i+1;j<ind.size();j++){
int a=ind[i],b=ind[j];
int c=min(a,b),d=max(a,b);
int fa=find(c),fb=find(d);
if(fa==fb){
res[{c,d}]++;
}
}
}
for(auto color:e[c]){
int a=color.x,b=color.y;
p[a]=a;p[b]=b;
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
if(a>b)swap(a,b);
cnt[c]++;
col[c]=1;
e[c].push_back({a,b});
}
cin>>q;
for(int i=1;i<=q;i++){
int a,b;
cin>>a>>b;
if(a>b)swap(a,b);
qry.push_back({a,b});
rqry.push_back({a,b});
}
sort(qry.begin(),qry.end());
qry.erase(unique(qry.begin(),qry.end()),qry.end());
force1();
force2();
for(auto eu:rqry){
int a=eu.x,b=eu.y;
cout<<res[{a,b}]<<'\n';
}
return 0;
}
CF506D题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- k8s集群搭建及对一些组件的简单理解(一)
背景 k8s的学习环境(用kubeadm方式搭建),我也搭过几次了,但都有点问题. 要么在云服务器上弄,这个的问题是就只有一台轻量服务器,只能搭个单节点的:后来买了一台便宜的,所以就有了两台,但是不在 ...
- 记录一次EF实体跟踪错误
记录一次EF实体跟踪错误 前言 在我写文章编辑接口的,出现了一个实体跟踪的错误,详情如下 System.InvalidOperationException: The instance of entit ...
- 安卓内核编译:关闭"error, forbidden warning"
安卓内核编译:关闭error, forbidden warning 背景 最近在编译Android kernel时,遇到error, forbidden warning, 导致编译中断,大大降低了de ...
- 高通平台抓ram dump
高通平台抓ram dump 原文(有删改):https://blog.csdn.net/m0_37166404/article/details/80821600 背景 高通平台下提供了一个工具,专门用 ...
- Springboot中自定义监听器
一.监听器模式图 二.监听器三要素 广播器:用来发布事件 事件:需要被传播的消息 监听器:一个对象对一个事件的发生做出反应,这个对象就是事件监听器 三.监听器的实现方式 1.实现自定义事件 自定义事件 ...
- 实测52.4MB/s!全国产ARM+FPGA的CSI通信案例分享!
CSI总线介绍与优势 CSI(CMOS sensor parallel interfaces)总线是一种用于连接图像传感器和处理器的并行通信接口,应用于工业自动化.能源电力.智慧医疗等领域,CSI总线 ...
- vmware安装配置openwrt
前言 OpenWrt是一个轻量的嵌入式linux系统,功能十分强大. 现在将我在vmware上安装OpenWrt的过程简单记录下来,以备后续参考. 环境准备 vmware软件 已经安装好的一个vmwa ...
- 《探索Python Requests中的代理应用与实践》
requests加代理 高匿API代理 此处使用的小象代理:1元100个,便宜,可以购买尝试加下代理 存活期1到2分钟 import time import requests from lxml im ...
- 开源免费又好用的中式数据报表:UReport2是一款高性能的架构在Spring之上纯Java报表引擎,通过迭代单元格可以实现任意复杂的中国式报表。
北润乾.南帆软,数加发力在云端. uReport 身何安?中式报表真开源. 报表江湖之中,uReport安身立命的产品品类定位是什么? 说来很简单,uReport的价值在于填补了这样一个市场空白:开源 ...
- 统计里面PV 和 UV代表什么意思
1.网站流量bai统计中"PV"它所代表的意思是访问量了,具体指的du就是网站zhi的页面点击量或是浏览量,亦或是页面的刷新量dao了,网站的页面每刷新一次,就统计一个" ...