﻿<?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/19860.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Sat, 03 May 2014 00:13:02 GMT</lastBuildDate><pubDate>Sat, 03 May 2014 00:13:02 GMT</pubDate><ttl>60</ttl><item><title>WC2014总结</title><link>http://www.cppblog.com/MatoNo1/archive/2014/02/14/205760.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Fri, 14 Feb 2014 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2014/02/14/205760.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/205760.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2014/02/14/205760.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/205760.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/205760.html</trackback:ping><description><![CDATA[<p style="margin-bottom: 0in">（0）人类智慧是可怕的&#8230;&#8230;</p> <p style="margin-bottom: 0in">（1）我们要充分发挥人类智慧，探索、测试、改进解决方案的能力&#8230;&#8230;</p> <p style="margin-bottom: 0in">（2）有些喜闻乐见的题目，和游戏好像木有什么区别囧&#8230;&#8230;</p> <p style="margin-bottom: 0in">（3）随机和近似是很有力的工具&#8230;&#8230;</p> <p style="margin-bottom: 0in">（4）尽可能发散思维，想到乱搞办法，是更有力的工具&#8230;&#8230;</p> <p style="margin-bottom: 0in">（5）学会利用机器和系统的bug和其它有用特点进行乱搞，是(更<sup>*</sup>)有力的工具（前面的那个括号内是个正则表达式）&#8230;&#8230;</p> <p style="margin-bottom: 0in">（6）传统题可能有许多非传统做法，这是很坑的囧&#8230;&#8230;</p> <p style="margin-bottom: 0in">（7）做题时，不要忘了计算机科学最基本的理论&#8230;&#8230;</p> <p style="margin-bottom: 0in">（8）有时候，玩也是很有用的囧&#8230;&#8230;</p> <p style="margin-bottom: 0in">（9）任何时候，永远不要对自己丧失信心和希望，即使在考挂的时候囧&#8230;&#8230;</p> <p style="margin-bottom: 0in">（10）营员交流和表演节目是可以救命的囧（不知谁还记得@huyuanming11和@lhm_m两位神犇的故事&#8230;&#8230;）</p> <p style="margin-bottom: 0in">（11）给人类智慧的化身@lemon_workshop（@false_sillycross)跪了&#8230;&#8230;</p> <p style="margin-bottom: 0in">（12）给提出数据结构最前沿研究内容Retroactive DS，同时在比赛里出人道数据，最终成功保佑了本沙茶的@WJMZBMR跪了&#8230;&#8230;</p> <p style="margin-bottom: 0in">（13）给虐爆全集训队的@xudyh、@vfleaking、@jcvb跪了&#8230;&#8230;</p> <p style="margin-bottom: 0in">（14）给比赛前一天玩游戏（当然后来也开始刷CF了&#8230;&#8230;表示神犇为什么都喜欢刷CF囧&#8230;&#8230;），然后在比赛里虐场的@法法塔、@Vensinte跪了&#8230;&#8230;</p> <p style="margin-bottom: 0in">（15）给一年集训队、一年半候选队的@formyfamily(kzf)跪了&#8230;&#8230;</p> <p style="margin-bottom: 0in">（16）给下N个法法塔：@ydc、@pyx1997、@matthew99&#8230;&#8230;跪了&#8230;&#8230;</p> <p style="margin-bottom: 0in">（17）给各位被本沙茶偷来资料的神犇，以及所有虐掉本沙茶的神犇跪了&#8230;&#8230;</p> <p style="margin-bottom: 0in">（18）其实上面的所有人都叫一个名字：杨芳斐&#8230;&#8230;（顺便剧透一下：本沙茶其实是杨芳斐的第10086个小号&#8230;&#8230;）</p> <p style="margin-bottom: 0in">（19）没什么可说的，都是蒟蒻的借口罢了&#8230;&#8230;自己果然还是半吊子水平啊囧&#8230;&#8230;<br /><br /><div>最终总结，用两个字形容本次WC：<span style="color: red; "><strong>,b</strong></span></div></p><img src ="http://www.cppblog.com/MatoNo1/aggbug/205760.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> 2014-02-14 16:59 <a href="http://www.cppblog.com/MatoNo1/archive/2014/02/14/205760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NOI2013 题解&amp;&amp;总结</title><link>http://www.cppblog.com/MatoNo1/archive/2013/07/20/201888.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 20 Jul 2013 15:43:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2013/07/20/201888.html</guid><description><![CDATA[@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
【Day0】<br />
不说了囧&#8230;&#8230;<br />
<br />
【Day1】<br />
meow：<br />
k=2：先将这N个d维向量组成一个N*d的矩阵A，则A*A<sup>T</sup>&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;(mod 2)就是向量i&#8226;向量j(mod 2)，因此问题有解当且仅当A*A<sup>T</sup>不是全1。<br />
随机1*N的向量v，看(v*A)*A<sup>T</sup>是否等于v*(N*N的全1矩阵)，如果A*A<sup>T</sup>不是全1那么期望试两次就可以得到不等的结果。（如果试了10次都是相等，就视为无解）<br />
如果两边的乘积不等，则找到那个不等的列，设为第i列，则必然存在一个解包含向量i，枚举另一个即可。时间复杂度O(Nd)<br />
k=3：计算(A*A<sup>T</sup>)&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;<sup>2</sup>(mod 3)，即(&#931;(x<sub>ik</sub>*x<sub>jk</sub>))<sup>2</sup>，即&#931;(x<sub>ik1</sub>*x<sub>ik2</sub>*x<sub>jk1</sub>*x<sub>jk2</sub>)(mod 3)，对每个向量构造一个d<sup>2</sup>维向量，为之前的每个向量各维两两相乘的结果，则转化为k=2的情况（只不过将mod 2改为mod 3），时间复杂度O(Nd<sup>2</sup>)，常数小一点（比如少算mod）可以卡过去。<br />
<br />
count：<br />
（正解需要某些很奇怪的性质，本沙茶看不出来，只会85分的）<br />
递推，设F&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;和G&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;表示某层是BFS序列的&amp;e1;i..j&amp;e3;这一段，树的总高度和树的棵数（所求平均值即为F&amp;e1;i&amp;e3;&amp;e1;j&amp;e3; / G&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;）。<br />
则枚举k，若k<strong><span style="&quot;color:"  red;&quot;="">满足一定条件</span></strong>，则F&amp;e1;j+1&amp;e3;&amp;e1;k&amp;e3;+=F&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;+G&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;，G&amp;e1;j+1&amp;e3;&amp;e1;k&amp;e3;+=G&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;。<br />
问题是这个&#8220;一定条件&#8221;是什么（最难搞的地方囧）<br />
第零，BFS&amp;e1;j+1..k&amp;e3;这一段的各个结点在DFS序列中的位置递增（这个很显然）。<br />
第一，BFS&amp;e1;j+1..k&amp;e3;这一段的各个结点在DFS序列中的位置之前都必须有在BFS&amp;e1;i..j&amp;e3;范围内的结点，作为它的父结点（这个也很显然）；<br />
第二，DFS序列中，所有在BFS&amp;e1;i..j&amp;e3;范围内的结点的下一个位置如果不是在BFS&amp;e1;0..i-1&amp;e3;范围内的，就必须是BFS&amp;e1;j+1..k&amp;e3;范围内的，因为这表示它的第一个子结点（这个灰常难想到！！！！！！！！！！！！！！！本沙茶就挂在这里了囧&#8230;&#8230;）<br />
对于第零和第一，实际上是给出了k的上限，枚举k时不符合这个条件则退出，而第二则是给出了k的下限（所有的&#8220;下一个位置&#8221;要填满才能算）；<br />
此外，F和G要用long double（double也会爆，不用担心精度，本沙茶当时还在如何维护平均值的问题上纠结了很久&#8230;&#8230;）<br />
这个做法是O(N<sup>3</sup>)的，但加上那些优化就可以85分了囧&#8230;&#8230;<br />
（本沙茶当时想到这个做法了，也想到了第零和第一，但木有想到第二，结果挂了&#8230;&#8230;要是真得到85分，总分254，稳的rank1了&#8230;&#8230;真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧，真悲剧&#8230;&#8230;）<br />
<br />
train：<br />
史上最水的提交答案&#8230;&#8230;整个就是个NOIP普及组难度的题&#8230;&#8230;<br />
首先分析数据就不难发现这10个点其实是一种模型：<br />
一开始有若干元钱（用变量v 2表示）。<br />
有若干个大块，每个大块可以选择进或者不进，如果进，就要付出一些钱，如果不进，就自动跳转到后面的某个大块。<br />
在每个大块里有若干个（不超过25个）小块，有1或10个变量，每个小块也可以选择要或者不要，如果要，就对所有的变量各加上一个效果值（可正可负）。<br />
目标是所有变量的绝对值之和最大（每个大块末尾会结算一次，然后将所有变量的值清零）<br />
首先每个大块内选哪些小块可以暴力枚举，然后得到最大的总绝对值，设为val&amp;e1;i&amp;e3;（i为大块编号），设如果不进第i个大块，跳到的大块编号为B&amp;e1;i&amp;e3;，第i个大块付出的钱为V&amp;e1;i&amp;e3;。<br />
而大块之间就是一个类似于01背包的模型，设F&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;表示到达第i个大块（尚未作出选择）时，用掉了j元钱的最大总效果值，用F&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;更新F&amp;e1;B&amp;e1;i&amp;e3;&amp;e3;&amp;e1;j&amp;e3;，若不超过一开始的总钱数则用F&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;+val&amp;e1;i&amp;e3;更新F&amp;e1;i+1&amp;e3;&amp;e1;j+V&amp;e1;i&amp;e3;&amp;e3;，要实时保存最优决策。<br />
输出的时候注意一下，那里面有几个点，当钱不够时会自动选择不进当前大块，木有必要作出选择了。<br />
<br />
至此Day1完挂。<br />
<br />
【Day2】<br />
matrix：<br />
矩阵乘法，十进制快速幂。没了。<br />
<br />
penman：<br />
比较猥琐的DP题&#8230;&#8230;<br />
重点是这个：所有的图形都可以拆成单列，一列一列地弄（本沙茶太弱了，这个都木有想起来），然后就是三维DP。<br />
N：设F&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;&amp;e1;k&amp;e3;&amp;e1;st&amp;e3;表示第i列，上下边界分别为j、k行，状态为第st个部分（第0部分为最左边一竖，第1部分为中间若干块，第2部分为最右边一竖）的最优解，计算好一列之后求出一大堆辅助值，就可以使下一列O(1)算出了。<br />
I：设F&amp;e1;i&amp;e3;&amp;e1;j&amp;e3;&amp;e1;k&amp;e3;&amp;e1;st&amp;e3;表示第i列，上下边界分别为j、k行，状态为第st个部分（第0部分为那一竖的左边，第1部分为那一竖，第2部分为那一竖的右边）的最优解，不需要辅助值，直接求即可；<br />
O：可以DP，但更好的办法是枚举左、右、上边界，然后扫描，说它更好是因为知道了左右边界，可以直接引出左边的N和右边的I的最优解。<br />
具体实现的时候细节很多&#8230;&#8230;真折磨人。还有要注意为节省空间，F数组要对i这一维滚动。<br />
<br />
foodshop：<br />
首先这是个无向环套树（关于这方面的总结见<a title="&quot;这里&quot;" href="&quot;http://www.cppblog.com/MatoNo1/archive/2012/09/01/189006.html&quot;">这里</a>）<br />
枚举开店的那条边，如果是树边，求出该边的较下结点往下的最大长度dist1，以及往其它结点的最远距离dist2，则结果即为min{dist1+x, dist2+L-x}，满足0&lt;=x&lt;=L，L为该边长度。dist1求法不说了，dist2分为两部分，树内的，可以转化为经典DP模型&#8220;树的中心点&#8221;；树外的，先求出环上的每个结点往树中走的最大长度，作为这个结点的权值，然后就转化为一个带边权和点权的环，对于每个点i，求出max{i、j距离+j的权值}（j为环上的点）的值，这个值可以通过在环上扫描的方法求出：设G&amp;e1;i&amp;e3;为第i个点出发，逆时针走更优的位置最远到哪里。逆时针扫描这个环，然后所有的G就可以在线性时间内求出，求出G后，对每个点分别求出其逆时针更优区与顺时针更优区内的最大值（可以在扫描过程中用线段树维护），即可解决这个问题。<br />
如果开店的边在环上，设其两端点为i、j（i-&gt;j为逆时针方向）。很容易发现，如果在这条边上开店，则j的逆时针更优区内的所有点一定是逆时针到这个店更近，i的顺时针更优区内的所有点一定是顺时针到这个店更近，而其它的点则需要额外判断一下是顺时针更近还是逆时针更近（总判断次数为线性）。这样也可以借助线段树在扫描过程中求出每条环边的顺、逆时针更优区，从而转化为与树边的问题一样的模型。时间复杂度O(NlogN)。<br />
不过，对于环边，还有一种更简单的做法（Orz @hza）：<br />
二分最远距离（即结果）D，然后对于环上的所有点，找到这个环上到这个点距离大于（D-这个点树里的最大深度）的点集合（显然是连续的一段弧），对所有点的这种弧求并，如果能覆盖整个环，则最优解&lt;D，否则最优解&gt;=D。<br />
<br />
本沙茶Day2全暴力，只拿了暴力分&#8230;&#8230;对付繁琐题的能力太弱了，代码量一大就悲剧&#8230;&#8230;<br />
（后来发现，foodshop的暴力都写疵了囧&#8230;&#8230;枚举开店的边后应该用SPFA求最短路，因为删掉的可能是树边，剩下的不是树&#8230;&#8230;不过数据弱，木有出现这种情况囧&#8230;&#8230;）<br />
<br />
至此NOI2013完挂。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
【总结 &amp;&amp; 一些感想】<br />
从上面可以看出，本沙茶在NOI2013中使用的算法都是NOIP普及组以内难度的囧（matrix的矩阵乘法可能略高级一些，但显然也不能超过NOIP难度）&#8230;&#8230;<br />
这些算法都是本沙茶在2009年以前就搞懂的，也就是说，后4年掌握的所有算法，这次都木有用上&#8230;&#8230;<br />
最后一次NOI，竟如此富有戏剧性&#8230;&#8230;居然只考普及组算法&#8230;&#8230;<br />
图论、高级数据结构、字符串、几何、数论、组合&#8230;&#8230;这次都木有考，这也是NOI历史上的一个&#8220;创举&#8221;了囧&#8230;&#8230;<br />
但尽管如此，本沙茶在此次NOI中仍然暴露出了诸多问题&#8230;&#8230;并不是比赛技巧问题，而是平时埋下的祸根&#8230;&#8230;<br />
想题不够灵活，找不出题目隐藏的特殊性质，特殊情况考虑不清楚，写代码速度太慢&#8230;&#8230;这些都是平时不好好做题，天天颓废的结果&#8230;&#8230;<br />
因此，这次挂掉，也是理所应当的事&#8230;&#8230;<br />
<div><strong><span style="&quot;color:"  red;&quot;="">遗失了过去，因此，现在后悔了&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span></strong><br />
<br />
不过，不管肿么讲，还是混进了集训队&#8230;&#8230;集训队是一个新的开始，每天都面临巨大的挑战，同时每天都能得到巨大的提高&#8230;&#8230;<br />
虽然本沙茶现在很弱，应付难题的能力还远远不够，但经过这一年的训练，相信可以改变这一切，尽快脱菜&#8230;&#8230;<br />
希望这能是一个转折点。<br />
<strong><span style="&quot;color:"  red;&quot;="">50，12，6，4，1。</span></strong><br />
<div>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div>
膜拜本次虐场神犇<br />
@鼎爷<br />
@xudyh<br />
@xyz111<br />
@hzaskywalker(FFT)<br />
@hzhwcmhf<br />
@zhj<br />
@鱼丸<br />
@sunzhouyi<br />
以及众多虐掉count、penman、foodshop的神犇&#8230;&#8230;</div>
<div></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/201888.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-07-20 23:43 <a href="http://www.cppblog.com/MatoNo1/archive/2013/07/20/201888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NOIP2012 完挂……</title><link>http://www.cppblog.com/MatoNo1/archive/2012/11/19/195376.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Mon, 19 Nov 2012 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/11/19/195376.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/195376.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/11/19/195376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/195376.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/195376.html</trackback:ping><description><![CDATA[<div>blockade写疵了&#8230;&#8230;<br />在贪心的部分的一个x++忘写了囧&#8230;&#8230;<br />再加上Day1完跪，<strike>估计本沙茶这次AH Top10都进不去了囧&#8230;&#8230;明年省集训队有危险了囧&#8230;&#8230;</strike>（据最新消息，由于AH太弱了，Top10还是稳的囧&#8230;&#8230;）<br /><br />看来这么长的综合题代码不对拍确实很危险&#8230;&#8230;<br />但又有谁让我写得这么慢木有时间对拍了呢&#8230;&#8230;<br /><br />为什么挂得这么惨呢？<br />基本的模板写得太不熟了，一遇到综合题就慢，drive和blockade挂掉都是这个原因囧&#8230;&#8230;<br />还有，一遇到长代码的题就畏惧&#8230;&#8230;本沙茶在写blockade代码的时候，连写add_edge时手都在抖，心发慌&#8230;&#8230;以至于这个200-行的代码写了2h+&#8230;&#8230;<br /><br />之前的N多模拟赛，本沙茶都考得很好，但是有个毛用&#8230;&#8230;毕竟当时这种类型的题木有出&#8230;&#8230;<br /><br />剩下就木有可说的了囧&#8230;&#8230;虽然这次挂了，但是只要吸取教训，下次一定能翻身！！！！！！！！！！！<br /><strong><span style="color: red;">AHOI2013 我要复仇</span><span style="color: red;">！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！</span></strong><br /><br />Orz AK的大神！！<br />@hqztrue<br />@roosephu<br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/195376.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> 2012-11-19 17:58 <a href="http://www.cppblog.com/MatoNo1/archive/2012/11/19/195376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】NOIP2012 总结</title><link>http://www.cppblog.com/MatoNo1/archive/2012/11/14/195019.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Wed, 14 Nov 2012 13:04:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/11/14/195019.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/195019.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/11/14/195019.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/195019.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/195019.html</trackback:ping><description><![CDATA[【Day1】<br />vigenere：不说了；<br /><br />game：<br />方法一（本沙茶在现场的做法，60分）：<br />设i的左右手为A[i]和B[i]。二分最大的金币数D，则第i个人要满足其前面所有人（包括国王）的A之积不超过S[i] = (D+1) * B[i]&nbsp;- 1。<br />考虑站在最后的那个人，显然除了他以外的所有人（包括国王）的A之积不能超过他的S值，如果木有人满足此条件则无解，否则取满足此条件的A值最大的人，放最后（因为若某个合法方案最后不是满足此条件的A值最大的人，则把那个A值最大的人与他交换，仍然是合法方案），然后删掉这个人，转化为子问题，直到所有人都删掉为止，此时必然有解。<br />此方法时间复杂度为O(N<sup>2</sup> * log<sub>2</sub>MAXW)，其中MAXW为D的上限，由于60%的数据D&lt;=10<sup>9</sup>，所以MAXW取10<sup>9</sup>。<br />显然这个方法是不能再加高精度了，否则必T，问题是计算所有人的A之积时会超过long long范围，解决方法：由于A和B的上限是10<sup>4</sup>，D的上限是10<sup>9</sup>，所以有解时必然有所有人的A之积&lt;=10<sup>9</sup> * 10<sup>4</sup> * 10<sup>4</sup> = 10<sup>17</sup>，因此在过程中若超过这个值，必定无解，直接卡掉。<br /><br />方法二（正解）：<br />把所有的人按照A*B递增排序，就一定是最优解，剩下的就不解释了（需要高精度乘除单精度）。<br />证明：<br />若某方案不是将所有人按照A*B递增排序的，则必然存在i使得A[i]*B[i]&gt;A[i+1]*B[i+1]（这里的i是排序后的编号，不是原来的编号），下证交换i和(i+1)之后解必然不会变差。<br />设i前面所有人（包括国王）的A值之积为S1。<br />交换前，i的金币数为S1/B[i]，(i+1)的金币数为S1*A[i]/B[i+1]；<br />交换后，i的金币数为S1*A[i+1]/B[i]，(i+1)的金币数为S1/B[i+1]；<br />注意这里S1*A[i]/B[i+1]显然不小于S1/B[i+1]，而S1*A[i]/B[i+1]-S1*A[i+1]/B[i]=S1*(A[i]*B[i]-A[i+1]*B[i+1])/(B[i]*B[i+1])&gt;0，因此交换前(i+1)的金币数不小于交换后i和(i+1)的金币数，而除了i和(i+1)外，其他人在交换前后金币数都不变，因此总的金币数的最大值不会变大，即解不会变差。证毕。<br /><br /><span style="color: red"><strong>这两种解法都是贪心，但它们是从不同的角度入手的&#8212;&#8212;方法一是&#8220;分阶段贪心&#8221;，证明需要分别证最优子结构性质和贪心选择性质；方法二是&#8220;排序贪心&#8221;&#8212;&#8212;在一类有关最优顺序的问题中，一般解法不是贪心，就是二分图或网络流模型（当然小数据也可以状压），如果用贪心，只要找到一种排序方法（对某个值排序），使得若不这样排序则把相邻逆序的元素交换后能够得到不更差的解，做法就是正确的。</strong></span><br /><br />drive：（本沙茶想出正解了，可是实在写不完，后来交暴力了囧&#8212;&#8212;真真真真真真真真真真真真真真真真真真真真真真真真真真真真真真悲剧）<br />首先求出S1[i]和S2[i]分别表示i往右最近的和第二近的位置，这个用平衡树可以解决；<br />然后，每个位置i拆成两个点i.A和i.B，分别表示从这里出发，A先开和B先开。i.A往S2[i].B（如果有的话）连一条边，边权为两位置距离，i.B往S1[i].A（如果有的话）连一条边，边权为两位置距离。由于不会有环（S1[i]、S2[i]均&gt;i），所以是森林。<br />然后，设F1[i]和F2[i]分别为从i走到根结点，A开的长度和B开的长度，这个BFS一下就可以了囧。<br />对于第一问，设W[i]为从i往上走，总长不超过X0时最远能走到哪里，显然只要从下到上求W，类似单调队列乱搞即可；求出W后，枚举每个点i，用记录的F1和F2值可以求出i到W[i]路径上A开的和B开的长度，找比值最小的即可；<br />对于第二问，可以在求出森林后用树的路径剖分搞，但更好的做法是倍增：设SUM[i][k]表示从i往上走2<sup>k</sup>条边的总长度，SUM可以在预处理中求出，做第二问时，只需要在SUM里调就行了，一次操作的时间复杂度O(log<sub>2</sub><sup>2</sup>N)。<br />显然这是个数据结构综合题，巨繁琐（估计代码要超过10K），本沙茶当时花了1h+写，后来发现肿么也不可能写完了，就交暴力了囧（早知道一上来就写暴力了，这样或许能想出来game的正解啊啊啊啊啊啊啊啊啊&#8230;&#8230;哭死&#8230;&#8230;）<br /><br />总之Day1跪得不成人形了&#8230;&#8230;<br /><br />
<div>【Day2】<br />mod: 不说了；<br /><br />classroom：线段树是可以AC的，只不过要把两个操作（找最小值和区间减法）放一起；</div>当然，本题的正解是，二分M0，然后看前M0个操作是否能全部满足：将每个操作(l, r, D)拆成(1, r, D)和(1, l-1, -D)（当l&gt;1时），这样所有操作的左端点都是1了，设S[i]为右端点为i的所有操作的D之和，这个显然可以在线性时间内得到，则点i的变化量就是S[i..N]之和，这个在求出S[i]后从后到前扫描一下即可得出，也是线性，如果所有的变化量加上原来的值都不小于0，则前M0个操作都能满足，否则就不是都能满足。<br />这样，时间复杂度仍是O(NlogM)的。更好的方法是，借鉴倍增的思想，如果前M0个可以满足，就把前M0个都满足（把所有点都加上变化量），接下来就不用考虑前M0个操作了，只在后面继续二分。这样，算法的时间复杂度就是线性的了。<br /><br />blockade：<br />
<div>【首先每个军队往上走当然是最好的，但不能在根上停住。<br />因此，二分最长时间D（注意D&lt;=5*10^13），然后先看不能走到根的军队，一直往上走直到时间到了。<br />然后看能走到根的，先让他们全到根上，然后，对于那些&#8220;还有叶结点木有被控制的&#8221;根的子树（防止断句错误），用那些走到根上的来控制，用贪心解决&#8230;&#8230;<br />本沙茶就这么写的，写了180+行，也查完了，可是在结束前5min时突然发现漏了一种情况&#8212;&#8212;<br />某些能到根的军队可以不走到根，直接停在根的子结点处，控制这棵子树。<br />可是已经来不及了，最后就木有考虑这种情况&#8230;&#8230;而且这种情况还比较普遍&#8230;&#8230;】<br />这种情况的解决办法：<br />如果某个军队能走到根，但让它再走一步，走回到它所在的那个根的子结点，就来不及了的话，就让它停在根的子结点处，控制它自己的子树。这是因为，如果它去帮别的子树，必然就有第三个军队要来帮它。设它所在的那个根的子结点为B，它去帮的子结点为A，帮它的第三个军队所在的根的子结点为C，由于它自己走不回来，所以第一次走到根的子结点处的剩余时间T&lt;2*W(root, B)，而它能去帮别的子结点，所以T&gt;=W(root, A)+W(root, B_，可得出W(root, A)&lt;W(root, B)。第三个军队能来帮它，所以第三个军队剩余的时间&gt;=W(root, B)+W(root, C_，自然&gt;W(root, A)+W(root, C)，所以这第三个军队也能去帮A，因此，让原来的军队停在B，第三个军队去帮A，也是合法方案。<br />注：本题灰常麻烦，需要用到树DFS、BFS、倍增（这个和drive肿么一样啊囧&#8230;&#8230;），本沙茶写的时候还用上了线段树囧&#8230;&#8230;<br /><br />
<div><strike>总之Day2也跪了，但不像Day1那么惨囧&#8230;&#8230;<br /></strike>总之Day2比Day1跪得更惨囧&#8230;&#8230;<br /></div></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/195019.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> 2012-11-14 21:04 <a href="http://www.cppblog.com/MatoNo1/archive/2012/11/14/195019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】11月的NOIP模拟赛总结</title><link>http://www.cppblog.com/MatoNo1/archive/2012/11/09/194983.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Fri, 09 Nov 2012 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/11/09/194983.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/194983.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/11/09/194983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/194983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/194983.html</trackback:ping><description><![CDATA[<div>水题就不说了囧&#8230;&#8230;<br /><br />【1】Oct.30 TYVJ <a title="&#8220;扫地&#8221;杯III NOIP2012模拟赛 day1" href="http://new.tyvj.cn/Test_Show.aspx?id=1123">&#8220;扫地&#8221;杯III NOIP2012模拟赛 day1</a><br />（本沙茶这个其实木有参加，是之后捉的&#8230;&#8230;还好AK了囧&#8230;&#8230;Orz liouzhou_101！！）<br />第一题：<br />若n=1，则只有当y=x*x时才有唯一解x（这个一定要特判）；<br />若n&gt;1，由柯西不等式得(a<sub>2</sub><sup>2</sup>+a<sub>3</sub><sup>2</sup>+...+a<sub>n</sub><sup>2</sup>)(1+1+...1（n-1个1）) &gt;= (a<sub>2</sub>*1+a<sub>3</sub>*1+...+a<sub>n</sub>*1)<sup>2</sup>，<br />即(n-1)(y-a<sub>1</sub><sup>2</sup>)&gt;=(x-a<sub>1</sub>)<sup>2</sup>，当且仅当a<sub>2</sub>~a<sub>n</sub>全部相等时等号成立。<br />显然a1的最大、小值一定是零点，也就是求方程(n-1)(y-a<sub>1</sub><sup>2</sup>)=(x-a<sub>1</sub>)<sup>2</sup>的解的问题，若&#916;&lt;0则无解，否则求两解之积，可用Vieta定理得出。<br /><br />第三题：<br />先求出最短路图（求出S到每个点的最短距离dist0[]和每个点到T的最短距离dist1[]，然后边&lt;i, j&gt;属于最短路图当且仅当dist0[i]+&lt;i, j&gt;长度+dist1[j]等于S-T最短路长），然后那些能炸掉的点就是最短路图的S-T割点（当然S、T本身不能算，另外，最短路图其实应该是个有向图，但这里当做无向图处理），只要对S、T所在的连通块做Tarjan即可。<br />注意这里最短路的求法：SPFA或许也能过，但由于其不稳定，在比赛的时候如果时间够的话还是写Dijk+heap吧囧&#8230;&#8230;<br /><br />【2】Nov.2 TYVJ <a title="「Clover 10」杯HE两校联赛(第二轮Day1)" href="http://new.tyvj.cn/Test_Show.aspx?id=1125">「Clover 10」杯HE两校联赛(第二轮Day1)</a><br />（这个也木有参加，是之后捉的&#8230;&#8230;另外说一下，第二题的题目描述与数据不符）<br />第三题：<br />正解见<a title="This_poet" href="http://thispoet.blogcn.com/articles/clover10-solution.html">This_poet</a>神犇的空间。<br />这里说一下本沙茶的方法（70分）：<br />设F[i][s]表示对X[1..i]进行设置，范围是[1..s]，且从1能够&#8220;走出去&#8221;（走到大于i的结点）的方案总数，这里有s&gt;i。<br />枚举&#8220;指出去&#8221;（X值大于i）的最小的结点为j（1&lt;=j&lt;=i），则有<br />F[i][s]=&#8721;(F[j-1][i] * (s-i) * s<sup>i-j</sup>)，1&lt;=j&lt;=i。<br />边界：F[0][i]=1（本身木有意义，在乘的时候作为单位元）<br />这很容易理解。j是要指出去的，因此i+1&lt;=X[j]&lt;=s，有(s-i)种；对于X[1..j-1]，由于j是指出去的最小结点，所以它们都不能指出去，X值范围1..i，但是它们必须&#8220;指出j-1"，就是走到j及其后面的部分，否则就会被困住，自然也就走不出去了，所以是F[j-1][i]；对于j+1..i，它们可以随便指，1&lt;=X值&lt;=S，因此是s<sup>i-j</sup>。<br />但是，这个递推式再也无法优化下去了，题目要求O(N<sup>2</sup>)显然无法办到。<br />而在正解中，<strong><span style="color: red">我们关心的不是从1能不能走出i，而是从1最远能走到哪里。</span></strong>这时列出来的递推式就很容易优化到O(N<sup>2</sup>)。所以，在递推和DP问题中，思路的不同，将会引发完全不同的结果，当一个递推式/转移方程无法优化下去的时候，可以换一个思路来求解。<br /><br />【3】Nov.3 TYVJ <a title="「Nescaf&#233; 29」杯HE两校联赛(第二轮Day2) " href="http://www.tyvj.cn/Test_Show.aspx?id=1126">「Nescaf&#233; 29」杯HE两校联赛(第二轮Day2) </a><br />第一题：<br />二分r，求出每个半圆能覆盖到的线段，再看这些线段的并是否为[0, x0]即可。问题就是求线段并的操作是比较易疵的。<br />首先将所有线段按照左端点递增排序，然后扫描每条线段，并记录目前线段达到的最右位置（就是右端点最大值）maxr，若某条线段的左端点大于前面的maxr则不能覆盖，扫描完了以后，再看第一条线段的左端点和所有线段的maxr是否符合要求即可。<br />但是，对于本题要注意：（1）由于有可能相离，因此最后的线段数可能不足N条，尤其要注意一条线段都木有的情况；（2）<span style="color: red"><strong>（极其易疵）题目只要求覆盖线段[0, x0]即可，因此，即使在x0右边发现了中断处（左端点大于前面maxr），也木有关系！！</strong></span>（本沙茶当时就在这里搞疵了，跪了2个点）；<br /><br />第二题：<br />本沙茶当时使用搜索骗的&#8230;&#8230;可是它的数据实在太弱，本该AC的（最后还是跪了一个点，原因是卡时：ZZZ = ?? / m0，忘了考虑m0=0的情况）；<br />首先求出图的每个连通块，如果某连通块内的所有结点初始权值之和不为零，无解。否则求出这个图的最小生成森林（用Kruskal），作为初始解（其实很多情况下这就是最优解囧）。<br />然后开始DFS，使用改变搜索顺序优化：先考查两端点权值都不为零且为相反数的边（因为转移之后可产生两个0点），再考查两端点权值都不为零且不为相反数的边（转移之后可产生一个0点，注意双向转移），最后考查两端点权值有一个为零的边（将0点转移，不会产生新的零点），其它的决策显然不明智。此外每条边只能转移一次。<br />当然直接这样搜肯定是要T的，但最优解会很快求出，因此可以卡掉。这题可以加启发函数，但本沙茶不加也木有事囧&#8230;&#8230;<br /><br />第三题：<br />递推式不说了。注意满足条件的树的高度的范围其实很小（&lt;=16），所以在找到高度上下界之后是不会T的。注意对于结果小于10^8的处理（不需输出多余的0），此时N&lt;=34；<br /><br />【4】Nov.5 VIJOS <a title="NOIP2012模拟赛第三弹" href="http://vijos.org/Test_Show.asp?id=1064">NOIP2012模拟赛第三弹</a><br />第一题：<br />容易证明，最优解中虫洞的左端点一定是最左的点。<br />二分最大距离dist，然后离最左的点距离&lt;=dist的显然都能走到，&gt;dist的则只能使用虫洞。设离最左的点距离&gt;dist的左起第一个点为S，则从S往右枚举每个点为虫洞右端点时，离S的距离和离最右点的距离是否都不大于dist，若都小于，则右端点可以在这里，dist符合条件。<br /><br />【5】Nov.7 TYVJ <a title="NOIP2012提高组模拟赛day1" href="http://www.tyvj.cn/Test_Show.aspx?id=1128">NOIP2012提高组模拟赛day1</a><br />全是水题，不说了。注意第二题是保留整数而不是四舍五入，第三题的&#8220;差&#8221;不是&#8220;差的绝对值&#8221;！！！！！！！！！！！！！！！<br /><br />【6】Nov.8 TYVJ <a title="「Poetize 10」杯NOIP2012提高组模拟赛day2" href="http://www.tyvj.cn/Test_Show.aspx?id=1129">「Poetize 10」杯NOIP2012提高组模拟赛day2</a><br />第一题：<br />首先要模型转化一下，题目就是：在一棵树上，每个结点都有一个权值，除根结点外，每个结点都有一个容量（这个容量在题目中是体现在父边上的），选定若干结点，使得树中除根结点外的每个结点子树中选定结点的权值之和都不大于其容量，问最多能选多少结点。<br />由于数据范围小，本沙茶用类似树形背包的DP硬搞掉了，其实是可以贪心的囧&#8230;&#8230;将结点按权值递增排序，每次选择一个所有祖先容量全部足够的权值最小的结点，最后得到的一定是最优解。<br />证明：由于决策之间不互相影响，最优子结构性质显然满足，下证贪心选择性质。设目前所有祖先容量全部足够的权值最小的结点为A，某方案中权值比A小的结点的选定情况（就是之前的状态）与选A的方案相同，但木有选A。设该方案中选定的权值不小于A且与A的LCA深度最大的结点为B，LCA(A, B)=P，由于B的权值不小于A，所以若将B删掉，A选上，其到根的路径上P及其以上的部分显然不会超过容量限制，对于P以下的部分，由于P是最深的LCA，因此P以下的部分根本木有被权值不小与A的结点所占用，因此肯定也不会有事，所以，将B删掉、A选上，将得到一个不比原方案差的可行方案，所以贪心选择性质满足。综上，贪心算法是正确的。<br /><br />第二题：<br />先将区间按照右端点递增排序，然后扫描：设目前区间的右端点为r，上一个区间的右端点为r0（这里忽略右端点相同的情况，即必有r&gt;r0），则在[r0+1, r]这一段里的最优解有两种可能：（1）若目前区间及其之后的区间内有左端点小于r的，则最优解为r；（2）若目前区间及其之后的区间的左端点全部不小于r，则[r0+1, r]这一段里各个值的能量总和均相同，为保证最小，最优解为r0+1。<br />接下来的问题是如何快速求出E=r或r0+1时的能量总和。显然在之前的区间里都不能获得能量，后面的区间内，左端点小于等于E的区间的能量为左端点的值，否则为E。由于前面的区间的右端点都小于E，左端点自然小于等于E，所以&#8220;后面的区间内，左端点小于等于E的区间个数&#8221;就是全部区间内左端点小于等于E的区间个数，这个可以在预处理中将所有左端点递增排序之后用二分查找得出，这些区间的左端点和值也可以记录一个S值来得出，而左端点不小于E的区间个数就是(该区间及其后面的区间总数-左端点小于等于E的区间个数)。<br />总时间复杂度O(NlogN)；<br /><br />第三题：<br />这个题真是折腾死人了囧&#8230;&#8230;其实做法很简单，但巨难想到&#8230;&#8230;<br />首先把待匹配字符串（设为A，匹配串设为B）展开成2倍的形式，所有的循环串就是所有长度为N的子串了囧&#8230;&#8230;<br />设F[i][j]为A（展开后的）第i个字符往前，<strong><span style="color: red">至少到哪</span></strong>才能与B[0..j]匹配（也就是所有能与B[0..j]匹配的A[k..i]中的k的最大值）。显然这样一说，转移方程就出来了囧：<br />若B[j]="*"，则F[i][j]=max{F[k][j-1], k&lt;=i}<br />若B[j]&#8800;&#8220;*&#8221;，则F[i][j]=F[i-1][j-1]（当A[i]=B[j]时）或-INF（当A[i]&#8800;B[j]时），注意边界：j=0时，B[j]必为"*"（根据下面的假设），此时F[i][j]=i+1（不是i！！为了后面的决策），而i=0时，若B[0..j]均为&#8220;*&#8221;则为1（不是0，同理）否则为-INF。<br />对于max{F[k][j-1], k&lt;=i}这里，显然可以用辅助数组搞定，注意辅助数组是要滚动的，否则会MLE（其实F也可以滚动）；<br />接下来，若B[0]="*"，则求出F之后只需要看对于每个i（i&gt;=N-1，N为原长），F[i][M-1]（M为B的长度）是否&gt;=i-N+1即可，因为前面的部分都可以用这个*干掉。<br />若B[0]&#8800;"*"，则将B最前面的不为"*"的部分拿出来，显然这里是要硬性匹配的，因此先求出这里能匹配A的哪些位置（KMP用不用都可以），B剩下的部分按照B[0]="*"处理，只是最后在找的时候只能找原来B前面硬性匹配的部分可以配上的位置。<br />若B里面木有"*"，就是普通的字符串匹配的问题了，直接特判掉（同样不必KMP）。这个比较容易漏掉。<br />总时间复杂度O(NM)。<br />
<div>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />大概也就这么多了囧&#8230;&#8230;以后就再也木有NOIP级别的模拟赛了&#8230;&#8230;真希望明年7月做NOI模拟赛也能像现在这样啊囧&#8230;&#8230;<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br /><span style="color: red"><strong>后记：模拟赛成绩这么好，最终还是挂了&#8230;&#8230;谁叫自己怕繁琐题呢囧&#8230;&#8230;</strong></span><br /></div></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/194983.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> 2012-11-09 21:36 <a href="http://www.cppblog.com/MatoNo1/archive/2012/11/09/194983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】最近的三次模拟赛总结</title><link>http://www.cppblog.com/MatoNo1/archive/2012/10/24/193769.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Wed, 24 Oct 2012 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/10/24/193769.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/193769.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/10/24/193769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/193769.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/193769.html</trackback:ping><description><![CDATA[和以前的总结一样，那些是人都会搞的水题就不写了囧&#8230;&#8230;<br /><br />【1】 Sept.29 <a title="「Poetize」杯NOIP模拟赛 VI" href="http://new.tyvj.cn/Test_Show.aspx?id=1106">「Poetize」杯NOIP模拟赛 VI</a><br />第一题（TYVJ P1962）：<br />枚举及其优化。<br />设F[i][S]为买的方案为S（用10位二进制表示）时，能不能表示出整数i（1&lt;=i&lt;=100），这个显然可以预处理出来，然后将所有的状态S按照&#8220;第一关键字为买的个数递增，第二关键字为题目中的T递增&#8220;排序。枚举时，只需要按照排序后的顺序从前到后枚举状态，找到第一个能表示出所有给出的整数的状态即可。最坏情况下是10000*1024*10，会T，但题目中木有这样的数据囧&#8230;&#8230;<br /><br />第二题（TYVJ P1963）：<br />DP，思想非常另类的那种&#8230;&#8230;<br />每秒只有三种可能状态：不进行(0)、准备进行(1)、进行(2)，且0的下一个状态是0或1，1的下一个是2，2的下一个是2或0，所以，假设时间是顺序的，设F[i][j][x]表示前i秒中状态1或2的有j秒，第i秒的状态是x的最大值&#8230;&#8230;（剩下的不说了，注意第一个状态必须是0或1）<br />下面考虑时间是环形的情况。可以发现，只要每两个相邻状态都满足&#8220;0的下一个是0或1，1的下一个是2，2的下一个是2或0&#8221;，就是合法的，不过，最后一个状态也有下一个状态：第一个（因为时间环形）。<br />如果N=B，则所有的状态都可以为1或2，只需要找到U值最小的那一秒，将它的状态设为1，其它状态设为2即可；（特判掉）<br />如果N&gt;B，则必然有状态为0，也就是可以从它开始。所以，时间仍然可以按照顺序的看待，只是注意若第一个状态是2，则最后一个状态不能是0&#8212;&#8212;将第一个状态为0、1的与为2的分开处理即可。<br />注意，N=0与N=1时需要特判。<br /><br />第三题（TYVJ P1964）：<br />为了描述方便，可以将这个序列在格子中表示，如下图，表示序列(3, 4, 5, 4, 6, 3)：<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/描述所用图片/TYVJ1964.jpg" width="313" height="303" /><br />设最终的序列中每个数都为S。以下起第S行为界，上方的黑格需要消去，下方的白格需要补上。由于题目中只允许每次对连续的一段加1或减1，也就是消去同一行连续的一段黑格或补上同一行连续的一段白格，所以，容易证明，此时的最少操作次数就是（下起第S行上方各行的连续黑格段数之和+下起第S行下方各行的连续白格段数之和）。因此，问题就是枚举S并维护这个和值。<br />首先，预处理算出S=0的和值。此时只有黑格段没有白格段。虽然行数很多，但本质不同的行最多只有N个，所以可以在O(N)时间内求出（当然先要进行一个O(NlogN)的排序）。具体求法就不说了囧&#8230;&#8230;<br />然后，考虑当S从0开始增加时，和值如何变化。显然，S从x增加到x+1，和值的增量是(第x行的白格段数-第(x+1)行的黑格段数)。由于每一行都是白段与黑段交替的，所以，若第x行与第(x+1)行本质相同，则和值增量只可能是1（第x行最左边和最右边的格子都是白的）或0（第x行最左边和最右边的格子一白一黑）或-1（第x行最左边和最右边的格子都是黑的）。第一个和最后一个格子的颜色只与最初序列中第一个和最后一个数有关，且必然下起一开始若干行都是-1，然后是0，再然后是1&#8230;&#8230;也就是和值一开始不断减少，然后不变，然后不断增加，那么，不变阶段的和值就是最小值，其长度就是最小值的个数；<br />问题是如果第x行到第(x+1)行发生改变肿么办。此时，必然在原序列中有元素值为x，只需要把它们所在的位置的颜色从黑的改为白的即可。注意，在维护段数的时候，需要考虑到该格的相邻的格子的颜色，还需要注意边界。这样的操作有N次，所以，时间复杂度是O(N)的。<br />综上，可以求出在每一个本质不变的行段内的最小值及其个数，取最小的即可。总时间复杂度为O(NlogN)（最初的排序）。<br /><br />【2】Oct.4 <a title="「Poetize」杯NOIP模拟赛 VII" href="http://new.tyvj.cn/Test_Show.aspx?id=1112">「Poetize」杯NOIP模拟赛 VII</a><br />第三题（TYVJ P1993）：<br />注意到任意一个数能一步变换到达的数最多9*10+C(10, 2)=135个，只需要枚举一下，然后用二分查找找出这个数在不在（不能用Hash，会扎堆），若在就连一条边，然后求这个图的s-t最短路即可，需要使用Dijk_heap（SPFA估计会被卡，注意手写堆，不要priority_queue）。这样对于题目中的数据可以卡线通过（最坏情况下仍然会T，估计正解是某种设计比较好的Hash）。注意，使用DL边表时，需要在空间上作一些优化，否则可能MLE。<br /><br />【3】Oct.20 <a title="Tyvj三周年邀请赛" href="http://new.tyvj.cn/Test_Show.aspx?id=1111">Tyvj三周年邀请赛 </a><br />第一题（TYVJ P2011）：<br />压位即可。<br /><br />第三题（TYVJ P2013）：<br />首先转移方程是很好搞的&#8230;&#8230;F[i]为前i个数的最大权值，则F[i]=max{F[i-1], F[j]+A[j+1]*B[i], 0&lt;=j&lt;=i-2}，边界：F[0]=F[1]=0。问题是如何优化。<br />首先，由于A、B序列木有单调性，一般的斜率优化是不行的囧&#8230;&#8230;<br />注意F[j]+A[j+1]*B[i]，当F[j]求出来之后，这个其实是一个自变量为B[i]的一次函数，也就是一条直线（斜率A[j+1]，纵截距F[j]），而且，由于B非负，所以这其实只是这条直线在y轴右侧的部分（射线！！）<br />本题需要维护的就是这些射线组成的下凸壳。注意，F数组是递增的，也就是插入的射线的纵截距递增。这样，插入射线y=A[j+1]*x+F[j](x&gt;=0)时，(0, F[j])这个点要么在原来的凸壳上（如果大于上一个F[j]），要么在原来的凸壳内部。<br />如果在内部，则这条射线与原来的凸壳最多只有一个交点，因此只需要从左到右扫描原来的凸壳的边（这些边除了最右一条是射线外，其余都是线段），将一开始的在待插入射线下方的边都删去，直到找到一条边与该射线相交或者所有部分都删去为止。若某条边与待插入射线相交，则删去它在待插入射线下方的部分，再插入新射线，否则直接插入新射线；<br />如果在凸壳上，那么新射线有两种可能：一是斜率不大于上一条射线的斜率，此时该射线完全在凸壳外或凸壳上，直接舍弃；二是斜率大于上一条直线的斜率，此时，把原来凸壳上最左的那条边删掉，再按照内部的情况处理即可；<br />求F[i]时，找到x=B[i]与凸壳的交点即可；<br />显然，这些边可以用一个栈来维护（本沙茶一开始以为是队列，写完了以后才发现是栈&#8230;&#8230;于是代码中按照队列的格式来写的囧&#8230;&#8230;），每条射线最多进栈一次，出栈一次，加上二分查找的时间，总时间复杂度O(NlogN)。<br />写的时候注意一些细节，尤其要注意的是，算出F[i]后不能马上插入射线i，而要在F[i+1]算出后才能插入，因为j&lt;=i-2！！（同样的，一开始也只能插入0，不能插入1）<br /><br />代码：<br /><a title="P1962" href="http://ideone.com/ghNhcX">P1962</a>&nbsp;<a title="P1963" href="http://ideone.com/PBIKCs">P1963</a> <a title="P1964" href="http://ideone.com/daKifx">P1964</a> <a title="P1993" href="http://ideone.com/T8Ad8p">P1993</a> <a title="P2013" href="http://ideone.com/P7GzIi">P2013</a>  <img src ="http://www.cppblog.com/MatoNo1/aggbug/193769.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> 2012-10-24 15:27 <a href="http://www.cppblog.com/MatoNo1/archive/2012/10/24/193769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】最近的模拟赛总结</title><link>http://www.cppblog.com/MatoNo1/archive/2012/08/31/188598.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Fri, 31 Aug 2012 10:05:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/08/31/188598.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/188598.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/08/31/188598.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/188598.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/188598.html</trackback:ping><description><![CDATA[最近参加了N多模拟赛&#8230;&#8230;现在统一总结一下。<br />那些有代表性的题目总结一下。<br /><br />（1）Aug.16 <a href="http://www.tyvj.cn/Test_Show.asp?id=1080"><font class="style1">Poetize 杯NOIP模拟赛 I</font></a><br />（竟然AK了，虐场虐得真爽）<br />第一题：容易发现如果新加入的那条边连接的是同一个连通块，结果乘2加1，如果是不同的连通块，结果不变。证明：如果新边(i, j)的是同一个连通块，则原来i到j必然有路径，设P为i到j的一条路径，则在加入新边以前，原图的所有满足条件的子图都可以对P异或后得到一个新的图，该图仅有i、j两个的度为奇数，其余点的度均为偶数，加入(i, j)之后得到一个新的满足条件的子图，所以乘2，注意(i, j)加上P也是一个满足条件的子图，所以加1；如果原来i和j不在同一个连通块中，那么必定不存在包含(i, j)的满足条件的子图（否则这个子图将(i, j)删掉后会得到两个顶点度数和为奇数的连通块，这是不可能的），所以不变；<br /><br />（2）Aug.17 <a href="http://www.tyvj.cn/Test_Show.asp?id=1081"><font class="style1">Clover 杯NOIP模拟赛 I</font></a><br />第一题：判断一个点是否在三角形（其实对于所有的凸多边形都是这样）时，不需要引射线，只需把三角形的三个顶点按逆时针排序，然后判断该点往三角形的三对相邻顶点（按逆时针）的叉积是否都非负就行了；<br />第三题：枚举起点，然后状态压缩DP，注意最后一个点必须压缩一下才能不MLE；<br /><br />（3）Aug.18 <a href="http://vijos.org/Test_Show.asp?id=1059"><font class="style1">Vijos复活邀请赛</font></a><br />第一题：比较WS的几何题。判断圆与边平行于坐标轴的矩形是否相交的时候，可以采用以下的简便方法：一个圆与一个边平行于坐标轴的矩形相交，当且仅当矩形的四个顶点至少有一个在圆内，或者圆的四个横纵坐标最值点（最上、最下、最左、最右的点）至少有一个在矩形内，或者圆心在矩形内。<br />第三题：主要难在s-t两条路径怎么找出来的问题，方法：以s为根建有根树，找到到t的路径后，将那条不在树中的边的两端点到根的路径上的所有边都标记上，然后，若这棵树中s-t路径上的所有边都没标记，则s-t只有一条路径，否则任选一条s-t路径上的标记边删掉，然后再以s为根建一次有根树，就可以找到第二条s-t路径了；<br /><br />（4）Aug.19 <a href="http://www.tyvj.cn/Test_Show.asp?id=1082"><font class="style1">[Vani有约会]杯邀请赛 II</font></a><br />第二题：本沙茶的80%做法有点另类，是状态压缩DP，因为对于N&lt;=800的数据，只有2、3、5、7、11、13、17、19、23这9个质数可能出现两次以上，其余的都只会出现一次，所以建立10个容器（别忘了1），分别分配1和这9个质数，再对剩下的质数状态压缩即可（一开始只建了9个容器，结果N=27挂了）；<br /><br />（5）Aug.20 <a href="http://www.tyvj.cn/Test_Show.asp?id=1083"><font class="style1">『Citric杯』NOIP提高组模拟赛 I</font></a><br />第一题：这也太太太坑爹了吧囧&#8230;&#8230;居然在精度上做手脚（Orz @sillycross），注意用long double就行了，不过正解是变除法为乘法；<br /><br />（6）Aug.21 <a href="http://www.tyvj.cn/Test_Show.asp?id=1084"><font class="style1">squarefk NOIP模拟赛</font></a><br />第三题：对于一个这样的序列A[0..N-1]：0&lt;=Ai&lt;=Ui，设F(A)为(A的0元素的个数)^(A的所有非0元素的乘积），问题就是求所有A的F值之积。显然，指数是不能取模的，所以要设F[i][j][k]为前i位j个非0，底数为k的值，递推式还是很容易的囧；<br /><br />（7）Aug.22 <a href="http://www.tyvj.cn/Test_Show.asp?id=1085"><font class="style1">Clover 杯NOIP模拟赛 II</font></a><br />第二题：问的是无向图中两点间是否有且仅有一条路径的问题。首先肯定是判是否在同一连通块，然后，对每个连通块任意建一棵生成树，如果这两点在生成树上的路径上的每条边都是桥，显然只有一条路径（因为每条边都必须经过），否则，必有其它的路径（某条边不是桥，也就是可以不经过），所以求桥之后就转化为了一个经典模型了囧&#8230;&#8230;注意求LCA用类似路径剖分的算法比较好写&#8230;&#8230;<br />第三题：很容易想到递推，F[i][j]：用i个布条，最后一个颜色为j，总方案数（下面的不解释了），问题是，如果至少有一种颜色能和两个或两个以上的颜色相配，还不会有事，因为结果一定不会超过log<sub>2</sub>(10<sup>18</sup>)，但如果每种颜色都最多只能和一种颜色相配肿么办？因此这个需要特判：首先那些不能和任何颜色相配的肯定只能长度为1，减掉，然后剩下的每种颜色开始的每个长度的旗帜都各有一个，除以颜色总数（上取整）即可。<br /><br />（8）Aug.23 <a href="http://new.tyvj.cn/Test_Show.aspx?id=1086">Poetize 杯NOIP模拟赛 II 暨Tyvj龙年七夕欢乐赛</a><br />（第一题正解是贪心，本沙茶用费用流乱搞，T了两个点）<br />第三题：A先mod B消去整数。首先考虑有限小数的情况。结果是有限小数时，设小数点后位数为M，则必有A*K^M mod B=0，显然这个方程有解的充要条件是B的每个质因数也都得是A*K的质因数，只要把B的质因数当中减掉A的，再看看剩下的质因数K是不是都有，都有的话剩下的就是乱搞一下了囧&#8230;&#8230;如果不都有说明是循环小数，设混循环部分位数为M，循环节位数为R，则有A*(K^(M+R)-K^M) mod B = 0，整理得A*K^M*(K^R-1) mod B = 0，注意K^M与(K^R-1)是互质的，也就是把B的质因数中减掉A的之后，剩下的每个质因数，要么就是K有，要么就是(K^R-1)有。这样，可以用类似于有限小数的办法来求出M，对于剩下的（K没有的）质因数，设它们的积（包含指数）为W，则必有K^R mod W = 1，K和W互质，根据欧拉定理，phi(W)必然是一个解，但不一定是最小正整数解，不过，可以肯定的是，最小正整数解一定是phi(W)的因数（不一定是质因数！！），因为若最小正整数解R0不是phi(W)的因数，设phi(W)=P*R0+Q（0&lt;Q&lt;R0），因为K^(P*R0+Q) = (K^R0)^P * K^Q mod W = 1，而(K^R0)^P mod W显然也是1，所以必有K^Q mod W=1，这样就得到了一个比R0还小的正整数解Q，这与R0是最小正整数解矛盾。因此，枚举phi(W)的因数，再用快速幂判断即可。<br /><br />（9）Aug.25 <a href="http://new.tyvj.cn/Test_Show.aspx?id=1087">『Citric杯』NOIP提高组模拟赛 II</a><br />第一题：这也太太太太太太太太太太太太太太太太坑爹了吧囧&#8230;&#8230;其实题目描述有漏洞的，因为题目中并木有说表示结束的询问一定是输入的最后一个&#8230;&#8230;<br />第三题：这题本沙茶的做法巨另类也巨繁琐（就当字符串算法的综合复习了囧&#8230;&#8230;），首先一头一尾两段的字符串还是很好找的&#8230;&#8230;结尾的那段直接枚举长度，开头的的那段可以在整个字符串左边用一个类似KMP的办法搞（其实只要知道KMP的原理就能用它解决N多奇特问题了囧&#8230;&#8230;），难点在于中间的那段字符串，需要是一个长度为奇数的回文串。为了快速找出一段连续子串里最长的长度为奇数的回文串，可以设G[i]为以i为中心的最长回文串长度，这可以将整个字符串逆序一下后接在原串后面（注意中间要加一个未出现的字符），然后用后缀数组解决（经典模型）。注意在找最长回文串的时候不能直接求中间G[i]的最大值，因为可能延伸出去，正解是二分枚举这个长度，然后在中间不会延伸出去的那一段里找G的最大值，看是否符合要求。总时间复杂度O(NlogN)。<br /><br />（10）Aug.26 <a href="http://www.rqnoj.cn/Test_Show.asp?TID=43">RQNOJ2012年八月月赛</a><br />第二题：比赛的时候本沙茶用单调队列硬搞搞不出来，后来写朴素了（悲剧）&#8230;&#8230;正解是将所有的前缀和按照先值递增，再下标递减排序，并串成Dancing Link，然后从按下标从大到小依次删掉每个前缀和，这样，每个前缀和左边的那个一定是比值比它小的前缀和中值最大（值相同则下标最小）的那个，剩下就不解释了囧&#8230;&#8230;<br /><br />（11）Aug.28 <a href="http://new.tyvj.cn/Test_Show.aspx?id=1088">「Clover」杯NOIP模拟赛 III</a><br />第三题：先把每条无向边拆成两条有向边，然后对这个有向图求源点为1的单源最短路径图（就是由所有满足D[i] + W&lt;i, j&gt; = D[j]的边&lt;i, j&gt;组成的图），显然从这个图的点1开始无论怎么走都是最短路径，而且这个图显然是无环的（因为原图中的每条边权值都是正数，说实话，如果不满足这个条件，这题就巨难做了，至少本沙茶不会做了），题目中要求的树就是在这个新图中从点1开始的一棵外向树，由于这个新图无环，所以只需要将每个点（除了1）都找一个父结点就行了，结果就是除1外的所有点入度之积。<br /> <img src ="http://www.cppblog.com/MatoNo1/aggbug/188598.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> 2012-08-31 18:05 <a href="http://www.cppblog.com/MatoNo1/archive/2012/08/31/188598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>