题目

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 连续攻击游戏 题解的更多相关文章

  1. BZOJ1854:[SCOI2010]连续攻击游戏——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1854 https://www.luogu.org/problemnew/show/P1640 lxh ...

  2. p1640&bzoj1854 连续攻击游戏(游戏)

    传送门(洛谷) 传送门(bzoj) 题目 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用 ...

  3. 洛谷P1640 [SCOI2010]连续攻击游戏 题解

    题目链接: https://www.luogu.org/problemnew/show/P1640 分析: 这道题用二分图来解决即可.应该可以作为网络流中的模板题来食用, 每一个武器有两个属性,但是只 ...

  4. bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏)

    bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏) 据说正解是并查集???我不会 这不是一道匈♂牙利好题吗??? 一个装备的两个属性都向它连边,然后跑一遍匈♂牙利 注意: ...

  5. [SCOI2010]连续攻击游戏 匈牙利算法

    觉得题目水的离开 不会匈牙利的请离开 不知道二分图的请离开 不屑的大佬请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 扯淡完了,先重温一下题目 [SC ...

  6. 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告

    P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...

  7. [Luogu 1640] SCOI2010 连续攻击游戏

    [Luogu 1640] SCOI2010 连续攻击游戏 DP太恶心,回来二分图这边放松一下心智. 这个建图真的是难以想到. 因为要递增啊,属性值放x部,装备放y部,对应连边跑Hungary就好了. ...

  8. 洛谷——P1640 [SCOI2010]连续攻击游戏

    P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...

  9. SCOI 2010 连续攻击游戏(贪心,图论)

    SCOI 2010 连续攻击游戏 solution 直接就硬刚 我愿称贪心为暴力 因为题目中要求一定从小到大贪心,那么当前点的下标有能够选取的较大点,那么它一定可以和前面的一个较小点连接,所以可以直接 ...

随机推荐

  1. Spring zuul 快速入门实践 --看zuul如何进行服务转发

    zuul 作为springCloud 的全家桶组件之一,有着不可或缺的分量.它作为一个普通java API网关,自有网关的好处: 避免将内部信息暴露给外部: 统一服务端应用入口: 为微服务添加额外的安 ...

  2. tensorflow2.0学习笔记第一章第四节

    1.4神经网络实现鸢尾花分类 import tensorflow as tf from sklearn import datasets import pandas as pd import numpy ...

  3. 7. redux

    1.所有的状态统一放在state中,由store来管理state 2.用户触发一个action行为,由dispatch分发action行为 3.通过store把原有的state的状态值和dispatc ...

  4. 4.vue class 绑定- model基础应用

        //代码可以复制自行体验   <template>     <div id="app" @click.stop="test('你点击了我big- ...

  5. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...

  6. IDEA环境Spring Boot 2.3整合Activiti 6.0,启动项目初始化表并创建核心服务

    如下步骤照着抄就完事了. 一.新建一个spring boot项目,并引入相关依赖 <?xml version="1.0" encoding="UTF-8" ...

  7. String 类中常用方法

    序号 方法定义 类型 描述 1 public String(char[] value) 构造 直接将一个字符数组变为一个字符串 2 public String(char[] value,int off ...

  8. 2019-02-09 python爬取mooc视频项目初级简单版

    今天花了一下午时间来做这东西,之前没有自己写过代码,50几行的代码还是查了很多东西啊,果然学起来和自己动起手来完全是两码事. 方案:requests库+正则表达式提取视频下载链接+urlretriev ...

  9. 2019-02-02 Python学习之死锁和Rlock

    死锁:"当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞" e.g. import threading import time mutexboy ...

  10. mysql HAVING用法

    原文链接:https://www.cnblogs.com/mr-wuxiansheng/p/11188733.html having字句可以让我们筛选分组之后的各种数据,where字句在聚合前先筛选记 ...