[jzoj]3542. 【清华集训2014】冒泡排序(树状数组+读入/输出优化+思维)

来源:互联网 发布:淘宝小号申请 编辑:程序博客网 时间:2024/06/05 11:19

Problem

对一个n元排列做冒泡排序,问做了k次交换之后排列的样子。

Data constraint

n<=10^6,k<=10^12

Solution

  • 一个比较显然的结论:

    • 一个数x前如果有t个比它大的数,那么前t轮它一定是每一轮都往前移一格.

    • t轮之后,它就有可能往后移了.

  • 那么我们依此可以算出每一轮有多少个数会往前移

  • 也依此可以求出刚好到第几轮交换次数不会超过k

  • 求出轮数t之后.

  • 如何求t轮之后的序列呢?

  • 【方法一:并查集】

    • 我们现在要做的是把t轮之后的每个数放到对应位置

    • 比如一个数本来需要往前x步,当x<=t时,我们可以直接往前移

    • x>t时,这时会发现它会往后走,那么此时,我的想法就是先不理它

    • 先把那些不可能往后走的填了

    • 即从按权值小到大填,一开始先填1对应应该放到的位置,这个很显然可以算出来

    • 然后我们再看2应该填的位置,如果它与1填的位置冲突了,就把它往后拉一个

    • 往后拉这一动作我们使用并查集,就可以在一个玄学的时间复杂度内解决这道题.

    • 注意,如果直接递归会爆栈,所以打C++对于递归一定要敏感.

  • 【方法二:找结论】

    • 首先,我们可以确定的是那些x<=t

    • 对于所有x>t的,可以发现它们是有序的,因为如果前面有一个数比它大,它都不可能往后移.

    • 非常简单高效.


求出每一个数前面有多少个数比它大我们可以用树状数组

【树状数组的引入】

  • 优点是常数小,易理解

  • 【单点修改update】

    • MainTain:lowbit(x)

    • 每一次都是把x>x+lowbit(x)

  • 【区间查询find】

    • 与单点修改一样,我们每一次都是把x>xlowbit(x)

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿车铆钉松了怎么办 扇子上的铆钉松怎么办 锅的把手松了怎么办 奶锅把手松了怎么办 锅的手柄烧坏了怎么办 鞋子上的铆钉生锈了怎么办 包包上的铆钉生锈了怎么办 凉鞋的铆钉生锈了怎么办 扇子的铆钉坏了怎么办 包包的铆钉坏了怎么办 汽车半轴螺丝母拧不动怎么办? 卫衣袖子短了怎么办 u型导轨蚊帐下垂怎么办 100的水管螺纹出漏水怎么办 吊顶螺丝没有防锈处理怎么办 膨胀螺丝洞松了怎么办 膨胀螺丝眼大了怎么办 墙上螺丝孔大了怎么办 膨胀螺丝孔深了怎么办 克霉膨胀栓的线怎么办 摩托车排气管螺丝断了怎么办 汽车轮胎螺丝卸不下来怎么办 内六角螺丝卸不下来怎么办 洗衣机六角螺丝卸不动怎么办 黄油嘴打不进去怎么办 螺杆冷水机氟系统有空气怎么办 脚踏式加油枪皮碗不下去怎么办? 自攻螺丝滑丝怎么办? 大工打小工老板不管怎么办 虾缸的过滤吸虾怎么办 加热棒坏了鱼怎么办 钢材软打孔断钻头怎么办 空调余额下水管检查口按不上怎么办 风机盘管噪音大怎么办 混凝土水泥放少了怎么办 门式钢梁端板连接下料短啦怎么办? 灌桩导管堵了怎么办 公路车尾钩歪了怎么办 铃木羚羊车大灯不亮怎么办 玻璃瓶打碎了里面食物怎么办 玻璃门上轴坏了怎么办