BIT套BIT求助
查看原帖
BIT套BIT求助
241540
master509楼主2021/5/18 18:54

TLE,91ptsTLE,91pts

似乎是代码常数太大.

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+2;
int n,m;
char s[6];
set<int>q;
set<int>::iterator it;
struct bit
{
	unordered_map<int,int>f;
	void add(int x,int y)
	{
		while(x<=n)
		{
			f[x]+=y;
			x+=x&-x;
		}
	}
	int qry(int x)
	{
		int res=0;
		while(x)
		{
			res+=f[x];
			x^=x&-x;
		}
		return res;
	}
}c[N];
int main()
{
//	freopen("lamp.in","r",stdin);
//	freopen("lamp.out","w",stdout);
	q.insert(0);
	scanf("%d%d",&n,&m);
	for(int i=1,x;i<=n;++i)
	{
		scanf("%1d",&x);
		if(!x)q.insert(i);
	}
	q.insert(++n);
	for(int i=1,x,y;i<=m;++i)
	{
		scanf("%s",s);
		if(*s=='t')
		{
			scanf("%d",&x);
			it=q.lower_bound(x);
			int l,r,v;
			if(*it!=x)r=*it,l=*(--it),v=i,q.insert(x);
			else l=*(--it),++it,r=*(++it),v=-i,q.erase(x);
			for(int j=l+1;j<=n;j+=j&-j)
				c[j].add(x+1,v),c[j].add(r+1,-v);
			for(int j=x+1;j<=n;j+=j&-j)
				c[j].add(x+1,-v),c[j].add(r+1,v);
		}
		else
		{
			scanf("%d%d",&x,&y);
			it=q.lower_bound(x);
			int ans=(*it>=y)?i:0;
			while(x)
			{
				ans+=c[x].qry(y);
				x^=x&-x;
			}
			printf("%d\n",ans);
		}
	}
}

2021/5/18 18:54
加载中...