题目传送门:https://www.luogu.org/problemnew/show/P2161
题意:
有n个操作。
A操作有两个数x、y,询问x~y时间中与先前预约冲突的预约的个数,并拒绝这些预约;
B操作询问当前有效的预约个数。
思路:
然而不会(太弱~~~)。
怒翻题解:二分+set。
对于A操作:我们从0时间~x时间去二分寻找与当前预约冲突的预约,将其删除,记录一下即可。
对于B操作:直接输出当前set里的个数。
注意:要先按照右端点排序再按照左端点排序(降序),不然没法二分啊。
代码:
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
node(int a=0,int b=0)
{
x=a,y=b;
}
friend bool operator <(node a,node b)
{
return a.y==b.y?a.x<b.x:a.y<b.y;
}
};
set<node> a;
#define address set<node>::iterator
int n;
int main()
{
char s[5];
int x,y;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
if(s[1]=='A')
{
int x,y,tot=0;
scanf("%d %d",&x,&y);
while(1)
{
address t=a.lower_bound(node(0,x));
if(t->x<=y&&t!=a.end()) a.erase(t),tot++; else break;
}
a.insert(node(x,y));
printf("%d\n",tot);
}
else printf("%d\n",a.size());
}
}