[SHOI2009]会场预约,洛谷之提高历练地,线段树树状数组基础

xiaoxiao2021-02-28  36

正题

       第四题:[SHOI2009]会场预约

      这题要做的操作就是,每次加入一个区间,删除与之有交的区间,输出个数。另外一个操作就是,输出当前的区间。

      我们可以用set来完成这个操作,找出右节点比当前区间左节点大(或等于)的区间,如果找出来的区间的左节点比当前区间的右节点还要小的话,那么就删除这个区间。

代码<教教你怎么用set>

#include<cstdio> #include<cstdlib> #include<cstring> #include<set> using namespace std; int n; struct interval{ int l,r; bool operator<(const interval y)const{//定义排序顺序 return r<y.r; } }; set<interval> s;//声明一个类型为interval的set set<interval> ::iterator it;//声明一个指向interval类型的set指针 int tot=0,ans=0; int main(){ scanf("%d",&n); int x,y; for(int i=1;i<=n;i++){ char c[2]; scanf("%s",c); if(c[0]=='A'){ tot=0; scanf("%d %d",&x,&y); while(1){ it=s.lower_bound((interval){0,x});//求比 (0,x)数对 大 的区间 , 让it指向这个interval。 if(it!=s.end() && it->l<=y) s.erase(it),tot++,ans--; else break;//erase是删除 } s.insert((interval){x,y}); ans++; printf("%d\n",tot); } else printf("%d\n",ans); } }

      

转载请注明原文地址: https://www.6miu.com/read-1700021.html

最新回复(0)