UVA
来源:互联网 发布:淘宝注册账号申请在线 编辑:程序博客网 时间:2024/06/08 06:41
这个题要用到树状数组
如果没学过,可以看一下百度百科那张线性图表,还有这个人的博客也不错: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;}