zoukankan      html  css  js  c++  java
  • bzoj1854 [Scoi2010]游戏

    [Scoi2010]游戏

    Time Limit: 5 Sec Memory Limit: 162 MB

    Description

    lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。 游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。 现在lxhgww想知道他最多能连续攻击boss多少次?

    Input

    输入的第一行是一个整数N,表示lxhgww拥有N种装备 接下来N行,是对这N种装备的描述,每行2个数字,表示第i种装备的2个属性值

    Output

    输出一行,包括1个数字,表示lxhgww最多能连续攻击的次数。

    Sample Input

    3
    1 2
    3 2
    4 5

    Sample Output

    2

    HINT

    【数据范围】

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

    这tm又是并查集!!!! Orz!!! Orz!!! Orz!!! Orz!!! Orz!!!
    太强了!!!! 真的好妙妙的~
    我们可以先yy一下,如果有两组数,他们都有一个相同的数字另一个不相同,那么就是任意三选二,对吗?
    如果有三组数,他们都有一个相同的数,另一个数完全不同,那么也是任意四选三,对吗?
    如果有三组数,他们如果是轮换型的((1,2)(2,3)(3,1))显然全选
    如果有三组数,他们不成环状,但是他们任意两组有且仅有一个相同的数,那么他们也是任意四选三,对吗?

    好,我们来看看是不是发现了什么。。。。
    有相同的数可以看成他们是联通的,那么如果我们把每组数的两个数连个边,那么就会有很多个连通图。
    我们分两种情况:
    Case1:如果是个环,或者说含一个环,那么所有的都可以取,对吗?
    Case2:如果是个有n个点树,那么你可以选n-1个点,但是由于题目这个性质,也就是说你要先选小的再选大的。所以,一定是最大的那个不选到。

    所以我们用并查集来维护上述操作。

    最后一个问题,考虑怎么合并两个连通图。
    如果两个图都是树,那么等于你可以多取一个点,显然,你取较小的数那个点。
    如果有一个图本来就是有环的,那么直接选那个没选的,就好了。

    有点并查集启发式合并的意思~

    
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6 + 5;
    int fa[maxn];
    bool vis[maxn];
    int n, a, b, A, B;
    
    int find(int t) { return fa[t] == t ? t : (fa[t] = find(fa[t])); }
    
    inline void connect(int aaa, int bbb)
    {
    	if(aaa < bbb) swap(aaa, bbb); fa[bbb] = aaa;
    	if(vis[bbb]) {vis[aaa] = true; return;}
    	vis[bbb] = true;
    }
    
    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", &a, &b);
    		A = find(a); B = find(b); 
    		if(A == B) vis[A] = 1;
    		else connect(A, B);
    	}
    	for(int i = 1; i <= n + 1; ++i) if(!vis[i]) {printf("%d", i - 1); break;}
    	return 0;
    }
    
    
    心如花木,向阳而生。
  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/LLppdd/p/8674848.html
Copyright © 2011-2022 走看看