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 }

 

posted @ 2021-07-09 21:57  lyc_lb  阅读(64)  评论(0)    收藏  举报
-->
查看放大的地图   |   获取路线