P1640 [SCOI2010]连续攻击游戏
[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 最多能连续攻击的次数。
输入输出样例
输入样例 #1
3
1 2
3 2
4 5
输出样例 #1
2
说明
对于 $30\%$ 的数据,保证 $N \le 10^3$。 对于 $100\%$ 的数据,保证 $N \le 10^6$。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 const int N = 2 * 1e6 + 10; 7 8 int e[N], w[N], ne[N], h[N] , idx; 9 int n; 10 int vis[N]; 11 int match[N]; 12 void add(int a,int b) 13 { 14 e[idx] = b; ne[idx] = h[a]; h[a] = idx++; 15 } 16 int now; 17 18 bool dfs(int x) 19 { 20 for(int i = h[x]; ~i ; i = ne[i]) 21 { 22 int j = e[i]; 23 if(vis[j] != now) 24 { 25 vis[j] = now; 26 if(match[j] == 0 || dfs(match[j])) 27 { 28 match[j] = x; 29 return 1; 30 } 31 } 32 } 33 return 0; 34 } 35 36 int main() 37 { 38 scanf("%d",&n); 39 memset(h, -1, sizeof h); 40 for(int i = 1; i <= n; i++) 41 { 42 int a, b; 43 scanf("%d %d",&a,&b); 44 add(a, i); add(b, i); 45 } 46 int res = 0; 47 for(int i = 1; i <= n; i++) 48 { 49 now++; 50 if(!dfs(i)) 51 { 52 printf("%d", i - 1); 53 return 0; 54 } 55 } 56 printf("%d",n); 57 return 0; 58 }

浙公网安备 33010602011771号