2017.8.5

来源:互联网 发布:淘宝户外用品店推荐 编辑:程序博客网 时间:2024/06/05 15:03
  总结1·题目大意是让你用3的某某次方去组成数,求第k小的数,数据范围很大,暴力只有五十分,这时候就需要去找规律了,我们发现1 3 4 9 10 12 13···中,一后面0个数,3后面1一个数,9后面三个数,算上他们自己就是1 2 4···,所以可以用递归去求,每一次都去分解,然后返回值,也可以用一个非常厉害的方法,就是把k转成二进制,然后从后往前有1就加3的n-i次方    假设是1   0  1 1 1          81  27 9 3 1,是1才加,原理同上。    2·题目大意是要排队,有一些人想要排到另一些人的前面,所以求在不违反k对排队愿望的情况下排队得方案数,暴力三十,正解状压dp,但未对。。。    3·给了你基本程序,然后考虑分治,就是把这个区间用递归(l,r)去分解,求个mid,然后b【i】,c【i】数组表示从mid+1到i的最小/大值,接着我们做三个前缀和,一个是b的,一个是c的,一个是b*c的,为后面算答案铺垫,求得之后我们画个图    ------\------  \是mid     在这一段区间中,我们考虑先算左边的,(左边直接记录答案)然后如果左边这个时候的max,min的在右边能找到可替换的就会出现如下情况    ------\--min1---max1    ------\--max1--min1    ------\------max1--    ------\------min1--    ------\------------    max1,min1表示右边的比左边的min小或比左边的max大的数,然后一二种情况可以归类成一种,分三段去计算右边的    ------\--               max,min与左边不变    ------\--min1---                      max与左边不变,min有前面算的前缀和。    ------\--min1---max1--                                    min,max都变了,也有前缀和,算b*c的

如果是max1在min1前面的话就倒过来。
其余情况都很好算了。

原创粉丝点击