这个题要用到树状数组
如果没学过,可以看一下百度百科那张线性图表,还有这个人的博客也不错:http://blog.csdn.net/ljd4305/article/details/10101535
如果会了树状数组那么这个题就很裸了
下面代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctype.h>
#include <vector>
#include <algorithm>
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
// cout << " === " << endl;
using namespace std;
typedef long long ll;
const int maxn = 200000 + 7, INF = 0x7f7f7f7f, mod = 1e9+7;
int T, n, m, v, cur;
int bit[maxn], pos[maxn>>1];
int sum(int x) {
int ans = 0;
while(x > cur) {
ans += bit[x];
x -= (x & -x);
}
return ans;
}
void add(int x, int d) {
while(x <= m+n) {
bit[x] += d;
x += x & -x;
}
}
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d %d", &n, &m);
memset(bit, 0, (n+m+1)*sizeof(bit[0]));
cur = m;
for(int i = 1; i <= n; ++i) {
pos[i] = i+m;
add(pos[i], 1);
}
for(int i = 0; i < m; ++i) {
scanf("%d", &v);
printf("%d", sum(pos[v]-1));
if(i == m-1) puts("");
else putchar(' ');
add(pos[v], -1);
pos[v] = cur--;
add(pos[v], 1);
}
}
return 0;
}