题目链接:https://ac.nowcoder.com/acm/contest/5673/I

题目大意:

从1~n给出n组数据,每次可以选择a 或者选择b,选了之后不能在选,问最多选多少个?

题目思路:

和之前总结的一道题很像:https://blog.csdn.net/qq_43857314/article/details/107253264

注意到关联性,所以不可以贪心的去搞

考虑并查集

当一些点连同时

1.如果当前存在n-1条边,也就是是一棵树,你总可以使得有n-1个点被选

update:

引出:对于一棵树,你总可以使得一个点不被选,其他点都被选

简单证明一下,对于每条边而言,树内是无向边,但是操作时可以将他看为有向边,比如a-b,如果这组数据选择a,那么a<-b

也就是说此时a的入度+1,而我们的目标是除了一个点外其余的入度都是1

因为图联通,所以我们总可以找到一个点入度为0,使得从该点出发的一个拓扑序

所以得证:对于一棵树,可以随意剩下一个点不被选

2.如果大于n-1条边,根据上述的红字,那么哪个边多出来,这个边连接的一个点就作为入度为0的点,然后用这多余的边去补上入度为0的点的入度。

因为可以不选,所以就结束了~

注意到数据范围,所以离散化一下即可

Code:

/*** keep hungry and calm CoolGuang!***/
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#include <string.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pp;
const ll INF=1e17;
const int Maxn=1e6+10;
const int maxn =1e6+10;
const int mod= 998244353;
const int Mod = 1e6+7;
const int S = 1000;
inline bool read(ll &num)
{char in;bool IsN=false;in=getchar();if(in==EOF) return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;return true;}
ll n,m,p;
int pre[maxn];
struct node{int x,y;
}q[maxn];
ll sz[maxn],ed[maxn];
int vis[maxn];
vector<int>v;
int Find(int x){return pre[x] == x?x:pre[x] = Find(pre[x]);
}
int getid(ll x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
int main()
{int cas = 0;int T;scanf("%d",&T);while(T--){read(n);v.clear();for(int i=1;i<=n;i++){scanf("%d%d",&q[i].x,&q[i].y);v.push_back(q[i].x);v.push_back(q[i].y);}sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());int szt = v.size();/// debug(szt);printf("Case #%d: ",++cas);for(int i=1;i<=szt;i++) pre[i] = i,sz[i] = 1,ed[i] = 0,vis[i] = 0;for(int i=1;i<=n;i++){int x = getid(q[i].x),y = getid(q[i].y);int dx = Find(x),dy = Find(y);if(dx != dy){pre[dx] = dy;sz[dy] += sz[dx];ed[dy] += ed[dx]+1;}else ed[dx]++;}ll ans = 0;for(int i=1;i<=szt;i++){int di = Find(i);if(!vis[di]){vis[di] = 1;if(ed[di]>=sz[di]) ans+=sz[di];else ans+=sz[di]-1;}}printf("%lld\n",ans);}return 0;
}

【Nowcoder】2020牛客暑期多校训练营(第八场)I - Interesting Computer Game | 并查集、思维、离散化相关推荐

  1. 2020牛客暑期多校训练营(第一场)A B-Suffix Array(后缀数组,思维)

    链接:https://ac.nowcoder.com/acm/contest/5666/A 来源:牛客网 题目描述 The BBB-function B(t1t2-tk)=b1b2-bkB(t_1 t ...

  2. E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)

    E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...

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

    文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...

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

    2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...

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

    https://ac.nowcoder.com/acm/contest/5667/J 题目大意:给你一个置换A,使得置换P^k=A,让你求出置换P. 思路:我们根据置换A再置换z次,那么就等于置换p ...

  6. 2020牛客暑期多校训练营(第一场)j-Easy Integration(思维,分数取模,沃斯利积分)

    题目链接 题意: 给你一个积分公式,给你一个n,问积分公式的值取模后的结果. 思路: 积分公式(沃利斯积分)值的结论直接就是(n!)^2/(2n+1)!,求个阶乘,再用费马小定理给1/(2n+1)!取 ...

  7. 2020 牛客暑期多校训练营(第一场)F

    题目大意: 多次输入两个a,b字符串他们可以无限次的重复变成aaa,或者bbb 比较他们的大小,相同输出 =,a<b输出 <,a>b输出 >. 输入: aa b zzz zz ...

  8. 2020牛客暑期多校训练营(第二场)未完待续......

    F. Fake Maxpooling 题目: 题目大意: 输入n,m,k.矩阵的尺寸为nm,其中每一个元素为A[i][j] = lcm( i , j ).从中找出所有kk的子矩阵中元素最大的数之和. ...

  9. 2020牛客暑期多校训练营(第一场)J、Easy Integration (数学、分部积分)

    题目链接 题面: 题意: 求给定的定积分. 题解,化成 ∫ xn (1-x)n dx 然后用分部积分法即可得. 分部积分法:∫ udv = uv - ∫ vdu 最终为 n!/((n+1)*(n+2) ...

  10. 2020牛客暑期多校训练营(第二场)题解

    废话 蒟蒻不会积分,K不会做. 文章目录 废话 A. All with Pairs B. Boundary C. Cover the Tree D. Duration E. Exclusive OR ...

最新文章

  1. 如何用python画函数曲线_Python笔记:用matplotlib绘制函数曲线图
  2. Flink 靠什么征服饿了么工程师?
  3. 小白自学Java框架,框架的全面解析总结
  4. 【转】刨根究底字符编码【2.0版】(1):开篇
  5. LeetCode 162. 寻找峰值(二分查找)
  6. python3+requests:get、post请求(python get、post)
  7. PowerShell 扩展工具第四波!
  8. MySQL介绍及安装(一)
  9. mysql怎么拆字符串_MySQL截取和拆分字符串函数用法示例
  10. oracle取第一位,Oracle中的substr()函数和INSTR()函数
  11. python调用函数怎么错_python调用函数失败是什么原因
  12. 曾鸣:区块链中没有绝对的“去中心化”
  13. DotNetBar 6.6.0.1 Crack
  14. 带你初步了解生物网络分析
  15. 计算机二级电子表格使用技巧36种,Excel表格的基本操作(精选36个技巧)
  16. pose_subscriber.cpp
  17. ubuntu20.04 ros 采集velodyne激光雷达数据
  18. Excel最大值和最小值的提取问题
  19. 一张图,讲明白UML类图
  20. VS注释提示英文变中文的方法

热门文章

  1. 2021年值得推荐的企业管理系统crm软件
  2. 个性代码注释 大合集
  3. HTML与css作用有什么不同,HTML和CSS是什么玩意儿?
  4. 小区物业管理系统设计与开发论文
  5. 【博学谷学习记录】超强总结,用心分享 | Java入门级基础概述
  6. [HARDWARE] ddr、ddr2、ddr3的区别
  7. ​力扣解法汇总731-我的日程安排表 II
  8. 3.后端学习JavaScript
  9. Ubuntu安装软件是始终出现dpkg错误(转载,原文链接:https://blog.csdn.net/cyf15238622067/article/details/53534629)
  10. 一个研究生毕业以后的人生规划(转自天涯虚拟社区)