这道题问,存不存在一对不相交的段,举个例子:(1,2)、(2,3)、(3,4)这三个段,(1,2)、(2,3)是相交的,但是(1,2)、(3,4)不是相交的,就找到了一对不相交的段,输出yes. 所以要找有没有不相交的对,就找最小的r和最大的l的位置关系就ok了

这里也是新了解到了一个不错的stl容器multiset这个容器可以自己排序,元素可以重复,并且每次插入删除的时候的时间复杂度是logn级别

multiset学习链接

下面是ac代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e5+5;
multiset<ll> l,r;
int main(){
    int q;
    cin>>q;
    for(int i=1;i<=q;i++){
        char k; ll ls,rs;
        cin>>k>>ls>>rs;
        if(k=='+'){
            l.insert(ls); r.insert(rs);
        }
        else{
            l.erase(l.find(ls)); r.erase(r.find(rs));
        }
        if(l.size()&&*r.begin()<*l.rbegin()){
            cout<<"YES"<<endl;
        }
        else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

附上一个第四个点超时的代码把,不过我觉得用二分查找的话大概也不会超时,主要是体会一下multiset有多好用

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e5+5;
struct node{
    ll l,r;
    node (int a,int b){
        l=a; r=b;
    }
    node(){}
    bool operator<(const node &a)const{
        return l<a.l;
    }
};
vector<node> v;
int main(){
    int q;
    cin>>q;
    for(int i=1;i<=q;i++){
        char k; cin>>k;
        if(k=='+'){
            ll l,r; cin>>l>>r;
            v.push_back(node(l,r));
            sort(v.begin(),v.end());
        }
        else{
            ll l,r; cin>>l>>r;
            for(vector<node>::iterator i=v.begin();i!=v.end();i++){
            	node tmp=*i;
                if(tmp.l==l&&tmp.r==r){
                    v.erase(i);
                    break;
                }
            }
        }
        ll minnr=1e18;
        for(int i=0;i<v.size();i++){
        	minnr=min(minnr,v[i].r);
		} 
        int f=0;
        for(int i=0;i<v.size();i++){
        	if(v[i].l>minnr){
        		cout<<"YES"<<endl;
        		f=1;
        		break;
			}
        }
        if(!f) cout<<"NO"<<endl; 
    }
    return 0;
}