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;}