[ABC338E] Chords 题解
思路
思路还是很显然的,简单总结一下思路:
- 首先,将圆环从点 到 切开,并将其拉直成一条直线。
- 在切开状态下,原来的弦变成了直线上的曲线。我们需要判断这些曲线之间是否存在交点。
- 在切开状态下,曲线之间的交点等价于满足 的不同曲线 和 的存在。
- 为了判断曲线之间是否存在交点,我们可以使用栈来管理曲线。首先,准备一个空栈 。
- 遍历直线上的每个点,按顺序执行以下操作:
- 如果当前点是某个曲线的左端点,将该曲线的标识符加入栈 的末尾。
- 如果当前点是某个曲线的右端点,从栈 的末尾移除一个元素。
- 如果移除的元素不是当前曲线的标识符,说明存在交点,返回结果并终止程序。
- 如果程序在遍历结束后没有返回结果,说明曲线之间不存在交点。
这种使用栈的算法能够在 的时间复杂度内判断曲线之间是否存在交点。
代码
#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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步