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 多万学员 ...
随机推荐
- SolrJ案例实现搭建环境——(十五)
案例
- python学习之argparse模块的使用
以下内容主要来自:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html argparse ...
- 使用postman做接口测试(二)
参考大神总结:https://www.cnblogs.com/Skyyj/p/6856728.html 二,下边的东西工作中实际要用到了 1, postman安装 chrome浏览器打开chrome: ...
- C++如何判断大小端
http://bbs.chinaunix.net/thread-1257205-1-1.html #include <stdio.h>#include <string.h>#i ...
- Git如何设置多个用户
前言 由于我们在使用GitHub时,通常不希望带有公司信息,所以需要独立的Git账户来提交练习代码,本文记录一下如何配置多个Git账户并创建公钥 正文 1.首先进入~/.ssh文件夹 2.然后创建一个 ...
- 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)
Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...
- Shell编程学习1--基础了解
"#!path"告诉系统path所指的程序为用来解释此脚本文件的Shell程序: 如#!/bin/sh, #!/bin/bash Shell Script的后缀名为.sh; ech ...
- linux 命令之cut
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut [-bn] [file] 或 cut ...
- java基础63 JavaScript中的Number、Math、String、Date对象(网页知识)
本文知识点(目录): 1.Number对象 2.Math对象 3.String对象 4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...
- invalid byte sequence for encoding "UTF8": 0xe99d2c
服务器还原数据库数据出错,老规矩... 字符集编码的问题 http://blog.csdn.net/beiigang/article/details/39582583 over....