Time Complexity
Complexity of multi-dimensional teamsSimilar\ (O (N ^ {\ frac {2k-1} {k }})\)
From zhihu daxie
Parity classification Optimization
return a.l == b.l ? (a.l & 1) ? a.r<b.r: a.r>b.r : a.l < b.l;
This is faster because the pointer does not need to jump back to the left after it is moved to the right, and the next block needs to jump back to the right after it is jumped back to the left. This reduces the number of operations by half and doubles theoretically.
Ideas
After a long time on the subject, we only need to click here.
This topic is also used for non-Conference events with modifications.
I made another step today, so I have a new understanding.
In fact, a timestamp is added to the non-modified pair.
It's okay to move the modification time with the time.
Although the complexity will be higher (so it is very slow to wait for modification)
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>#define FOR(i,a,b) for(int i=a;i<=b;++i)using namespace std;const int maxn=5e4+7;const int maxm=1e6+7;char s;int n,m,A,B,a[maxn],belong[maxn],vis[maxm],ans;struct node { int x,y,id,tim,ans;}Q[maxn];struct modify { int id,v;}C[maxn];bool cmp1(const node &a,const node &b) { return belong[a.x]==belong[b.x] ? (belong[a.y]==belong[b.y] ? a.tim<b.tim : a.y<b.y) : a.x<b.x;}bool cmp2(const node &a,const node &b) { return a.id<b.id;}int read() { int x=0,f=1;char s=getchar(); for(;s<'0'||s>'9';s=getchar()) if(s=='-') f=-1; for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0'; return x*f;}void add(int x) { if(!vis[a[x]]) ++ans; ++vis[a[x]];}void delet(int x) { --vis[a[x]]; if(!vis[a[x]]) --ans;}void work(int x,int i){ if(Q[i].x<=C[x].id && C[x].id<=Q[i].y) { --vis[a[C[x].id]]; ++vis[C[x].v]; if(!vis[a[C[x].id]]) --ans; if(vis[C[x].v]==1) ++ans; } swap(C[x].v,a[C[x].id]);}int main() { n=read(),m=read(); int k=sqrt(n)*7; FOR(i,1,n) a[i]=read(); FOR(i,1,n) belong[i]=(i-1)/k+1; FOR(i,1,m) { scanf("%s",&s); if(s=='Q') { Q[++A].id=A; Q[A].tim=B; Q[A].x=read(); Q[A].y=read(); } else { C[++B].id=read(); C[B].v=read(); } } sort(Q+1,Q+1+A,cmp1); int l=1,r=0,ttt=0; FOR(i,1,A) { while(Q[i].x<l) add(--l); while(Q[i].x>l) delet(l++); while(Q[i].y>r) add(++r); while(Q[i].y<r) delet(r--); while(Q[i].tim>ttt) work(++ttt,i); while(Q[i].tim<ttt) work(ttt--,i); Q[i].ans=ans; } sort(Q+1,Q+1+A,cmp2); FOR(i,1,A) cout<<Q[i].ans<<"\n"; return 0;}
Summary & p1903 [national training team] data color/maintenance queue