2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)
贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问。他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色。为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于 10^5105 的字符串。现在魔法师想要通过一系列魔法使得这两个字符串相同。每种魔法形如 (u,\ v),\ u,\ v \le 10^5(u, v), u, v≤105,可以将一个字符 uu改成一个字符 vv,并且可以使用无限次。出于种种原因,魔法师会强行指定这两个串能否进行修改。
若失败输出 -1−1,否则输出最少使用的魔法的种类数。
输入格式
一个正整数 n(n \le 10^5)n(n≤105) 表示每个字符串的长度。
接下来两行每行首先输入一个单词("Variable"
或"Constant"
),"Variable"
表示这个字符串能进行修改,"Constant"
表示这个字符串不能进行修改,然后 nn 个正整数表示一个字符集不大于 10^5105 的字符串。
输出格式
若有解,输出一个自然数表示最少使用的魔法的种类数。否则输出 -1−1。
保证所有输入的数字都为正整数且不大于 10^5105。
样例输入1
2
Constant 111 222
Variable 222 111
样例输出1
2
样例输入2
2
Variable 111 222
Variable 222 111
样例输出2
1
题目来源
不说了 SB错误能卡我好久。
对于cc的情况判字符串是不是相等。
对于vv的情况并查集找联通块数,次数就是总点数减去联通块数。
对于cv的情况我们仍旧双向存联通块。对于内部有自环的我们建的边数等于块内点数。对于没有自环的,我们建的边数等于块内点数-1。
第二种情况跟vv的是类似的,第一种情况则是把所有点建成一个大的自环,这样所有点都互相可达了。
#include<bits/stdc++.h>
#define clr(x) memset(x,0,sizeof(x))
#define clr_1(x) memset(x,-1,sizeof(x))
#define INF 0x3f3f3f3f
#define LL long long
#define pb push_back
#define mod 1000000007
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
#define mp make_pair
#define fi first
#define se second
using namespace std;
const int N=1e5+;
const int P=1e5;
int inf[];
int s[][N];
vector<int> e[N];
bool vis[N],ins[N];
bool ct[N];
int fa[N];
bool exist[N];
int now,ans;
char is[];
bool dfs(int u)
{
ins[u]=;
vis[u]=;
int flag=;
for(auto p:e[u])
{
if(ins[p])
{
flag=;
continue;
}
if(vis[p])
continue;
if(dfs(p)) flag=;
}
ins[u]=;
return flag;
}
int Find(int x) {return fa[x]==x?x: fa[x]=Find(fa[x]);}
void Union(int u,int v)
{
int x=Find(u),y=Find(v);
if(x!=y)
fa[x]=y;
return ;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<;i++)
{
scanf("%s",is);
if(strcmp(is,"Constant")==)
inf[i]=;
else
inf[i]=;
for(int j=;j<=n;j++)
scanf("%d",&s[i][j]);
}
if(inf[]==)
now=;
else
now=;
int pt=inf[]+inf[];
for(int i=;i<=P;i++)
fa[i]=i;
for(int i=;i<=n;i++)
{
if(pt>= && s[now][i]!=s[now^][i])
e[s[now][i]].pb(s[now^][i]),Union(s[now][i],s[now^][i]);
exist[s[now][i]]=;
exist[s[now^][i]]=;
}
ans=;
for(int i=;i<=P;i++)
{
if(e[i].size()>)
{
sort(e[i].begin(),e[i].end());
e[i].resize(unique(e[i].begin(),e[i].end())-e[i].begin());
}
if(exist[i]) ans++;
}
if(pt==)
{
bool flag=;
for(int i=;i<=n;i++)
if(s[][i]!=s[][i])
flag=;
if(flag)
printf("-1\n");
else
printf("0\n");
}
if(pt==)
{
for(int i=;i<=P;i++)
if(exist[i] && !vis[i])
if(dfs(i)) ct[Find(i)]=;
for(int i=;i<=P;i++)
if(exist[i] && fa[i]==i && ct[i]==)
ans--;
printf("%d\n",ans);
}
if(pt==)
{
for(int i=;i<=P;i++)
if(exist[i] && fa[i]==i)
ans--;
printf("%d\n",ans);
}
return ;
}
2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)的更多相关文章
- 贝壳找房魔法师顾问[并查集+DAG判断]
题目链接[https://nanti.jisuanke.com/t/27647] //计蒜客2018复赛D题,想简单了. 题解: 题目是中文的,不再赘述. 题解: 分为三种情况:1.两个字符串都不能变 ...
- 2018 计蒜之道 初赛 第五场 A 贝壳找房搬家
贝壳找房换了一个全新的办公室,每位员工的物品都已经通过搬家公司打包成了箱子,搬进了新的办公室了,所有的箱子堆放在一间屋子里(这里所有的箱子都是相同的正方体),我们可以把这堆箱子看成一个 x*y*z 的 ...
- 2016计蒜之道复赛 百度地图的实时路况(Floyd 分治)
题意 题目链接 Sol 首先一个结论:floyd算法的正确性与最外层\(k\)的顺序无关(只要保证是排列即可) 我大概想到一种证明方式就是把最短路树上的链拿出来,不论怎样枚举都会合并其中的两段,所以正 ...
- 2019 计蒜之道 复赛 E. 撑起信息安全“保护伞” (贪心,构造,规律)
为了给全球小学员打起信息安全"保护伞",VIPKID 还建立了一套立体化的安全防御体系,7 \times 247×24 小时持续安全监控与应急响应等多项联动,具备业界最高级别的数据 ...
- 2016计蒜之道复赛 百度地图的实时路况 floyd+cdq分治
链接:https://nanti.jisuanke.com/t/11217 奉上官方题解: 枚举 d(x , y , z) 中的 y,把 y 从这个图中删去,再求这时的全源最短路即可,使用 Floyd ...
- 2016计蒜之道复赛 菜鸟物流的运输网络 网络流EK
题源:https://nanti.jisuanke.com/t/11215 分析:这题是一个比较经典的网络流模型.把中间节点当做源,两端节点当做汇,对节点进行拆点,做一个流量为 22 的流即可. 吐槽 ...
- 2016计蒜之道复赛B题:联想专卖店促销
题解 思路: 二分答案,设我们要check的值为x. 注意到每一个礼包都有,一个U盘,一个鼠标. 剩余的,分别为一个机械键盘,一个U盘,一个鼠标. 当礼包数目为x时,我们至多可以提供a-x个普通,b- ...
- 2018 计蒜之道-初赛 第一场 A-百度无人车
百度一共制造了 nn 辆无人车,其中第 ii 辆车的重量为 a_i\ \mathrm{kg}ai kg. 由于车辆过重会增大轮胎的磨损程度,现在要给这 nn 辆车减轻重量.每将一辆车减轻 1\ \m ...
- 2019 计蒜之道 复赛 B. 个性化评测系统 (模拟,实现,暴搜)
24.02% 1000ms 262144K "因材施教"的教育方式自古有之,互联网时代,要实现真正意义上的个性化教育,离不开大数据技术的扶持.VIPKID 英语 2020 多万学员 ...
随机推荐
- HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js
太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章," ...
- 如何在阿里云Centos下安装Nginx
Nginx("engine x")是一款轻量级的HTTP和反向代理服务器.相比于Apache.lighttpd等,它具有占有内存少.并发能力强.稳定性高等优势.它最常见的用途就是提 ...
- 《廖雪峰Git教程》学习笔记
原文链接 一.创建版本库 ①初始化一个Git仓库:git init ②添加文件到Git仓库:1.git add<file> ; 2.git commit 二.时光机穿梭 ①查看工作区状态 ...
- 纯css进度条,各种兼容
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD&g ...
- 33 Introducing the Go Race Detector
Introducing the Go Race Detector 26 June 2013 Introduction Race conditions are among the most insidi ...
- No.13 selenium for python 单选框和复选框
单选框 radio 点击图标,可以获取HTML中定位. 使用普通的ID定位就可以了 定位到指定元素,然后使用clicd选中即可 复选框 checkbox 勾选单个框,跟单选框一样,定位后点击就可以了 ...
- 洛谷P2024食物链
传送门啦 这道题的特殊之处在于对于任意一个并查集,只要告诉你某个节点的物种,你就可以知道所有节点对应的物种. 比如一条长为4的链 甲->乙->丙->丁 ,我们知道乙是A物种.那么甲一 ...
- 配置sql server 2000以允许远程访问
配置sql server 2000以允许远程访问适合故障:1. 用sql企业管理器能访问sql server 2000(因为它是采用命名管道(named pipes)方式进行方式),但用ado.net ...
- (转载)使用SQL-Server创建一个银行数据管理系统Ⅰ
首先,要创建一个完整的数据管理系统,不是一蹴而就的,一定要要一步一步的来,不断完善,最终方能达到自己想要的结果,所以我在这里也是一点一点分步来做的. 创建数据库,数据库属性在这里用的是默认(不推荐使用 ...
- 20155225 实验三《敏捷开发与XP实践》实验报告
20155225 实验三<敏捷开发与XP实践>实验报告 一.使用工具(Code->Reformate Code)把代码重新格式化 IDEA里的Code菜单有很多实用的功能可以帮助我们 ...