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捕获音频和视频
			
原文地址:http://www.html5rocks.com/en/tutorials/getusermedia/intro/ 概述 有了HTML5,我们就可以在不借助Flash或者Silverlig ...
 - G - Pandaland HDU - 6005   (找最小环)
			
题目链接:https://cn.vjudge.net/contest/275153#problem/G 具体思路: 我们可以按照暴力的方法进行做 , 我们可以枚举每一条边,将这条边的权值设置为inf, ...
 - 使用 script 命令记录用户操作行为
			
Script 命令可以帮助管理员记录用户的操作行为,包括用户查看文件中的哪些具体内容,写入了哪些文件,写了些什么都能看到,比较详细的记录了用户的操作行为. 本文对此进行简要说明. 1.添加日志记录 e ...
 - PATH变量重复
			
命令: export PATH=$(echo $PATH | tr : "\n"| sort | uniq | tr "\n" :) Code: awk -F: ...
 - Docker技术这些应用场景【转】
			
场景一:节省项目环境部署时间 1.单项目打包 每次部署项目到测试.生产等环境,都要部署一大堆依赖的软件.工具,而且部署期间出现问题几率很大,不经意就花费了很长时间. Docker主要理念就是环境打包部 ...
 - C# 日文网址转punnycode
			
Uri uri = new Uri(url); IdnMapping idn = new IdnMapping();url= url.Replace(uri.Host, idn.GetAscii(ur ...
 - oracle11g的冷热备份
			
1.冷备份 如果数据库可以正常关闭,而且允许关闭足够长的时间,那么就可以采用冷备份(脱机备份),可以是归档冷备份,也可以是非归档冷备份.其方法是首先关闭数据库,然后备份所有的物理文件,包括数据文件.控 ...
 - redhat6.5文件共享
			
以下操作均需要root用户 a端: 固定nfs端口 #vi /etc/sysconfig/nfs 将里面的RQUOTAD_PORT.LOCKD_TCPPORT.LOCKD_UDPPORT.MOUNTD ...
 - Spring Boot连接Mysql数据库问题解决
			
在spring Boot项目中使用mysql数据库进行数据库的增删查改,出现以下错误: Error starting ApplicationContext. To display the auto-c ...
 - 五、springcloud之客户端负载均衡Ribbon
			
一.简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式: 一种是ribbon+restTemplate, ...