EC-FInal的题。。要是场上出了就好了。。。
题意:有N只蚂蚁玩饥饿游戏,在一个x轴上,第i只蚂蚁在坐标i上,重量为i,现在蚂蚁可以选择向左走或向右走,当两只蚂蚁相遇时大蚂蚁吃掉小蚂蚁,重量增加小蚂蚁的重量,如果重量相同,左边的蚂蚁吃掉右边的蚂蚁,给出N,K,问第K只蚂蚁最后留下的情况数。
数据范围: N<=10^6 K>=1 K<=N
解题:对于第N只蚂蚁,如果他想获胜,那么最后一个向左走的蚂蚁的前缀和必须小于其右边蚂蚁的后缀和,因为向左走的蚂蚁最终肯定会吃完(可能不是他吃完)左边直到1位置的所有蚂蚁然后向右走,此时这只向右走的蚂蚁的重量为1-最后一只向左走的蚂蚁的重量的和x,而他右边的蚂蚁向右走,那么最终必会被第N只蚂蚁吃掉,并且最后第N只蚂蚁的重量和为最后一只向左走的蚂蚁右边的蚂蚁的重量和y,此时两只蚂蚁相遇,如果第N只蚂蚁要获胜,那么x<y,所以只要找到这个位置len,那么情况数为2^(len+1),因为len+1~(n-1)的方向都确定了,剩下的随便选方向。
下面考虑对于N,K,可以发现(N,K))可以推到(N-1,K)的情况,即第N-1只蚂蚁向左拐的情况,可以发现此时因为第K只蚂蚁为获胜者,所以他最后必定向右走,重量为1-N-1只蚂蚁的重量和x,而右边的蚂蚁的重量和为第N只蚂蚁的重量y,那么只要x>y,第K只蚂蚁就会获胜,令dp[n-1]表示(N-1,K)的答案,那么(N,K)+=dp[n-1]/2 *2;/2表示第N-1只蚂蚁本来在长度为N-1时可以双向走,但长度为N时规定方向向左&#