【JLOI2015】骗我呢
作者:互联网
题意简述:
求原点到点$P(n+m+1,n)$,并且不能经过(或跨越)直线$A:y=x+1$和$B:y=x-(m+2)$的路径条数。
题解:
这道题应该可以算是格路计算问题的巅峰了吧。
首先,我们把$P$点沿$A$进行翻折,记为$P'$,从原点到$P'$的路径条数就是“从原点到$P$,一定经过(或跨越)直线$A$的路径条数”
注意我们不知道是什么时候经过的,也不知道前后还有没有别的经过事件,因为我们只考虑了直线$A$。
我们把$P'$沿$B$翻折,记为$P''$,考虑从原点到$P''$的路径条数是什么意思:
由上面一个问题,我们很自然的猜想,“是不是从原点到$P$,一定经过(或跨越)直线$A$和$B$的路径条数呢?”
但是我们很快可以发现这个猜想是错误的,因为如果是这样的话,由对称性可知,先沿$A$折,再沿$B$折,和先沿$B$折,再沿$A$折,算出来的东西是一样的。
进一步的,即$A$和$B$关于直线$y=x$对称,
但其实,并没有保证这个条件。
那我们继续很自然的猜想,“是不是从原点到$P$,先经过$B$再经过$A$的路径条数呢”(注意这里我可能没有讲清楚,是保证有两次经过,并且有先$A$再$B$),
发现就是这样,因为我们可以把第一次经过$B$的部分沿$B$翻折,从第一个交点处到$P'$,一定要跨越$A$,所以是先$B$后$A$。
我们发现还是可以反复经过$B$,再经过$A$的。那么我们就把多次连续的经过一条直线记做一个事件,即把经过直线状态的改变看做一个事件。
那所有的不合法方案就是形如$A$,$B$,$AB$,$BA$,$ABA...$,共同点是$AB$交替出现,不知道先$A$还是先$B$,也不知道什么时候结束。
我们可以看成有一个文本检索器,每次可以搜一个子序列,查找文本中出现了此子序列的子段个数(更严谨的,查找文本中出现了此子序列的子段加权的个数和),怎么容斥的把所有不合法方案算出来。
先减去$A$开头的,再减去$B$开头的就可以了。
如何算$A$开头的?我们先沿$A$翻折,查$A$,算出来是多的,因为还有$B$开头且含$A$的,再把这一部分减去,即沿$B$翻折,查$BA$,减去$BA$的,但是会有多减的,因为还有$ABA$开头的,就再加上,发现加多了,因为还有开头$BABA$的......下一次的永远比上一次少,也就是它肯定会少到$0$,就在那里停止就可以了。
算$B$开头的同理。
标签:直线,JLOI2015,原点,经过,翻折,条数,开头 来源: https://www.cnblogs.com/shxnb666/p/11626519.html