汪汪汪
Posted scott527407973
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汪汪汪相关的知识,希望对你有一定的参考价值。
目录
1.汪汪汪
Description
? 给n个区间[l, r],判断是否存在区间交叉。即是否存在1 <= i < j <= n,使得li < lj < ri < rj。
Input
? 多组数据
? 组数据第一行一个整数n,第二行到第n + 1行每行两个数分别代表该区间的左右端点。
Output
? 如果存在交叉,输出“YES”;否则输出“NO”
思路
? 寻找每个线段的父类,然后再遍历比较
代码
#include <iostream>
#include <cstdio>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100005;
const int inf = 0x7fffffff;
struct node
{
int l,r;
} a[maxn];
int cmp(node A,node B)
{
if(A.l==B.l) return A.r>B.r;
return A.l<B.l;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int flag = 0;
for(int i=1; i<=n; i++) scanf("%d %d",&a[i].l,&a[i].r);
sort(a+1,a+n+1,cmp);
int s[maxn]= {0};
int fa[maxn]={0};
int top=0;
for(int i=1; i<=n; i++)
{
while(top&&a[s[top]].r<=a[i].l) top--;
fa[i]=s[top];
s[++top]=i;
}
a[0].r = inf;
for(int i=2;i<=n;i++)
{
if(a[i].r>a[fa[i]].r)
{
flag = 1;
break;
}
}
if(flag) printf("YES
");
else printf("NO
");
}
return 0;
}
以上是关于汪汪汪的主要内容,如果未能解决你的问题,请参考以下文章