circle

★实验任务

最近 silchen又发现了一个关于圆的有趣的问题:在圆上有 2n 个不同的点,按顺序排列,n=2的时候如图:

silchen用 m 条线段把这些点连接了起来(每个点保证只连一条线段),现在他想知道这样的连接这些线段是否相交,如果不相交输出“YES”,相交输出“NO”。

★数据输入

第一行一个整数 T(1<=T<=10),接下来 T 组数据,每组数据如下

第一行一个正整数 n(1<=n<=100000)和 m(1<=m<=n)。

接下来 m 行,每行两个正整数 x 和 y,表示线段的两个端点编号。

1<=x,y<=2*n,保证每个端点只会出现一次

对于 60%的数据:1<=m<=n<=1000

对于 100%的数据:1<=m<=n<=100000

★数据输出

对每组数据输出一行,如果不相交输出“YES”,相交输出“NO”。

这题是括号匹配问题

当两对数的区间为包含或没有交集时为无交点;如(1,2)-(3,4)或(1,4)-(2,3);

有交集时相交;如(1,3)-(2,4);

整体区间为1——2——3——4

#include<iostream>
#include<cstring>
#include<stack>
int a[900000]={0};
using namespace std;
int main()
{
	int i,j;
	int n,m,x,y;
	stack<int> num;
	int t;
	cin>>t;
	for(i=1;i<=t;i++)
	{
		memset(a,0,sizeof(a));//每次都要重置数组
		cin>>n>>m;
		for(j=1;j<=m;j++)
		{
			cin>>x>>y;
			if(x<y)
			{
				a[x]=j;a[y]=-j;
			}
			else
			{
				a[x]=-j;a[y]=j;
			}
		}//设置括号顺序
		
		for(j=1;j<=2*n;j++)
		{
			if(a[j]>0)
			{
				num.push(a[j]);
			}
			else if(a[j]<0)
			{
				if(!num.empty()&&num.top()+a[j]==0)//&&先判定左边的
				{
					num.pop();
				}
				else
				{
					cout<<"NO"<<endl;break;
				}
			}
			
			if(j==2*n)
			{
				cout<<"YES"<<endl;
			}
			
			
		}
		
	}
	return 0;	
}

 

posted @ 2022-09-26 20:37  墨燃云  阅读(401)  评论(0编辑  收藏  举报