1. 程式人生 > >uva 1513(樹狀數組)

uva 1513(樹狀數組)

con int class string 數量 既然 樹狀數組 += clas

既然不能把樹狀數組的開頭當作頂端,就把樹狀數組的結尾當作頂端,不斷清空要拿走的片子,並更新結尾

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100000+100;
int ss[maxn*2],pos[maxn];
int t,m,n;
void add(int x,int v)
{
    for(int i=x;i<=maxn*2;i+=i&-i)
        ss[i]
+=v; } int sum(int x) { int sum=0; for(int i=x;i>0;i-=i&-i) sum+=ss[i]; return sum; } int main() { scanf("%d",&t); while(t--) { memset(ss,0,sizeof(ss)); scanf("%d%d",&n,&m); memset(pos,0,sizeof(pos)); for(int i=1;i<=n;i++) { pos[i]
=n-i+1;//每個片子的位置 add(pos[i],1); } int hh,nn=n; for(int i=1;i<=m;i++) { scanf("%d",&hh); printf("%d",sum(nn)-sum(pos[hh]));//頂端到要拿的片子之間片子的數量 if(i!=m) printf(" "); else printf("\n"); add(pos[hh],-1);//把片子從原位置上拿走 pos[hh]=++nn; add(pos[hh],
1);//把片子放在頂端 } } return 0; }

uva 1513(樹狀數組)