标签:main stream const names return nbsp uva class string
既然不能把树状数组的开头当作顶端,就把树状数组的结尾当作顶端,不断清空要拿走的片子,并更新结尾
#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; }
标签:main stream const names return nbsp uva class string
原文地址:http://www.cnblogs.com/Wangwanxiang/p/7390673.html