﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Mato is No.1-随笔分类-几何</title><link>http://www.cppblog.com/MatoNo1/category/20386.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Sun, 03 Mar 2013 07:48:06 GMT</lastBuildDate><pubDate>Sun, 03 Mar 2013 07:48:06 GMT</pubDate><ttl>60</ttl><item><title>【AHOI2013复仇】二维DP优化的几道题总结</title><link>http://www.cppblog.com/MatoNo1/archive/2013/03/03/198185.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 03 Mar 2013 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/03/03/198185.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/198185.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/03/03/198185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/198185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/198185.html</trackback:ping><description><![CDATA[<div>【1】<a title="BZOJ1713" href="http://www.lydsy.com/JudgeOnline/problem.php?id=1713">BZOJ1713<br /></a>F[i][j]=max{F[i1][j1] - (sA[i-1]-sA[i1])<sup>2</sup> - (sB[j-1]-sB[j1])<sup>2</sup>} + A[i]*B[j], 0&lt;=i1&lt;i, 0&lt;=j1&lt;j<br />对这个式子进行化简：<br />F[i][j]=max{F[i1][j1] - sA[i1]<sup>2</sup> + 2*sA[i-1]*sA[i1] - sB[j1]<sup>2</sup> + 2*sB[j-1]*sB[j1]}+A[i]*B[j]-sA[i-1]<sup>2</sup>-sB[j-1]<sup>2</sup><br />对于一维的情况，很容易处理&#8212;&#8212;中间就是一条直线，然而这是二维的，对于这种2D/2D的DP方程，要优化到O(N<sup>2</sup>)级别，需要两步。<br />注意到决策式中除了F[i1][j1]外，其它部分都要么只与i1有关，要么只与j1有关。因此，可以把阶段i的各个状态作为一个整体，在之前得出的各个F[i][j]中，对于相同的j，找到对于目前的i，最优的那个决策&#8212;&#8212;注意，对于相同的j1，里面所有与j1有关的东西都可以先不考虑了，只考虑(F[i1][j1] - sA[i1]<sup>2</sup> + 2*sA[i-1]*sA[i1])对于目前i的最优决策。这一步可以在这些直线形成的上凸壳中找到，且满足决策单调性，可以用一个栈处理（斜率优化）。然后，将这些最优决策以j为自变量再组成一些直线，用栈维护它们的上凸壳，对于每个j，找到最优值即可。<br />注意事项：在栈中删除直线的时候，如果之前的最优决策是这个被删掉的直线，则要将最优决策先置为不存在，然后再插入新直线后设为新直线。另外，要特别注意平行的情况。<br /><br />【2】LCIS<br />经典问题，利用上面的分步优化思想，很容易用线段树得到一个O(N<sup>2</sup>logN)的做法。<br /><br />【3】<a title="[SCOI2010]股票交易 " href="http://www.lydsy.com/JudgeOnline/problem.php?id=1855">[SCOI2010]股票交易</a><br />F[i][j]=max{F[i-1][j], max{F[i-W-1][j-a]-A*a, F[i-W-1][j+b]+b*B}}, j&lt;=maxP, 1&lt;=a&lt;=maxA, 1&lt;=b&lt;=maxB<br />注意对于相同的j，计算方法是一样的，且是一条直线（由于有范围所以其实是线段）。<br />所以，计算阶段i时，可以将(i-W-1)阶段所有的决策当成线段插入，这些线段的斜率都相等，因此比较好维护，只需要判断边界即可。<br /><br />注意，NOI2011的show虽然也符合对于相同的j计算方法一样，但它就不能优化，因为它的决策是不连续且无规律的，没有任何几何性质。因此，它只能用O(N<sup>3</sup>)的算法计算出所有状态。<br /><a title="[SCOI2010]股票交易 " href="http://www.lydsy.com/JudgeOnline/problem.php?id=1855"> </a></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/198185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2013-03-03 15:25 <a href="http://www.cppblog.com/MatoNo1/archive/2013/03/03/198185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】动态凸包</title><link>http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Thu, 28 Feb 2013 10:29:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/198024.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/198024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/198024.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原题地址写了几天终于写出来了&#8230;&#8230;（显然，我太弱了，请各位神犇不要鄙视）在有加点的情况下，动态地维护凸包，有以下两种方法：&lt;1&gt;维护上、下凸壳（本沙茶采用的方法）：凸包可以拆成上、下凸壳，对它们分别维护。两个凸壳均按照下面定义的&lt;关系（即先x增、再y增）排序，注意，两个凸壳的两端是相同的，均为整个凸包的最小点与最大点，除两端外，它们没有公共定点。以上凸壳为例...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/198024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2013-02-28 18:29 <a href="http://www.cppblog.com/MatoNo1/archive/2013/02/28/198024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>