传送门:Interesting Computer Game

题意

给出n对数,你可以操作n次,每次操作只能在下面三种中选择一种,问最多可以选多少个不同的数字。
  • 什么都不做
  • 如果a[i]以前没选过,那么可以选择a[i]
  • 如果b[i]以前没选过,那么可以选择b[i]

题解

想法很简单,就是一个并查集。
如果a[i]和b[i]的父亲一样,那么用一个数组记录一下这个父亲,说明这个堆里有环,否则把a[i]和b[i]合并,然后用map离散化(菜鸡懒惰的做法),计算每个堆里有多少不同的数字,如果这个堆里有环,就加上不同数字的个数,否则加上不同数字的个数-1。自己写几个数就看出来了。
对于环那个地方,为什么先用数组记录父亲呢,因为后边父亲可能会变,所以先记录下来,然后在找这个父亲的父亲就没问题了。可以参考下边的数据,1 3的时候父亲是3,到了5 6之后,父亲就变成6了。
1
6
1 2
2 3
3 4
1 3
4 5
5 6
另外map会t,所以用unordered_map。

代码

 1 #include<bits/stdc++.h>
2 using namespace std;
3
4 const int maxn=100100;
5 unordered_map<int,int> par,p,x,y,q,vis;
6
7 int Find(int x){
8 if(x!=par[x])
9 par[x]=Find(par[x]);
10 return par[x];
11 }
12
13 void unite(int a,int b)
14 {
15 int fa=Find(a);
16 int fb=Find(b);
17 if(fa!=fb)
18 par[fa]=fb;
19 }
20
21 int a[maxn],b[maxn];
22 int c[maxn];
23
24 int main()
25 {
26 ios::sync_with_stdio(false);
27 cin.tie(0);
28 cout.tie(0);
29 int t;
30 cin>>t;
31 int k=0;
32 while(t--){
33 memset(c,0,sizeof(c));
34 par.clear();
35 p.clear();
36 x.clear();
37 y.clear();
38 q.clear();
39 vis.clear();
40 cout<<"Case #"<<++k<<": ";
41 int n;
42 cin>>n;
43 int pos=0;
44 int ans=0;
45 for(int i=0;i<n;i++){
46 cin>>a[i]>>b[i];
47 par[a[i]]=a[i];
48 par[b[i]]=b[i];
49 }
50 int kk=0;
51 for(int i=0;i<n;i++){
52 if(Find(a[i])==Find(b[i])) c[kk++]=Find(a[i]);
53 else unite(a[i],b[i]);
54 }
55 for(int i=0;i<kk;i++){
56 p[Find(c[i])]=1;
57 }
58 for(int i=0;i<n;i++){
59 int xx=Find(a[i]);
60 int yy=Find(b[i]);
61 if(!x[xx]) x[xx]=++pos,q[pos]=xx;
62 if(!x[yy]) x[yy]=++pos,q[pos]=yy;
63 }
64 for(int i=0;i<n;i++){
65 if(!vis[a[i]]) y[x[Find(a[i])]]++;
66 vis[a[i]]=1;
67 if(!vis[b[i]]) y[x[Find(b[i])]]++;
68 vis[b[i]]=1;
69 }
70 for(int i=1;i<=pos;i++){
71 if(!p[q[i]]) ans--;
72 ans+=y[i];
73 }
74 cout<<ans<<endl;
75 }
76 return 0;
77 }

