OI犯2合集!

搞oi搞了这么就,难免有一些理解的不够透彻的地方,下面我就列举2个我严重犯2的地方,相信很多人也犯过和我一样的错误:

1.三分法求峯值

       众所周知,求单峯函数峯值有2个著名的算法,一个是三分法,一个是优选法,下面我写下广大OIer三分法的写法

       取区间1/3点和2/3点,算出权值;

       比较1/3点的权值和2/3点的权值,若1/3点的权值较优,则把左端点推进到1/3处,否则推进右端点到2/3处。

       某一天突然想到,我们在做数学题求单峯函数的极值是不是经常求导取0点吗?求导的定义不就是[f(x+dx)-f(x)]/dx,如果仅仅是单调函数取0点的话不就可以二分法了吗,虽然在做OI题的时候不可以真的求导,但是可以把dx取一个很小的值就可以看成近似求导了?于是算法编程这样:

       取区间0.49点和0.51点,算出权值;

       比较0.49点的权值和0.51点的权值,若0.49点的权值较优,则把左端点推进到0.49处,否则推进右端点到0.51处。

当时想到的时候不知道为什么脑子一犯2就觉得这样复杂度还高些,后面唧唧帮我严格算了一下,前者的复杂度为(2*LOG(1.5,N))后者的复杂度为(2*LOG(2,N)),常数之比为Log(1.5,2)=1.7!!我们就白白的增加了这0.7的常数!如果是三分套三分的话,常数就是3!!

再来看看优选法,优选法就更加NB了,复杂度是(LOG(1.618,N)),和“三分法”的常数之比为2*LOG(1.5,1.618)=2.4,平方一下就是6倍的常数了。。

2.关于状态压缩DP

       刚接触状态压缩DP的时候,大家都写过1*2骨牌覆蓋吧,大家写的应该都是按行DP的把,其实这个也可以按格DP呢。。

       还有就是今天才犯得傻X错误,大家看这么一道题:一个N*M的带障碍的网格,用最少的链和环覆蓋所有的非障碍格子,环不算费用。。

       首先想到的应该是CDQ论文中讲的插头DP,记左插头,右插头,单独插头,障碍,状态数4^(n+1),如果你的预处理风骚无比的话可以做到只有10W以下的状态。

       然后就听到了ZPL NB的3^N的状态压缩,为什么是3^N?我觉得他应该已经想得很到位了,可能某个地方想丑了。。

       最后有一位imba的同学说了一个2^N的状态压缩,回家后自己一想,发现对啊,在这道题中 左插头,右插头,单独插头 任意两个都可以两两转移,我TM干嘛还区分他是什么插头来着!仔细一想,为什么我们要区分不同的插头类别?是因为我要防止单独的环出现!既然这道题允许出现单独的环,就没必要区分插头种类了。

       finally,标准做法是费用流,瞬间被虐成屎了。。

       因此,允许单独环出现的题统统可以用2^N的状态压缩啦,这让我想到了POJ的某道题:求两条网格上指定终点起点的不想交的最短路径,终于知道为什么自己7^N状态数T到死的原因了。

点赞