#P16991. [SGU466] Parking at Secret Object
[SGU466] Parking at Secret Object
题目描述
有 个停车位按顺时针排成一个圆,编号为 ,其中 与 相邻。停车位可能为空闲,也可能已被占用。
把一个空闲簇定义为极大的连续空闲停车位集合。簇的大小是其中停车位数量;簇的头是沿顺时针方向进入该簇时遇到的第一个停车位。若所有停车位都空闲,则认为只有一个大小为 、头为 的簇。
需要依次处理 个操作:
PARK S:有 个用户需要停车。选择大小不小于 的簇中大小最小的一个;若有多个,再选择头编号最小的一个。从该簇的头开始顺时针分配连续 个停车位。若不存在足够大的簇,输出NO ROOM。LEAVE q:第 次操作中成功停车的用户离开,其当时占用的全部停车位重新变为空闲,并与相邻空闲簇合并。
所有 LEAVE 都保证合法,不会引用另一个 LEAVE,也不会让同一组已经离开的用户再次离开。
输入格式
第一行两个整数 。第二行一个长度为 的字符串,仅由 . 与 X 组成,分别表示空闲和占用。
随后 行,每行为 PARK S 或 LEAVE q。
原题数据规模很大,需要每次操作在对数复杂度内完成;本题包按 的上界覆盖极限测试。PARK 中 ,LEAVE 中 。
输出格式
对每个 PARK 输出一行。失败输出 NO ROOM;成功时将分配到的停车位写成若干按编号递增的闭区间,格式与样例一致。单点只写一个编号,跨过 时会拆成两个区间。
样例
10 4
..........
PARK 4
PARK 3
LEAVE 1
PARK 4
1-4
5-7
1,8-10