BZOJ1854 连续攻击游戏 题解
题目
lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。 游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。 现在lxhgww想知道他最多能连续攻击boss多少次?
输入格式
输入的第一行是一个整数N,表示lxhgww拥有N种装备 接下来N行,是对这N种装备的描述,每行2个数字,表示第i种装备的2个属性值
输出格式
输出一行,包括1个数字,表示lxhgww最多能连续攻击的次数。
输入样例
3
1 2
3 2
4 5
输出样例
2
题解
BZOJ日常挂...
洛谷AC:
先说操作:
把武器的两个属性当作节点, 如果父亲不相等, 用并查集合并起来, 数值大的节点做父节点, 数值小的标记, 如果数值相等, 标记父亲
从\(1\)开始, 扫描每个节点(无论是否出现过), 如果\(i\)没有被标记, 就输出\(i-1\)
对应样例的图:
加粗边缘的节点是已标记的
从\(1\)扫描到\(3\), 未标记, 输出\(2\)
为什么要输出\(i-1\)呢? 很简单
红线圈住的部分是每个武器
因为每个武器只能使用一个属性, 所以最开始\(1-2\), 只标记了\(1\), 而后来\(2\)之所以也被标记, 是因为又出现了一个属性里含\(2\)的武器, 对于这个新武器, 不使用值为\(3\)的属性, 使用值为\(2\)的属性是完全没问题的, 不需要考虑之前的武器使用了什么.
由于从小到大依次使用属性, 所以被标记的是小的
这个\(4-5\)有什么作用? 如果又出现一个\(3-4\)武器, 那么图就会变成这样:
所以保存其它的属性是为了以后的可能存在的更优解
但是, 题中还要求使用的属性必须每次递增1, 如果武器的属性不是相差\(1\)呢?
比如这样的图:
输出为\(1\), 是正确的, 原因就是从\(1\)遍历到\(2\)的时候, \(2\)虽然没有出现过, 但也要遍历, 也要检查是否被标记, 当然没有被标记, 所以直接输出\(2-1=1\)了, 遍历过程中还发现这条路断了(\(1-2-3\)中缺失\(2\)), 就输出能走到的最大节点\(1\)
如果还有一个武器是\(2-3\)的话, 图就会变成这样:
输出显然是\(2\)
别忘了, 当武器的两个属性父亲相等的时候, 直接标记父节点, 假设又出现了一个\(1-2\)武器, \(2\)和\(3\)的父亲是\(3\), 相等, 那么图变成这样:
\(3\)节点也被标记了, 输出是\(3\), 这个怎么理解呢?
原本\(1-3\)武器不再使用属性值\(1\),转而使用\(3\), 因为新加入的武器含属性值\(1\), 可以代替它执行\(1\)的职责
同理, 这个也可以看作\(2-3\)武器不再使用属性值\(2\),转而使用\(3\), 因为新加入的武器含属性值\(2\), 可以代替它执行\(2\)的职责:
代码
#include <cstdio>
#include <iostream>
int n, fa[1000005],x,y,p,q;
bool vis[1000005];
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
bool join(int x, int y) {
if (x < y) std::swap(x, y);
vis[y] = 1, fa[y] = x;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n + 1; i++) fa[i] = i;
for (int i = 1; i <= n; i++) {
scanf("%d%d", &x, &y);
if((p = find(x)) == (q = find(y))) vis[p] = 1;
else join(p, q);
}
for (int i = 1; i <= n + 1; i++)
if (!vis[i]) {
printf("%d", i - 1);
break;
}
return 0;
}
BZOJ1854 连续攻击游戏 题解的更多相关文章
- BZOJ1854:[SCOI2010]连续攻击游戏——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1854 https://www.luogu.org/problemnew/show/P1640 lxh ...
- p1640&bzoj1854 连续攻击游戏(游戏)
传送门(洛谷) 传送门(bzoj) 题目 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用 ...
- 洛谷P1640 [SCOI2010]连续攻击游戏 题解
题目链接: https://www.luogu.org/problemnew/show/P1640 分析: 这道题用二分图来解决即可.应该可以作为网络流中的模板题来食用, 每一个武器有两个属性,但是只 ...
- bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏)
bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏) 据说正解是并查集???我不会 这不是一道匈♂牙利好题吗??? 一个装备的两个属性都向它连边,然后跑一遍匈♂牙利 注意: ...
- [SCOI2010]连续攻击游戏 匈牙利算法
觉得题目水的离开 不会匈牙利的请离开 不知道二分图的请离开 不屑的大佬请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 扯淡完了,先重温一下题目 [SC ...
- 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
- [Luogu 1640] SCOI2010 连续攻击游戏
[Luogu 1640] SCOI2010 连续攻击游戏 DP太恶心,回来二分图这边放松一下心智. 这个建图真的是难以想到. 因为要递增啊,属性值放x部,装备放y部,对应连边跑Hungary就好了. ...
- 洛谷——P1640 [SCOI2010]连续攻击游戏
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
- SCOI 2010 连续攻击游戏(贪心,图论)
SCOI 2010 连续攻击游戏 solution 直接就硬刚 我愿称贪心为暴力 因为题目中要求一定从小到大贪心,那么当前点的下标有能够选取的较大点,那么它一定可以和前面的一个较小点连接,所以可以直接 ...
随机推荐
- Spring源码之自动装配
我们使用Spring开发过程中经常会用到Autowired注解注入依赖的bean,这部分也是面试的热点问题之一.今天咱们一起来深入研究下自动注入的背后实现原理.首先上一个例子,如下所示: @RestC ...
- 温故知新-多线程-深入刨析synchronized
Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 文章目录 摘要 synchroniz ...
- v-bind 缩写
Vue.js 为两个最为常用的指令提供了特别的缩写: <!-- 完整语法 --> <a v-bind:href="url"></a> <! ...
- 【php】 jsonp转数组函数jsonp_decode
分享一个可以跟json一样用的函数jsonp_decode,能把jsonp格式数据转为php数组或对象. /** * 把jsonp转为php数组 * @param string $jsonp js ...
- 如何在centos7安装dnf软件包
想在自己的笔记本CentOS7上安装dnf玩玩儿,但是根据百度出来的方法没有成功. yum install epel-release -y yum install dnf 现在将解决办法转载过来,如下 ...
- Alink漫谈(七) : 如何划分训练数据集和测试数据集
Alink漫谈(七) : 如何划分训练数据集和测试数据集 目录 Alink漫谈(七) : 如何划分训练数据集和测试数据集 0x00 摘要 0x01 训练数据集和测试数据集 0x02 Alink示例代码 ...
- CocosCreator实现微信排行榜
1. 概述 不管是在现实生活还是当今游戏中,各式各样的排名层出不穷.如果我们做好一款游戏,却没有实现排行榜,一定是不完美的.排行榜不仅是玩家了解自己实力的途径,也是游戏运营刺激用户留存的一种途径.在微 ...
- os:获取当前目录路径,上级目录路径,上上级目录路径
import os '''***获取当前目录***''' print(os.getcwd()) print(os.path.abspath(os.path.dirname(__file__))) '' ...
- 如何用 Python 和 API 收集与分析网络数据?
摘自 https://www.jianshu.com/p/d52020f0c247 本文以一款阿里云市场历史天气查询产品为例,为你逐步介绍如何用 Python 调用 API 收集.分析与可视化数据.希 ...
- OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...