Uva(1513)(Movie collection)

链接:https://vjudge.net/problem/UVA-1513
思路:有几天没写了,今天来一个树状数组的。求一个盘子上面的盘子数目。首先我们要明白树状数组求的东西都要跟前缀有关,而盘子上面的数目正好就是前缀,恰好满足我们的条件,但是我们随即发现,抽出来之后还要将盘子放上面,我们是无法在树状数组的前端插入一个新值的,也不可能让整个数组移动,怎么办呢?我们想到只能在后端插值,那么此时前缀和的意义就变为了他下面盘子的数目,其实只需要用n减一下就可以转化为上面盘子的个数,将拿出位置的值设为0即可。需要把数组开大一点。
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e6;
int c[maxn];
int arr[maxn];
int n,t,m;

int lowbit(int x){
    return x&(-x);
}

void add(int x,int d){
    while(x<m+n+1){
        c[x]+=d;
        x+=lowbit(x);
    }
}

int sum(int x){
    int res = 0;
    while(x){
        res+=c[x];
        x-=lowbit(x);
    }
    return res;
}

int main(){
    scanf("%d",&t);
    while(t--){
        memset(c,0,sizeof(c));  
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            arr[i] = n-i+1;
            add(i,1);
        }
            for(int j=1;j<=m;j++){
                int now;
                scanf("%d",&now);
                printf("%d%c",n-sum(arr[now]),j==m?'\n':' ');
                add(arr[now],-1);
                arr[now] = j+n;
                add(j+n,1);
            }
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,464评论 19 139
  • 2/30笔墨里的时光 睡眠: 11:20—6:30 阅读.:《儿童是天生的诗人》23-47 运动:步行19530步...
    真真1阅读 3,490评论 6 5
  • 从小喜欢画画,不过没正经学过,只是不停地画不停地画就觉得很开心了。虽然也有过因为自己能力不足很沮丧的时候,不过吃顿...
    Lycain阅读 1,319评论 4 0
  • 今晚听了《青椒分科网络研修解读后》,我们除了周三北师大的专业课程学习的必修课程外,再根据自己 学科需求参与...
    云卷云舒1211阅读 1,475评论 0 3
  • 治疗拖延症的方法:象限整合法,时间交替法,化整为零,善用拖延! 这两天回常州,习惯一下子被打乱了……
    大头茄子阅读 988评论 0 0