uva 1513(樹狀數組)
阿新 • • 發佈:2017-08-18
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(樹狀數組)