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 直接就硬刚 我愿称贪心为暴力 因为题目中要求一定从小到大贪心,那么当前点的下标有能够选取的较大点,那么它一定可以和前面的一个较小点连接,所以可以直接 ...
随机推荐
- MMDVM中继板测试软件MMDVMCal
运行方法: 只支持windows 64位系统 32位下载:https://share.weiyun.com/52uHAO5 64位下载:https://share.weiyun.com/5IgdqvL ...
- Python数据分析软件包介绍
Python数据分析主要软件包: 1.python -m pip install numpy 2.python -m pip install pandas 3.python -m pip instal ...
- 02.vue-router的进阶使用
关键字:路由懒加载,全局导航守卫,组件导航守卫,redirect重定向,keep-alive,params,query 一.目录结构 二.index.js // 配置路由相关的信 ...
- 手把手教你用redis实现一个简单的mq消息队列(java)
众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...
- ubuntu安装qt步骤(源码)
1.安装gcc,g++ sudo apt-get install gcc sudo apt-get install g++ 2.解压源码包 tar xvzf qt-xxxx 3.安装xlib库 sud ...
- 【JUC系列】01、之大话并发
学习方法 学习技术的方法都很类似,大部分都有着类似的步骤: 场景 需求 解决方案 应用 原理 并发的目的 充分利用CPU 和 I/O资源 提高效率 并发的维度 分工 同步/协作 互斥 分工 线程池 f ...
- mysql中的四种常用的引擎
MySQL常用的引擎有:InnoDB存储引擎.MyISAM存储引擎.MEMORY存储引擎.Archive存储引擎 InnoDB存储引擎 InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID) ...
- CentOS8.1安装Docker及Docker-compose
使用 Docker 仓库进行安装 在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库.之后,您可以从仓库安装和更新 Docker. 设置仓库 安装所 ...
- c常用函数-strchr和strrchr
strchr和strrchr strrchr函数用于查找指定字符在一个字符串中最后一次出现的位置,然后返回指向该位置的指针 strchr函数用于查找指定字符在一个字符串中第一次出现的位置,然后返回指向 ...
- control+Z的逆 control+Y
接触过电脑的朋友一定知道control键加Z可以在大多时候撤销我们前一步的操作,相当于计算机系统里最“广谱”的后悔药. 然而,你有没有在编辑文本的时候却因为撤销的操作而后悔?输入文本之后撤销,发现少了 ...