﻿<?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-随笔分类-CTSC</title><link>http://www.cppblog.com/MatoNo1/category/19297.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Thu, 08 May 2014 15:01:28 GMT</lastBuildDate><pubDate>Thu, 08 May 2014 15:01:28 GMT</pubDate><ttl>60</ttl><item><title>CTSC2014题目的各种乱搞方法 &amp;&amp; 感想</title><link>http://www.cppblog.com/MatoNo1/archive/2014/04/30/206782.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Wed, 30 Apr 2014 15:25:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2014/04/30/206782.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/206782.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2014/04/30/206782.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/206782.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/206782.html</trackback:ping><description><![CDATA[@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
Day1 random：<br />
首先基本方法是矩乘&#8230;&#8230;xor可以转化为mod 2意义下的加法操作&#8230;&#8230;<br />
直接矩乘O(N<sup>3</sup>logK)，需要优化&#8230;&#8230;<br />
由于mod 2，矩阵中所有的元素都是0或1，于是可以压位，设压w位，则时间复杂度变为O(N<sup>3</sup>logK/w)&#8230;&#8230;<br />
其实还可以继续优化。<br />
在mod 2意义下，乘法相当于and，加法相当于xor&#8230;&#8230;假设某次待乘的两个N*N矩阵分别为A和B&#8230;&#8230;<br />
先对A的每一行进行分段，每w位一段，然后这一段在进行矩乘的时候，实际上是对B的每个w*32的块，都将该块对应的若干行（这一段值为1的位置对应的那些行）取出并整体xor&#8230;&#8230;<br />
因此可以一开始就对B进行分块，每块大小为w*32，每块计算出对于每个w位二进制数对应行的xor和&#8230;&#8230;<br />
这样两个矩阵相乘的总时间就是O(N<sup>3</sup>/w/32)了囧&#8230;&#8230;（A中一共N<sup>2</sup>/w段，每段在B中乘N/32块，每段和每块的相乘结果可以直接在预处理记录的xor和里面调，是O(1)的）<br />
预处理时间显然是O(N<sup>2</sup>/w/32*2<span style="font-size: 12px;"><sup>w</sup></span>)，w=logN时两者平衡&#8230;&#8230;<br />
这样很明显可以卡过去N=1000，K=10<sup>9</sup>的那些点（w取10），N=2000的或许也可以卡过去囧&#8230;&#8230;<br />
<br />
Day2 crypto：<br />
N=50的，由于p大，直接随机53~58个方程，解方程组，有解的就认为是答案囧&#8230;&#8230;<br />
N=60的，基本思想是通过碰撞（两个方程xor）消去某些未知数，然后当未知数个数较小时暴力枚举验证&#8230;&#8230;<br />
@fanhq666 在讲题的时候，说进行两轮碰撞，第一轮消去第41~60个未知数，第二轮消去第21~40个，然后暴枚&#8230;&#8230;<br />
优化：这样在两轮之后其实是对4个方程合并后的结果，正确率严重降低，可以直接取3个方程碰撞消去40个（也可能&gt;40个，减少枚举量）未知数，这样正确率就木有那么惨不忍睹了囧&#8230;&#8230;<br />
<br />
Day2 numbers：<br />
基本方法：手打前若干个数字，后面的进行比对，选那个最像的（其实这样正确率并不能达到最高，可以取前10像的，看哪个数字最多，或者加入其它的一些估价&#8230;&#8230;）<br />
这样正确率可以达到约0.9&#8230;&#8230;<br />
为了进一步提高正确率，可以找出那些出错的数字，看都是将什么判成了什么&#8230;&#8230;<br />
结果是，4和9、7和9、3和5、某些1和8、某些1和2等易出错&#8230;&#8230;<br />
因此可以针对这些继续优化&#8230;&#8230;比如对4和9设计更精细的估价函数，按每列拆分，可以确定上方的开口大小，然后取开口前若干小的为9，其它为4&#8230;&#8230;<br />
<br />
（未完待续）<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 />
一些感想：<br />
<br />
我的OI生涯就这么结束了&#8230;&#8230;<br />
没能参加IOI，真的很遗憾&#8230;&#8230;<br />
但是像我这样的沙茶，除了提交答案和某些乱搞题外几乎木有任何优势，要是进了队，很明显是给中国丢脸啊囧&#8230;&#8230;<br />
<br />
CTSC的这几天，我和HN、ZJ的神犇进行了充分细致的交流&#8230;&#8230;毕竟这是大学前最后一次和他们见面的机会了&#8230;&#8230;<br />
从这个交流当中感受到了很多东西&#8230;&#8230;<br />
首先当然是和他们讨论各种问题的过程中，他们告诉我的那些新思想和新方法&#8230;&#8230;当然在他们的论文中也有体现&#8230;&#8230;<br />
真是太神了&#8230;&#8230;我为什么就一直没想起来这些呢囧&#8230;&#8230;<br />
还有就是他们在一起讨论问题时的热烈的场景&#8230;&#8230;原来那些新思想都是在这里出现的，只要一人想出来，大家都知道了囧&#8230;&#8230;<br />
想起我平时有多么孤独&#8230;&#8230;这样的场景只能在比赛时经历&#8230;&#8230;<br />
众多神犇在一起，每人都可以从别人那里获得动力，以及获得各种有用的资料&#8230;&#8230;<br />
而我这样的沙茶，本来就很弱，被神犇们鄙视，又木有好的资料来源，自然也缺乏动力了&#8230;&#8230;<br />
<br />
这些因素加在一起的效果，就是我进步的速度明显比他们慢，明显跟不上时代&#8230;&#8230;<br />
回想起从2008年7月以来的这些日子&#8230;&#8230;<br />
前两年不用说了，学习的都是最基础的东西（这些东西在强省都是几个月解决的事，而我用了两年，已经明显落后）&#8230;&#8230;<br />
后面，虽然各位神犇给我提供了一些榜样作用，但是这种作用效果还是太差&#8230;&#8230;<br />
我仍然需要几乎完全靠自己的努力来解决那些巨可怕的问题&#8230;&#8230;<br />
当2011年LCT、各种分块开始烂大街的时候，我还在写线段树、splay tree的模板&#8230;&#8230;<br />
当2012年SAM出现的时候，我还在写一般的SA&#8230;&#8230;<br />
当2013年cdq-gyz分治等各种诡异的思想出现的时候，我还在写动态树的模板&#8230;&#8230;<br />
总是跟不上时代，以至于我相对于其他人变得越来越弱&#8230;&#8230;<br />
用比他们更多的时间，收益却远远小于他们&#8230;&#8230;<br />
每一次听到一道题是ZJ、HN等的资料题、模拟赛题等原题时，就有一种想哭的冲动&#8230;&#8230;<br />
<br />
我曾经不止一次地想过，假如我生在ZJ或HN，或者小时候转移到了那里&#8230;&#8230;<br />
这几年的生活会肿么样呢&#8230;&#8230;现在会是什么样呢囧&#8230;&#8230;<br />
不用为了需要一篇论文或者一道题，在google、baidu、citeseerx等上面到处找，找了很久无果&#8230;&#8230;<br />
不用在看知识点或题解时，面对无论如何也搞不懂的部分，急得想撞墙，也木有用&#8230;&#8230;<br />
不用为了一道难题的解决折腾几天，可能几分钟讨论一下就完事了&#8230;&#8230;<br />
不会在比赛后讨论时，别人说到一种很熟悉的方法，自己却从未想到过也从未听说过&#8230;&#8230;<br />
不会每天都在痛苦中度过，却一直跟不上时代，越来越弱&#8230;&#8230;<br />
弱省之所以弱，也就是因为这些原因吧囧&#8230;&#8230;
<div>（听说AH已经连续6年无国家队了，各科国家队都木有&#8230;&#8230;这不奇特，看看AH这环境，将来要有，只能说那个人太高能了囧&#8230;&#8230;至少现在还木有这么神的人&#8230;&#8230;）<br />
当然，我不能改变自己所处的环境，只能在这种环境下选择尽可能优的行动&#8230;&#8230;<br />
<br />
我希望能有一个更加精彩的人类智慧时代&#8230;&#8230;<br />
<br />
cong 国家队：一出现就能使人吓傻的鼎爷、xyz大爷；压位帝+乱搞帝+人类智慧之神 sy菊苣；几何帝花神。<br />
今年中国队应该可以延续辉煌了囧&#8230;&#8230;<br />
Orz @法法塔 @vfleaking @matthew99等神犇
</div><img src ="http://www.cppblog.com/MatoNo1/aggbug/206782.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-04-30 23:25 <a href="http://www.cppblog.com/MatoNo1/archive/2014/04/30/206782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CTSC2012总结</title><link>http://www.cppblog.com/MatoNo1/archive/2012/05/09/174363.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Wed, 09 May 2012 14:58:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/05/09/174363.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/174363.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/05/09/174363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/174363.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/174363.html</trackback:ping><description><![CDATA[【首先热烈祝贺一下进入国家队的神犇：<br /><strong><span style="color: red;">chnlich</span><br /><span style="color: red;">sevenkplus</span><br /><span style="color: red;">zw7840<br />plokzfadai<br />（</span><span style="color: red;">雅礼再次屠场</span><span style="color: red;">不解释)</span></strong><br />也祝贺一下虽然未能进入国家队，但已经足够虐爆全场的神犇：<br /><strong><span style="color: red;">WJMZBMR<br />s-quark<br /></span></strong><div><strong><span style="color: #ff0000;"></span><span style="color: red;"></span><span>】</span></strong></div><br />CTSC2012得出的最主要的几条道理：<br /><strong><span style="color: red;">（1）实力强</span><font class="UNICODE"><span style="color: red;">&#8800;比赛成绩好，实力弱</span></font></strong><font class="UNICODE"><strong><span style="color: red;">&#8800;比赛成绩差；</span><br /><span style="color: red;">（2）现在所有的比赛都不是比谁得分多，而是比谁丢分少；</span><br /><span style="color: red;">（3）每个人都会遇到颓废、迷茫、进步慢的时期，关键是如何寻求出路，以及如何通过自己与外界共同的力量来解决；</span><br /></strong><span>（4）在将某个东东讲给别人之前，首先要考虑一下自己是否熟练掌握了这个东东；</span><br />（5）在分析问题，解决问题的过程中，可以通过很多另类的途径，找到又好想又好写的办法。<br /><br />部分总结：<br />【一试】<br />showhand：<br />可以将所有的牌型（C(52, 5)=2598960种）全部存储起来，按照题目中的规则进行排序，存储在一个线性表里，然后，枚举A的所有可能的牌型，从上面的线性表中找到比A大且不和A共用同一张牌的方法总数，可以使用容斥原理（方法：设F[i][t]为牌型i及比i大的牌型中，与i共用牌的属性压缩值为t，0&lt;=t&lt;=31表示5位二进制数，对应位为1表示与i共用，0表示不共用）。而对于B的某些牌一开始就被定死了的情况，用求出的F类似办法也可搞；<br /><br />shortest：<br />很好的一道提交答案题。<br />先说一下各个测试点的特点：<br />点1：N&lt;=20，K=10，从1到N的最长路径若要成为最短路径，需要删掉至少11条边；<br />点2~3：N、M较大，K较小（分别为20和10）；<br />点4：N&lt;=20，边可以想肿么删就肿么删；<br />点5~7：原图分为若干块，每块的点数相等且较小（分别为20、10、10），相邻两块之间有唯一的一条边相连，点5的边可以想肿么删就肿么删，点6、7删边有限制；<br />点8：是一个完整的100*100的网格，边权均为1，从左上角走到右下角；<br />点9：是一个2*1000的网格，中间随机删掉了约20条边，边权是随机值，从左上角走到右下角；<br />点10：图中存在一条从1到N的链（称为主链），附加了一些边，边可以想肿么删就肿么删。<br />解决办法：<br />点1：搜索（当然，状压求出最长路+将这11条边列出来，枚举保留哪条边，可以得到一个仅比最优解小1的解）；<br />点2、3：贪心+随机化（每次找一条从1到N的最短路，从中随机删掉一条边，这样做K次就得到一个方案，然后多次随机化后取最优方案即可；对于点2，随机几千次就能找到最优解了，对于点3，RP好的话需要随机1000W次，RP差的话可能需要上亿次，估计总共得耗掉1h以上，因此得早写）；<br />点4、5：状压DP；<br />点6、7：块内状压（当然由于只有10，暴搜也可），块之间DP（设F[i][j]为前i块删掉j条边的最优解&#8230;&#8230;）<br />点8：直接构造&#8230;&#8230;（可以构造出一个只有一个点走不到的方案，且可以证明不存在走完所有点的方案）；<br />点9：搜索/DP + 构造（具体的实现细节比较难搞啊囧）；<br />点10：这个是Hamilton路径问题，NPC的，因此这个点根本木有办法搞囧&#8230;&#8230;（当然或许有某些经过优化的搜索能较快找到解）<br /><br />【二试】<br />cheat：<br />80分做法1：首先将所有的字符串拼在一起，中间依次用<strong><span style="color: red;">不同</span></strong>的分隔符隔开，然后对这个大串求后缀数组求出height，然后就很容易求得每个属于待查询串部分的位置i与模板串的最大LCP（直接正着扫一遍、反着扫一边即可，注意边界）长度，设为D[i]，接下来就是二分L然后DP了：F[i] = min{F[i+1]+1, F[j]}，其中0&lt;=i&lt;len，i+L&lt;=j&lt;=i+D[i]，边界F[len]=0，这个东东显然是可以用线段树优化的。总时间复杂度O(Nlog<sup>2</sup>N)；<br />80分做法2：可以发现，对于同一个待匹配串，随着i的减小，(i+D[i])是不增的，因为D[i]最多比D[i+1]大1&#8230;&#8230;这样可以用单调队列进行优化，而不需使用线段树，总时间复杂度降为O(NlogN)，但是由于后缀数组常数过大，还是只有80分囧&#8230;&#8230;<br />100分做法：将后缀数组改为后缀自动机（详见WJMZBMR空间）&#8230;&#8230;<br />（另外讲题的时候某神犇说可以把后缀数组的长度减半，从而结合单调队列得到90分，不过本沙茶木有理解到底是肿么搞的囧&#8230;&#8230;）<br /><br />rev：<br />点1~2：N=1或M=1，可以暴力搞（要开-O2啊啊啊啊啊啊啊啊啊啊&#8230;&#8230;否则慢死）<br />点6：整个矩阵从左到右、从上到下都严格递减，只要满足坐标限制的都是逆序对，可以直接计算得到；<br />点7：只有5和9，且相邻的两个格子分别是5和9（其实可以把5和9看成0和1，相当于黑白染色），可以通过枚举不同情况分类讨论计算得到；<br />点8、9：N=M=1000，询问的区间都是从顶到底的，可以通过预处理得到一个O(N<sup>2</sup>M)近似暴力的算法，在约5min内跑出（开-O2）；<br />点10：N=M=80，随机数据，可以直接暴力递推得到；<br />点3~5就比较难搞了，本沙茶至今木有搞懂囧&#8230;&#8230;<br /><br /></font><img src ="http://www.cppblog.com/MatoNo1/aggbug/174363.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-05-09 22:58 <a href="http://www.cppblog.com/MatoNo1/archive/2012/05/09/174363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>