标签:span 必须 name wap swap ace 递增 def 描述
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
来源:SCOI 2010
并查集
挺考验思维的一道题的
并查集可以将有联系的点更好的关联起来,我们这个地方是要求与1相连接的点的最大连续的个数。与他先连的点一定与他在一个并查集里。接下来我们只需要把能够连起来的点用数组存一下然后后面再进行查询就好了
我们给出的n为边数,有n条边可以将n+1个点连接起来
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 3100000 using namespace std; bool vis[N]; int n,x,y,fx,fy,fa[N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();} return x*f; } int find(int x) { if(fa[x]==x) return x; fa[x]=find(fa[x]); return fa[x]; } int main() { n=read(); for(int i=1;i<=n+1;i++) fa[i]=i; for(int i=1;i<=n;i++) { x=read(),y=read(); fx=find(x),fy=find(y); if(fx==fy) vis[fx]=true; else { if(fx>fy) swap(fx,fy); fa[fx]=fy; vis[fx]=true; } } for(int i=1;i<=n+1;i++) if(!vis[i]) { printf("%d",i-1); return 0; } }
标签:span 必须 name wap swap ace 递增 def 描述
原文地址:http://www.cnblogs.com/z360/p/7468990.html