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 ...
随机推荐
- 反模式 DI anti-patterns
反模式 DI anti-patterns 反模式DI anti-patterns <Dependency Injecttion Prinsciples,Practices, and Patter ...
- 04-Python文件操作
打开文件 f=open("我的文件.txt","r",encoding="utf8") #打开一个文件(读模式) f.close() #关闭 ...
- 01-Linux系统介绍、安装与入门
关于Linux 背景 最先出现的是Unix操作系统,这种操作系统收费,而且适用于大型机上面. Linus想做一个免费的,传播自由的操作系统.他就仿照Unix的操作,做了一个类Unix系统:Linux内 ...
- 从PDF到OFD,国产化浪潮下多种文档格式导出的完美解决方案
前言 近年来,中国在信息技术领域持续追求自主创新和供应链安全,伴随信创上升为国家战略,一些行业也开始明确要求文件导出的格式必须为 OFD 格式.OFD 格式目前在政府.金融.税务.教育.医疗等需要文件 ...
- 【Hadoop报错】The directory item limit is exceeded: limit=1048576 items=1048576
问题描述: 调度系统执行hive任务失败,一直执行失败,报错如下: java.io.IOException: java.net.ConnectException: Call From #HostNam ...
- React Context 的使用
使用React开发应用程序时,如果多个组件需要共享数据,可以把数据放到父组件中,通过属性向下传递给子组件.但当组件嵌套较深时,两个最底层的组件要想共享数据,那就霜要把数据放到最顶层的组件中,然后再一层 ...
- ARC108C
考虑一颗树怎么染色. 每个子节点染成边的颜色,如果与父亲节点相同,就随便染色(这条边的限制已经被父亲节点满足). 那么一定可以染色. 所以把原图跑最小生成树再按上述方法染色即可. 倘若原图不连通,那么 ...
- linux scp自动填充密码脚本
在linux上使用scp命令传输文件时,每传输一次,都要填写目标服务器的登录密码,十分麻烦. 配置系统密钥又比较复杂,于是想到的使用expect写一个自动填充密码的脚本,脚本内容如下: scp.sh ...
- 组件中 data 为什么是一个函数?
如果两个实例引用同一个对象,当其中一个实例的属性发生改变时,另一个实例属性也随之改变,对象没有自己的作用域,只有当两个实例拥有自己的作用域时,才不会相互干扰. 这是因为JavaScript的特性所导致 ...
- Java-JSTL标签简化和替换jsp页面上的java代码
概念:JavaServer Pages Tag Library JSP标准标签库 作用:用于简化和替换jsp页面上的java代码 使用标签: 导入jstl相关jar包 引入标签库:taglib指令:& ...