首页 > 编程语言 > 详细

uva 1513(树状数组)

时间:2017-08-18 17:44:20      阅读:144      评论:0      收藏:0      [点我收藏+]

既然不能把树状数组的开头当作顶端,就把树状数组的结尾当作顶端,不断清空要拿走的片子,并更新结尾

#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(树状数组)

原文:http://www.cnblogs.com/Wangwanxiang/p/7390673.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!