1. 程式人生 > >樹狀陣列【洛谷P2161】

樹狀陣列【洛谷P2161】

傳送門: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;
}