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;
}