这道题问,存不存在一对不相交的段,举个例子:(1,2)、(2,3)、(3,4)这三个段,(1,2)、(2,3)是相交的,但是(1,2)、(3,4)不是相交的,就找到了一对不相交的段,输出yes. 所以要找有没有不相交的对,就找最小的r和最大的l的位置关系就ok了
这里也是新了解到了一个不错的stl容器multiset这个容器可以自己排序,元素可以重复,并且每次插入删除的时候的时间复杂度是logn级别
下面是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;
}