洛谷2161 会场预约 题解

好吧,用stl水过了一道题。

显然,每一次进行修改之前的所有预约一定是没有互相覆盖的。

我们用set保留所有的预约,这样在询问时只要输出set的size就行了

对于每次的新预约,我们就先找到右端点大于该区间左端端点的区间,然后一个一个删除矛盾的预约就行了

复杂度大概为O(n(logn)^2)

(BZOJ上这道题居然要权限,太恶心了。)

# include<set>
# include<cstdio>
# include<algorithm>
# include<iostream>
using namespace std;
struct xianduan{
    int l,r;
    bool operator <(const xianduan&rhs)const{
        if(r!=rhs.r)return r<rhs.r;
        return l<rhs.l;
    }
};
set<xianduan>s;
int n;
char c;
int main(){
     ios::sync_with_stdio(false);
     cin>>n;
     set<xianduan>::iterator it;
     while(n--){
        cin>>c;
        if(c=='A'){
            int l,r,ans=0;
            cin>>l>>r;
            it=s.lower_bound((xianduan){0,l});
            while(it!=s.end() && r>=it->l){
                ++ans;
                s.erase(it);
                it=s.lower_bound((xianduan){0,l});
            }
            cout<<ans<<endl;
            s.insert((xianduan){l,r});
        }else cout<<s.size()<<endl;
    }
    return 0;
}

 

posted @ 2018-04-05 13:34  logeadd  阅读(186)  评论(0编辑  收藏  举报