码迷,mamicode.com
首页 > 编程语言 > 详细

uva 1513(树状数组)

时间:2017-08-18 18:36:36      阅读:118      评论:0      收藏:0      [点我收藏+]

标签: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;
}

 

uva 1513(树状数组)

标签:main   stream   const   names   return   nbsp   uva   class   string   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!