有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(); }
标签:tes,int,Movie,collection,add,影碟,include,1513 From: https://www.cnblogs.com/towboa/p/17349680.html