传送门:https://www.luogu.org/problemnew/show/P2161
不知道为啥O(n^2logn)竟然莽过了1e5的题...
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
int psum[maxn],sump[maxn];
int n;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<='0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
struct node
{
char str;
int l;
int r;
int id;
}q[maxn];
struct newnode
{
int l;
int r;
int id;
};
vector<newnode> v;
inline void add(int p,int x)
{
for(register int i=p;i<maxn;i+=(i & -i))
{
psum[i] += p*x;
sump[i] += x;
}
}
inline void add_range(int l,int r,int x)
{
add(l,x);
add(r+1,-x);
}
inline int query(int p)
{
int ans = 0;
for(register int i=p;i;i-=(i & -i))
{
ans += (p+1)*sump[i]-psum[i];
}
return ans;
}
inline int query_range(int l,int r)
{
return query(r)-query(l-1);
}
int main()
{
n = read();
int cnt = 0;
for(register int i=1;i<=n;i++)
{
char op;
int x,y;
cin>>op;
if(op=='A')
{
q[i].str = op;
q[i].l = read();
q[i].r = read();
q[i].id = i;
}
else
{
q[i].str = op;
q[i].id = i;
}
}
for(register int i=1;i<=n;i++)
{
if(q[i].str=='A')
{
int ans = 0;
if(query_range(q[i].l,q[i].r)==0)
{
add_range(q[i].l,q[i].r,q[i].id);
v.push_back({q[i].l,q[i].r,q[i].id});
cnt++;
}
else
{
for(register int j=0;j<v.size();j++)
{
int tmpl = v[j].l;
int tmpr = v[j].r;
int tmpid = v[j].id;
if((q[i].l>=tmpl && q[i].l<=tmpr) || (q[i].r>=tmpl && q[i].r<=tmpr) || (q[i].l<=tmpl && q[i].r>=tmpr) || (q[i].l>=tmpl && q[i].r<=tmpr))
{
add_range(tmpl,tmpr,-tmpid);
v.erase(v.begin()+j);
j--;
cnt--;
ans++;
}
}
add_range(q[i].l,q[i].r,q[i].id);
v.push_back({q[i].l,q[i].r,q[i].id});
cnt++;
}
printf("%d\n",ans);
}
else
{
printf("%d\n",cnt);
}
}
return 0;
}