Pre
看来前两道题我都想出了大部分的思路,可是就是写不来啊,T3题面错了……
T1
这种题上来就想打表,打出来了一个很有意思的表,我发现了这是一个回文且等差的区间,所以可以将R和L分治,将R拆成2进制位表示,从高位到低位计算前2的i次方的区间长度……
写挂了
正解是二分算法
打出来的表的:
性质1、可以发现对于所有小于Ai的数,值为1的倍数全部算了一次,2的倍数全部多算了一次,4的倍数又多算了一次,以此类推
但是题目给的是位置R和L,不是数AR或AL,所以必须要快速知道AL和AR是什么;首先递推
是绝对行不通的,因为1e18跑一辈子都跑不出来;那么何不利用性质1呢,这样就可以log地计算某一个数值之前有多少个数,那么由于这个数值之前的数的个数是单调递增的,所以可以考虑二分当前这个数是多少,这样就求出R或L位置上出现的数的前一个数是什么,这样就可以再利用性质1求出R位置的数的前一个数是什么,然后再加上当前的数的贡献就好了……
T2
是道Dp,原先想的也是Dp,并且也根据题意定义了Dp状态,但是很不幸的是,我并没有想出怎么转移Dp状态;
首先定义Dp(i,j)表示已经插入了i个数(按照从小到大的顺序插入(这是技巧也是题目的其中一个性质)),并且所有数对于答案的贡献是j,那么从i-1如何转移道i呢?分析一下,当前要插入的数是i,那么怎么计算它对它前面的数的贡献呢?不对,它到底对之前比它小的数有没有贡献呢?【这是一个技巧,当时思考状态转移的时候就是卡在了计算贡献上,以为一定对之前的数有贡献,如果是这样就没法转移了,下次思考问题的时候遇到了瓶颈不妨考虑一下思考的东西到底存不存在合不合理,跳出思维的圈子】当然是没有的,首先如果当前的i能够使1~i-2中某一个数产生贡献,那么之前一定有另一个数使其产生了贡献,所以一定i只可能使其相邻的数产生贡献,并且插入i使得原先1~i-1的排列断开的两个序列一定互不影响,所以是乘法原理,这两段的贡献【不好确定就去枚举】分别是k,x,从i-1个数中选择j个数到前一段被宰的序列的方案是C(i-1,j),乘法原理之后,那么就很好转移了。
T3
一直想问是如何想到用取模运算压低空间复杂度并且将模型抽象成最短路的……
状态较多的可以用图或者点来避开冗余状态,这个我是想到了,但是抽象成最短路是根据题目的需要……