2020牛客暑期多校训练营(第八场)Interesting Computer Game的更多相关文章

  1. 2020牛客暑期多校训练营(第一场)H Minimum-cost Flow

    Minimum-cost Flow 题目:给n个点,m条边.接下来m行包含(a,b,c),即a,b之间有单位流量代价为c的边.接下来有q个问题,每个问题给定(x,y),即假设每条边的容量为x/y时,从 ...

  2. 2020牛客暑期多校训练营(第二场) Boundary

    传送门:Boundary  题意:给你n个点的坐标,问最多有多少个点可以在同一个圆上,(0,0)必须在这个圆上. 题解:三个点确定一个圆,所以暴力枚举两个点和(0,0)组成的圆,如果三个点不共线的话, ...

  3. 2020牛客暑期多校训练营(第一场)Easy Integration

    传送门:J. Easy Integration 题意:给你n,求这个积分,最后的结果分子是记为p,分母记为q. 求(p*q-1)mod 998244353. 题解:比赛完看到巨巨说这是贝塔函数,我一搜 ...

  4. 2020牛客暑期多校训练营 (第二场) All with Pairs

    传送门:All with Pairs 题意:给你n个字符串,求出,f(si,sj)的意思是字符串 si 的前缀和字符串 sj 后缀最长相等部分. 题解:先对所有的字符串后缀hash,用map记录每个h ...

  5. 2020牛客暑期多校训练营(第二场)Fake Maxpooling

    传送门:Fake Maxpooling 题意:给出矩阵的行数n和列数m,矩阵 Aij = lcm( i , j )  ,求每个大小为k*k的子矩阵的最大值的和. 题解:如果暴力求解肯定会t,所以要智取 ...

  6. 2020牛客暑期多校训练营(第二场) F.Fake Maxpooling (单调队列)

    题意:有一个\(n\)x\(m\)的矩阵,\(A_{i,j}=lcm(i,j)\),对于每个\(k\)x\(k\)的子矩阵,其最大元素贡献给答案,求答案的最大值. 题解:矩阵构成我们直接\(i*j/g ...

  7. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  8. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  9. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  10. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

随机推荐

  1. uber_go_guide解析(三)(规范)

    前言 一主要讲的是容易忽略的错误,可能在build时都不会体现出来但是在使用时出现问题 二主要讲的是一些可以提高代码效率的用法 本篇则讲解一些规范,不是强制的但是根据规范会提高代码的可读性, 减少BU ...

  2. LeetCode106 从中序和后序序列构造二叉树

    题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [ ...

  3. Python实验6--网络编程

    题目1 1.编写程序实现基于多线程的TCP客户机/服务器程序. (1)创建服务器端套接字Socket,监听客户端的连接请求: (2)创建客户端套接字Socket,向服务器端发起连接: 服务器端套接字 ...

  4. HBase的架构设计为什么这么厉害!

    老刘是一名即将找工作的研二学生,写博客一方面是复习总结大数据开发的知识点,一方面是希望能够帮助和自己一样自学编程的伙伴.由于老刘是自学大数据开发,博客中肯定会存在一些不足,还希望大家能够批评指正,让我 ...

  5. 【ORACLE】11g rac+dg

    首先感谢群友分享的文档,在这里先感谢哆啦B梦,非常感谢 该文档主要指导如何利用现有的RAC环境搭建一套RAC与单实例的DG的环境  ============================主机配置信息 ...

  6. layui表格前端格式化时间戳字段

    layui.use(['util','table'], function(){   var table = layui.table;   var util = layui.util;   //... ...

  7. [Usaco2005 Mar]Out of Hay 干草危机

    题目描述 Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发.农场之间总共有M (1 <= M <= 10,000)条双向道路,所有 ...

  8. 十一、UART&TTY驱动

    Linux系统中UART驱动和TTY驱动两者有着紧密的关系,它们不像I2C和SPI驱动是单独一个模块,分析时应当将它们看成一个整体来分析.UART驱动部分依赖于硬件平台,而TTY驱动和具体的平台无关. ...

  9. U盘制作系统启动盘方法

    1.下载一个UltralSO用来把CentOS系统镜像写入U盘作为启动安装盘 U盘用一个空U盘,会格式化的. 下载下来,使用试用版就行 刻录完成.

  10. Fastjson1.2.24反序列化漏洞复现

    Fastjson1.2.24 目录 1. 环境简介 1.1 物理环境 1.2 网络环境 1.3 工具 1.4 流程 2. Docker+vulhub+fastjson1.2.24 2.1 Docker ...