题目列表 > 无尽的编号
时间限制: 1000ms 内存限制: 256MB
描述
在一条公路上,将要依次建造N座建筑。在每个建筑建成之后,都会用一个01串来给它编号。整条公路从起点到终点,所有建筑的编号都严格按照字典序递增的顺序来排列,而每在一个新的地方建起一个建筑时,它的编号会按以下规则确定:
1) 编号要比前一个建筑(起点方向)的字典序大,比后一个建筑(终点方向)的字典序小
3) 编号一定以1结尾
2) 编号要尽可能短,满足该条件时,字典序尽可能小
最开始时,公路的起点和终点上各有一个建筑,编号分别是0和1。接下来依次给出N个坐标 a1, a2, ..., aN,依次表示下一个建筑将要建造的位置,最后要问,当所有建筑建成时,这些建筑的编号总长度是多少,其中又出现了多少个字符1。所有建筑都在公路起点和终点之间,并且没有两个建筑建在同一个位置。
输入
输入文件包含多组测试数据。
第一行,给出一个整数T,为数据组数。接下来依次给出每组测试数据。
每组数据中第一行为一个整数 N,表示将要建造的建筑数量,第二行是用单个空格隔开的N个互不相同的整数 a1, a2, ..., aN,表示依次将要建造的建筑所在的坐标。
输出
对于每组测试数据,输出一行"Case #X: Y Z",其中X表示测试数据编号,Y表示所有建筑编号总长,Z表示所有编号中字符1的数量。所有建筑包括起点和终点的这两个建筑。所有数据按读入顺序从1开始编号。
数据范围
小数据:T ≤ 100, 0 < N ≤ 100, 0 ≤ ai ≤ 1000
大数据:T ≤ 10, 0 < N ≤ 50000, 0 ≤ ai ≤ 500000
样例输入
-
1
5
1 2 3 4 5
样例输出
-
Case #1: 22 16
#include
#include
题目意思我就不说了...getstr函数就是求满足要求的字符串...保证编号最短就行了...然后序号可能很大所以用了离散化处理
大数据的解法应该是加线段树优化,我这里只用了离散化所以自然会TLE....由于没地方提交了所以也无法验证