关于空间
查看原帖
关于空间
723198
AAA404楼主2024/11/21 23:02

写的 cdq 分治,空间飞到 100MB+,本来准备去写镜中的昆虫然后发现自己空间好像爆炸了。

代码在下面,求帮我看看到底是什么空间这么大。

#include<bits/stdc++.h>
#define itn int
#define tin int
#define nit int
#define tni int
#define nti int
#define scnaf scanf
#define ptrinf printf
#define icn cin
#define cni cin
#define inc cin
#define nci cin
#define nic cin
#define cuot cout
#define ocut cout
#define fro for
using namespace std;
const int N=4e5+5,M=1e6+5;
int n,m,a[N],las[M],pre[N],ans[N],c[N],cnt,qcnt,Qcnt;
set<int>s[M];
#define lowbit(x) (x&-x)
void update(int x,int a){for(;x<=n;x+=lowbit(x))c[x]+=a;}
int query(int x){int ans=0;for(;x;x-=lowbit(x))ans+=c[x];return ans;}
void del(int x){for(;x<=n;x+=lowbit(x))c[x]=0;}
struct Que{
	int op,i,pre,val;
}q[N];
pair<int,int>Q[N];
bool cmp(Que a,Que b)
{
	return a.i<b.i;
}
void cdq(int l,int r)
{
	if(l==r)return;
	int mid=l+r>>1;
	cdq(l,mid);
	cdq(mid+1,r);
	int i=l,j=mid+1;
	sort(q+l,q+mid+1,cmp);
	sort(q+mid+1,q+r+1,cmp);
	for(;j<=r;j++)
	{
		if(q[j].op==1)continue;
		for(;q[i].i<=q[j].i&&i<=mid;i++)
		{
			if(q[i].op==2)continue;
			update(q[i].pre+1,q[i].val);
		}
		ans[q[j].val]+=query(q[j].pre+1);
	}
	for(int i=l;i<=mid;i++)del(q[i].pre+1);
	return;
}
int main()
{
	clock_t c1=clock();
#ifdef LOCAL
 	freopen("1.in","r",stdin);
 	freopen("1.out","w",stdout);
#endif
    ios::sync_with_stdio(0);
 	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=1e6;i++)s[i].insert(0);
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		pre[i]=las[a[i]];
		las[a[i]]=i;
		q[++cnt]={1,i,pre[i],1};
		s[a[i]].insert(i);
	}
	for(int i=1;i<=m;i++)
	{
		char op;
		cin>>op;
		if(op=='Q')
		{
			int l,r;
			cin>>l>>r;
			if(l>r)swap(l,r);
			Q[++Qcnt]={qcnt+1,qcnt+2};
			q[++cnt]={2,l-1,l-1,++qcnt};
			q[++cnt]={2,r,l-1,++qcnt};
		}
		else
		{
			int p,c;
			cin>>p>>c;
			auto it=s[a[p]].lower_bound(p);
			it--;
			int tmp=*it;
			it++;it++;
			if(it!=s[a[p]].end())
			{
			    if(tmp!=pre[*it])
			    {
			           q[++cnt]={1,*it,pre[*it],-1};
			    	pre[*it]=tmp;
			    	q[++cnt]={1,*it,pre[*it],1};
			    }
			}
			it--;
			s[a[p]].erase(it);
			a[p]=c;
			s[c].insert(p);
			it=s[c].lower_bound(p);
			it--;
			if(pre[p]!=*it)
			{
			    q[++cnt]={1,p,pre[p],-1};
		    	pre[p]=*it;
		    	q[++cnt]={1,p,pre[p],1};
			}
			it++;it++;
			if(it!=s[c].end())
			{
			    if(pre[*it]!=p)
			    {
			        q[++cnt]={1,*it,pre[*it],-1};
			    	pre[*it]=p;
			    	q[++cnt]={1,*it,pre[*it],1};
			    }
			}
		}
	}
	cdq(1,cnt);
	for(int i=1;i<=Qcnt;i++)
	cout<<ans[Q[i].second]-ans[Q[i].first]<<endl;
#ifdef LOCAL
	cerr<<"Time used:"<<clock()-c1<<"ms";
#endif
 	return 0;
}
2024/11/21 23:02
加载中...