[SCOI2010]连续攻击游戏

题目描述
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

说明/提示
Limitation

对于30%的数据,保证N < =1000

对于100%的数据,保证N < =1000000


这道题一般有两种解法(二分图,并查集),本博客采用二分图来写,效率挺高的。

为什么可以用二分图呢?或者说怎么用二分图写。

物品具有两个属性,相当于对于一个物品的两个属性,最多被使用一次,那我们怎么限制这种条件呢?

首先我们一般会想到拆点(二分图常用技巧),但是这道题拆点也不能限制,于是我们不难想到对于每个物品,我们新加一个点,然后把属性的两个点与之相连,这样跑二分图匹配时,每个属性点就只会被匹配一次了。

这道题还要求是连续的攻击,怎么解决呢?我们可以每次用属性点去求与之对应的匹配,如(1, 2,3, 4)依次去找增广路径,只要有一个不能找到了,我们就退出循环。(采用匈牙利的性质,故此题不能跑最大流)

每次都清空vis太慢了,所以我们采用时间戳 id 来解决。

AC代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,M=10010;
int n,res,mat[N<<1],vis[N<<1];
int head[N<<1],nex[N<<2],to[N<<2],tot;
void add(int a,int b){
	to[++tot]=b; nex[tot]=head[a]; head[a]=tot;
}
bool find(int x,int id){
	for(register int i=head[x];i;i=nex[i]){
		if(vis[to[i]]!=id){
			vis[to[i]]=id;//时间戳id
			if(!mat[to[i]]||find(mat[to[i]],id)){
				mat[to[i]]=x;	return 1;
			}
		}
	}
	return 0;
}
signed main(){
	scanf("%lld",&n);
	for(register int i=1;i<=n;i++){
		int a,b;	scanf("%lld %lld",&a,&b);	add(a,i+M);	add(b,i+M);
	}
	for(register int i=1;i<=10000;i++){
		if(find(i,i))	res++;
		else	break;
	}
	printf("%lld\n",res);
	return 0;
}
全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务