| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2136 人关注过本帖
标题:清华OJ Vector求解答
只看楼主 加入收藏
baymax201
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-3-2
收藏
 问题点数:0 回复次数:1 
清华OJ Vector求解答
题目描述
你有一个基于动态分配数组的顺序表。表中的元素均为非负整数,且按照非递减的顺序排列,即对于任何相邻的前后两个元素,靠前的元素都小于等于靠后的元素。

动态分配数组的规则如下:

初始时,表中元素个数为 0,数组的容量为 2。
每当在表已满(元素个数等于数组容量)的情况下尝试插入新的元素,则将动态分配的数组容量扩容为原来的 2 倍。此次插入操作造成的表中已有元素移动的次数等于此操作发生之前表中元素的个数(也即扩容前的数组的容量)。
每当在删除元素的操作之前,如果表中的元素个数小于等于数组容量的四分之一,则将动态分配的数组容量缩减为原来的一半。此次删除操作造成的表中已有元素移动的次数等于此操作发生之前表中元素的个数减 1(因为要删除的元素不需要被移动)。
如果某次插入或删除操作没有引起数组容量的变化,则:

对于插入元素的操作,此次操作造成的表中已有元素移动的次数等于插入的位置之后原有元素的个数。如果表中有相同元素导致可插入的位置不唯一,则选择最靠后的位置插入,以便减小表中已有元素移动的次数。
对于删除元素的操作,此次操作造成的表中已有元素移动的次数等于被删除的元素之后原有元素的个数。同样地,如果表中有多个相同的元素,则选择最靠后的元素删除,以便减小表中已有元素移动的次数。
现在,给出一系列的操作,每个操作可以是插入一个元素或删除一个元素(保证要删除的元素一定存在),请你输出每次操作造成的表中已有元素移动的次数。

输入格式
从标准输入读入数据。

第一行输入操作的总次数 n。

接下来 n 行,每行输入一个操作。操作的格式可能是:

A x 表示,在表中插入了一个值为 x 的元素;
D x 表示,在表中删除了一个值为 x 的元素。
输入的所有元素都在 unsigned int 范围内,即 0≤x<232。

输出格式
输出到标准输出。

对于每次操作,输出一行。每行仅包含一个整数,表示此次操作造成的表中已有元素移动的次数。

样例1输入
9
A 10
A 20
A 10
A 10
D 10
D 20
D 10
D 10
A 0

样例1输出
0
0
2
1
1
0
0
0
0

样例1解释
第 3 次操作导致数组容量从 2 变为 4,造成了 2 次表中已有元素移动;
第 4 次操作造成了元素 20 的 1 次表中已有元素移动;
第 5 次操作造成了元素 20 的 1 次表中已有元素移动;
第 8 次操作导致数组容量从 4 变为 2,但是没有发生表中已有元素移动。
样例2输入
17
A 1
A 2
A 3
A 4
A 5
A 6
A 7
A 8
A 9
D 9
D 8
D 7
D 6
D 5
D 4
D 3
D 2

样例2输出
0
0
2
0
4
0
0
0
8
0
0
0
0
0
3
0
1

子任务
在所有的数据中,操作次数 n≤10000。

对于前 20% 的数据,输入中仅包含插入操作,且每次插入的元素是递增的。

对于前 60% 的数据,输入中仅包含插入操作。

(有兴趣的同学,可以思考 n 如果在 106 左右的规模,此题该怎么做?)

提示
你可以按照题意实现一个符合要求的顺序表,也可以采用其他方式,只要能够正确输出答案即可。
搜索更多相关主题的帖子: 插入 元素 操作 表中 移动 
2020-03-02 20:49
changcy19
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-3-3
收藏
得分:0 
同清,没看懂这题啥意思
2020-03-03 12:00
快速回复:清华OJ Vector求解答
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016861 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved