【发布时间】:2014-09-02 18:27:41
【问题描述】:
http://www.spoj.com/problems/CTRICK/是spoj的问题 它指出
魔术师洗好一小包纸牌,将其正面朝下并执行以下程序:
最上面的牌被移到牌组的底部。新的顶牌面朝上放在桌子上。这是黑桃 A。
两张卡从上到下一次移动一张。下一张牌面朝上发到桌子上。黑桃二。
一次移动三张卡片……
这样一直持续到第 n 张也是最后一张牌变成黑桃 n。
如果魔术师事先知道如何排列卡片(并且知道如何进行假洗牌),这个令人印象深刻的技巧就会奏效。您的程序必须确定给定数量的卡片的初始顺序,1 ≤ n ≤ 20000。
输入
输入的第一行是一个正整数,表示要遵循的测试用例的数量。每个案例由包含整数 n 的一行组成。 输出
对于每个测试用例,输出一行,其中值 1 到 n 的正确排列,空格分隔。第一个数字显示包的顶牌,等等…… 示例
输入: 2
4
5
输出:
2 1 4 3
3 1 4 5 2
现在我能想到的唯一解决方案是使用队列并模拟该过程。 但这将是 O(n^2)。我阅读了 cmets,他们建议使用 BIT 的段树。 我知道分段树和 BIT,但无法理解如何在这个问题中实现它们。请提出一些方法来做到这一点。 谢谢
【问题讨论】:
-
你有没有试过这个问题?你目前的判决是什么?
标签: algorithm tree segment-tree