写的 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;
}