ABC338E Chords

题意

在一个圆上有 n n n 条线段,若有交点,输出 Y e s Yes Yes,否则输出 N o No No

思路

我们可以使用。将每条线段的起点和终点标记为相同的标记。


p i p_i pi 代表第 i i i 个点的编号。

线段 1 1 1 的端点为 1 1 1 5 5 5 ,将 p 1 p_1 p1 p 5 p_5 p5 标记为 1 1 1

线段 2 2 2 的端点为 2 2 2 4 4 4,将 p 2 p_2 p2 p 4 p_4 p4 标记为 2 2 2

以此类推。


先在栈中投入一个数字,避免一开始栈是空的,我们可以往里面放一个负数,如 − 114 -114 114
如果要进的数字等于栈首并且栈不是空的,我们把栈首弹出,否则将数字压进栈里。

最后,如果栈最后剩下一个(就是一开始我们放进那一个 − 114 -114 114)那么没有交点,输出 N o No No,否则输出 Y e s Yes Yes

那么,为什么最后只剩下一个就是没有交点呢?

我们可以想到,如果两条线段交叉,那么他们的端点必然是交替出现的。

没有交叉出现没有交替出现。

交替出现。

重点来了!!!

我们把端点依次放入栈中,如果端点编号与栈首相同,那么就出栈否则就入栈。若栈空,那么就说明端点没有交替出现,线段没有交点。(可以自己根据图一和图二模拟一下,得到的结果就是上述的)


图二模拟

2
1
2
1

在题目中是这样

2
1
2
1
-114

图一模拟


代码

#include<iostream>
#include<stack>
using namespace std;
#define int long long
const int N=2e5+3;
struct id{
    int x,y;
}a[2*N];
stack<int> st;
int p[2*N];//p数组存编号

signed main(){
    int n;
    cin>>n;
    int X,Y;
    for(int i=1;i<=n;i++){
        cin>>a[i].x>>a[i].y;
        if(a[i].x>a[i].y) swap(a[i].x,a[i].y);//此句可以不加
    }
    for(int i=1;i<=n;i++){
        p[a[i].x]=p[a[i].y]=i;
    }
    st.push(-114);
    for(int i=1;i<=2*n;i++){
        int d=p[i];
        if(d==st.top()&&!st.empty( )){
            st.pop();
        }
        else{
            st.push(d);
        }
    }
    //cout<<st.size()<<endl;
    if(st.size( )==1) cout<<"No";
    else cout<<"Yes";
    return 0;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值