有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();
}

 

posted on 2023-04-24 15:29  towboat  阅读(38)  评论(0)    收藏  举报