有n个影碟,标号为1~n,位置为0~n-1,每次取出一个影碟看完后,将其放在最前面(标号为0处),问每个影碟取出前,其位置之前有多少个影碟
开2倍数组, "i放置前面" 这个操作
add(i,-1) ,add(newi,1)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5;
int n ,p[N*2+5] ;
vector<int> ans;
int c[N*2+5];
int lowbit(int x){
return x&-x;
}
int qsum(int x){
int t=0;
for(;x;x-=lowbit(x)) t+=c[x];
return t;
}
void add_(int x,int v){
for(;x<=N*2;x+=lowbit(x)) c[x]+=v;
}
void sov(){
ans.clear();memset(c,0,sizeof c); memset(p,0,sizeof p);
int tes;cin>>n>>tes;
for(int i=1;i<=n;i++) p[i]=N+i,add_(p[i],1);
int pos=N;
while(tes--){
int x;cin>>x;
ans.push_back(qsum(p[x]));
add_(p[x],-1);
p[x]=pos--;
add_(p[x],1);
}
for(int i=0;i<ans.size();i++){
if(i>0) cout<<' ';cout<<ans[i]-1;
}
cout<<endl;
}
signed main () {
int tes; cin>>tes;
while (tes--)
sov();
}
浙公网安备 33010602011771号