Description
Flappy Bird是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败。
现在小鸟们遇到了一个难题,他们遇到了一堵巨大的墙,墙上仅有m个洞供他们通过,由于小鸟们的体型不同且墙上洞的形状也不同,所以每种体型的鸟通过每个洞的时间都不同,鸟的体型共有n种,第i种体型的鸟通过第j个洞需要的时间记为T(i,j),且一个洞必须前一只鸟通过之后后一只鸟才能开始通过。
从时刻0开始,鸟开始通过,而每一只鸟的等待时间为从时刻0到自己已经通过洞的时间。现在知道了第i种体型的鸟有pi只,请求出使所有鸟都通过墙的最少的等待时间之和。
Solution
看上去就像费用流,但是由于标着个NOIP就没敢打。结果爆零。
首先很显然的是S向每种鸟连一条费用为0,容量为p[i]的边。
设鸟的个数有pp个。
如果一个洞j被一只鸟i最后一次到达,那么会对答案造成t[i][j]的影响,倒数第二个到达会造成t[i][j]*2的影响因为最后一个到达的还要多等t[i][j]的时间……
那么可以把每个洞拆成pp个点,每种鸟i都向洞j拆成的倒数第k次到达的点(拆成的第k个点)连一条费用为t[i][j]*k,容量为1的边。
然后每个洞拆成的所有点都向T连一条费用为0,容量为1的边。
然后跑一次最小费用最大流就好了。两种方法:1、zkw;2、spfa(这道题spfa比较快)
边数太多!!!
一共有100个洞,800只鸟,会拆除80000个点,40种鸟向80000个点连边会连出3200000条边,跑一跑绝对会烂掉。
考虑动态加边。
一开始每个洞只拆成一个点(注意这时向T的连边也只有这些点),然后跑一次增广,找到增广的那条路径填上的洞,然后这个洞再多拆出一个点,n中鸟向它建边,它向T连边。
这样动态加边时间就会快很多。
为什么NOI的题会被表上NOIP给我们做
NOI2012美食节
Code