Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
98571 xujindong Karry5307 C++ 运行超时 60 1000 MS 11816 KB 3223 2023-08-16 11:15:37

Tests(13/14):


#include<bits/stdc++.h> using namespace std; int n,m,bn,id,a[100005],opt[100005],x[100005],y[100005],k[100005],cnt1,cnt2,cnt[200005],ans[100005],now; bool vis[200005]; map<int,int>p; template<typename T>struct node{ int l,r; mutable T v; bool operator<(node a)const{ return l<a.l; } }; template<typename T>struct chtholly_tree{ set<node<T>>tr; void build(int n,T a[]){ for(int i=1;i<=n;i++)tr.insert(node<T>{i,i,a[i]}); } typename set<node<T>>::iterator split(int pos){ typename set<node<T>>::iterator it=tr.lower_bound(node<T>{pos,0,0}); if(it!=tr.end()&&(*it).l==pos)return it; it--; if((*it).r<pos)return tr.end(); int l=(*it).l,r=(*it).r; T v=(*it).v; return tr.erase(it),tr.insert(node<T>{l,pos-1,v}),tr.insert(node<T>{pos,r,v}).first; } void assign(int l,int r,T x){ typename set<node<T>>::iterator itr=split(r+1),itl=split(l); tr.erase(itl,itr),tr.insert(node<T>{l,r,x}); } int query(int l,int r,int ans=0){ typename set<node<T>>::iterator itr=split(r+1),itl=split(l); for(typename set<node<T>>::iterator it=itl;it!=itr;it++)if(!vis[(*it).v])ans++,vis[(*it).v]=1; for(typename set<node<T>>::iterator it=itl;it!=itr;it++)vis[(*it).v]=0; return ans; } }; chtholly_tree<int>t; struct query{ int l,r,x,id; }q[100005]; bool cmp(query a,query b){ return a.l/bn==b.l/bn?(a.r/bn==b.r/bn?a.x/bn<b.x/bn:a.r/bn<b.r/bn):a.l/bn<b.l/bn; } struct modify{ int p,c; }c[133338]; bool check(){ for(int i=1;i<=m;i++)if(k[i]&&x[i]!=y[i])return 0; return 1; } void add(int x){ now+=!cnt[x],cnt[x]++; } void del(int x){ cnt[x]--,now-=!cnt[x]; } int main(){ cin>>n>>m,bn=pow(n,0.66); for(int i=1;i<=n;i++){ cin>>a[i]; if(!p[a[i]])p[a[i]]=++id; a[i]=p[a[i]]; } for(int i=1;i<=m;i++){ cin>>opt[i]>>x[i]>>y[i]; if(opt[i]==1){ cin>>k[i]; if(!p[k[i]])p[k[i]]=++id; k[i]=p[k[i]]; } } if(n<=5000&&m<=5000){ for(int i=1;i<=m;i++){ if(opt[i]==1)for(int j=x[i];j<=y[i];j++)a[j]=k[i]; else{ int ans=0; for(int j=x[i];j<=y[i];j++)if(!vis[a[j]])ans++,vis[a[j]]=1; cout<<ans<<'\n'; for(int j=x[i];j<=y[i];j++)vis[a[j]]=0; } } } else if(check()){ for(int i=1;i<=m;i++){ if(opt[i]==1)c[++cnt2].p=x[i],c[cnt2].c=k[i]; else q[++cnt1].l=x[i],q[cnt1].r=y[i],q[cnt1].x=cnt2,q[cnt1].id=cnt1; } sort(q+1,q+cnt1+1,cmp); for(int i=1,l=1,r=0,x=0;i<=cnt1;i++){ while(l>q[i].l)add(a[--l]); while(r<q[i].r)add(a[++r]); while(l<q[i].l)del(a[l++]); while(r>q[i].r)del(a[r--]); while(x<q[i].x){ x++; if(l<=c[x].p&&c[x].p<=r)del(a[c[x].p]),add(c[x].c); swap(a[c[x].p],c[x].c); } while(x>q[i].x){ if(l<=c[x].p&&c[x].p<=r)del(a[c[x].p]),add(c[x].c); swap(a[c[x].p],c[x].c),x--; } ans[q[i].id]=now; } for(int i=1;i<=cnt1;i++)cout<<ans[i]<<'\n'; } else{ t.build(n,a); for(int i=1;i<=m;i++){ if(opt[i]==1)t.assign(x[i],y[i],k[i]); else cout<<t.query(x[i],y[i])<<'\n'; } } return 0; }


测评信息: