[ABC338E] Chords 题解

思路

思路还是很显然的,简单总结一下思路:

  1. 首先,将圆环从点 12N 切开,并将其拉直成一条直线。
  2. 在切开状态下,原来的弦变成了直线上的曲线。我们需要判断这些曲线之间是否存在交点。
  3. 在切开状态下,曲线之间的交点等价于满足 Ai<Aj<Bi<Bj 的不同曲线 ij 的存在。
  4. 为了判断曲线之间是否存在交点,我们可以使用栈来管理曲线。首先,准备一个空栈 S
  5. 遍历直线上的每个点,按顺序执行以下操作:
    • 如果当前点是某个曲线的左端点,将该曲线的标识符加入栈 S 的末尾。
    • 如果当前点是某个曲线的右端点,从栈 S 的末尾移除一个元素。
    • 如果移除的元素不是当前曲线的标识符,说明存在交点,返回结果并终止程序。
  6. 如果程序在遍历结束后没有返回结果,说明曲线之间不存在交点。

这种使用栈的算法能够在 O(N) 的时间复杂度内判断曲线之间是否存在交点。

代码

#include<bits/stdc++.h>
using namespace std;
pair<int,int> s[400010];
int stk[400010];
signed main() {
int n;
cin>>n;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
if(a>b) swap(a,b);
s[a-1]={0,i};
s[b-1]={1,i};
}
int p=0;
for(int i=0;i<2*n;i++) {
int t=s[i].first, num=s[i].second;
if(t==0) stk[++p]=num;
else {
if(stk[p]!=num) {
cout<<"Yes";
return 0;
}
p--;
}
}
cout<<"No";
return 0;
}

本文作者:merlinkkk

本文链接:https://www.cnblogs.com/merlinkkk/p/18306134

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   merlinkkk  阅读(24)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开