【Nowcoder】2020牛客暑期多校训练营(第八场)I - Interesting Computer Game | 并查集、思维、离散化
题目链接: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 | 并查集、思维、离散化相关推荐
- 2020牛客暑期多校训练营(第一场)A B-Suffix Array(后缀数组,思维)
链接:https://ac.nowcoder.com/acm/contest/5666/A 来源:牛客网 题目描述 The BBB-function B(t1t2-tk)=b1b2-bkB(t_1 t ...
- E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)
E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...
- 2020牛客暑期多校训练营(第一场)
文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...
- 2020牛客暑期多校训练营(第二场)
2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...
- 2020牛客暑期多校训练营(第二场)Just Shuffle
https://ac.nowcoder.com/acm/contest/5667/J 题目大意:给你一个置换A,使得置换P^k=A,让你求出置换P. 思路:我们根据置换A再置换z次,那么就等于置换p ...
- 2020牛客暑期多校训练营(第一场)j-Easy Integration(思维,分数取模,沃斯利积分)
题目链接 题意: 给你一个积分公式,给你一个n,问积分公式的值取模后的结果. 思路: 积分公式(沃利斯积分)值的结论直接就是(n!)^2/(2n+1)!,求个阶乘,再用费马小定理给1/(2n+1)!取 ...
- 2020 牛客暑期多校训练营(第一场)F
题目大意: 多次输入两个a,b字符串他们可以无限次的重复变成aaa,或者bbb 比较他们的大小,相同输出 =,a<b输出 <,a>b输出 >. 输入: aa b zzz zz ...
- 2020牛客暑期多校训练营(第二场)未完待续......
F. Fake Maxpooling 题目: 题目大意: 输入n,m,k.矩阵的尺寸为nm,其中每一个元素为A[i][j] = lcm( i , j ).从中找出所有kk的子矩阵中元素最大的数之和. ...
- 2020牛客暑期多校训练营(第一场)J、Easy Integration (数学、分部积分)
题目链接 题面: 题意: 求给定的定积分. 题解,化成 ∫ xn (1-x)n dx 然后用分部积分法即可得. 分部积分法:∫ udv = uv - ∫ vdu 最终为 n!/((n+1)*(n+2) ...
- 2020牛客暑期多校训练营(第二场)题解
废话 蒟蒻不会积分,K不会做. 文章目录 废话 A. All with Pairs B. Boundary C. Cover the Tree D. Duration E. Exclusive OR ...
最新文章
- 如何用python画函数曲线_Python笔记:用matplotlib绘制函数曲线图
- Flink 靠什么征服饿了么工程师?
- 小白自学Java框架,框架的全面解析总结
- 【转】刨根究底字符编码【2.0版】(1):开篇
- LeetCode 162. 寻找峰值(二分查找)
- python3+requests:get、post请求(python get、post)
- PowerShell 扩展工具第四波!
- MySQL介绍及安装(一)
- mysql怎么拆字符串_MySQL截取和拆分字符串函数用法示例
- oracle取第一位,Oracle中的substr()函数和INSTR()函数
- python调用函数怎么错_python调用函数失败是什么原因
- 曾鸣:区块链中没有绝对的“去中心化”
- DotNetBar 6.6.0.1 Crack
- 带你初步了解生物网络分析
- 计算机二级电子表格使用技巧36种,Excel表格的基本操作(精选36个技巧)
- pose_subscriber.cpp
- ubuntu20.04 ros 采集velodyne激光雷达数据
- Excel最大值和最小值的提取问题
- 一张图,讲明白UML类图
- VS注释提示英文变中文的方法
热门文章
- 2021年值得推荐的企业管理系统crm软件
- 个性代码注释 大合集
- HTML与css作用有什么不同,HTML和CSS是什么玩意儿?
- 小区物业管理系统设计与开发论文
- 【博学谷学习记录】超强总结,用心分享 | Java入门级基础概述
- [HARDWARE] ddr、ddr2、ddr3的区别
- ​力扣解法汇总731-我的日程安排表 II
- 3.后端学习JavaScript
- Ubuntu安装软件是始终出现dpkg错误(转载,原文链接:https://blog.csdn.net/cyf15238622067/article/details/53534629)
- 一个研究生毕业以后的人生规划(转自天涯虚拟社区)