思路 找到 1—i (i<=n) 重复数的数量 n 减去它就是答案
找重复数的数量 需要用到 主席树 先给代码 后期解释
看这篇文就懂了 哈哈 加油哦
https://blog.youkuaiyun.com/flymoyu/article/details/90261739
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int inf=0x3f3f3f3f;
const int maxn=1e5+5;
const int maxm=2e6+5;
int tot,rt[maxn],ls[maxm],rs[maxm],sum[maxm];
void update(int x,int &y,int l,int r,int p) {
y=++tot;
if (l==r) { sum[y]=sum[x]+1; return; }
int m=(l+r)>>1;
if (p<=m) rs[y]=rs[x],update(ls[x],ls[y],l,m,p);
else ls[y]=ls[x],update(rs[x],rs[y],m+1,r,p);
sum[y]=sum[ls[y]]+sum[rs[y]];
}
int query(int x,int y,int l,int r,int L,int R) {
if (L<=l&&r<=R) return sum[y]-sum[x];
int m=(l+r)>>1,res=0;
if (L<=m) res+=query(ls[x],ls[y],l,m,L,R);
if (m<R) res+=query(rs[x],rs[y],m+1,r,L,R);
return res;
}
int n,x;
int a[maxn],b[maxn];
int main () {
int T;
scanf("%d",&T);
while (T--) {
scanf("%d",&n); tot=0;
for (int i=1;i<=n;i++) a[i]=b[i]=0;
for (int i=1;i<=n;i++) {
scanf("%d",&x);
update(rt[i-1],rt[i],1,n,a[x]);
if (a[x]) b[query(rt[ a[x] ],rt[i-1],1,n,0,a[x])+1]++;
a[x]=i;
}
int sum=0;
for (int i=1;i<=n;i++) {
sum+=b[i];
printf("%d%c",n-sum," \n"[i==n]);
}
}
return 0;
}