Description
有n对夫妻围成一个圈站,他们每个人被连续的编号为1至2n。丈夫和妻子不一定站在一起。现在,对于一对夫妻,如果他们两人中间没有隔任何其他人(站在一起),那么,他们将牵手离开。直到所有人都离开或者留下的人不能成功牵手,游戏结束。
现在请问:是否所有的夫妻都能成功牵手走出这个圆圈呢?
Input
输入包含多组测试数据。每组测试数据中,第一行为一个整数n(1<=n<=100000),表示有n对夫妻。之后的n行中,每行包含两个整数a和b,表示a与b是一对夫妻,他们初始时站的位置为a和b。
n=0表示程序终止输入。
Output
如果所有的夫妻都能成功牵手离开,输出“Yes”,否则,输出“No”。
Sample Input
4
1 4
2 3
5 6
7 8
2
1 3
2 4
0
Sample Output
Yes
No
HINT
用栈做将非常容易。
AC代码:
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int a[200002];
stack<int>b;
int main()
{
int n,i,p,q;
while(~scanf("%d",&n))
{
if(n==0)
break;
for(i=1;i<=n;i++)
{
scanf("%d%d",&p,&q);
a[p]=i;
a[q]=-i;//表示如果两者加起来是0的话就是匹配的
}
b.push(a[1]);//先读入第一个数
for(i=2;i<=2*n;i++)
{
if(b.empty()!=0)//如果栈b已经是空的了那就继续填入
{
b.push(a[i]);
}
else//不是空的,我们就判断栈顶元素和这个时候输入的数匹不匹配
{
if(b.top()+a[i]==0)
b.pop();//弹出栈顶元素
else
b.push(a[i]);
}
}
if(b.empty()!=0)//如果最后栈是空的那就全部匹配成功
printf("Yes\n");
else
printf("No\n");
}
return 0;
}