好吧,用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; }