??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美大色视频,午夜精品久久久99热福利,欧美在现视频http://m.shnenglu.com/sdfond/category/12472.html世事z明皆学问,人情l达x?/description>zh-cnWed, 21 Apr 2010 10:56:52 GMTWed, 21 Apr 2010 10:56:52 GMT60环上的高斯消元问?http://m.shnenglu.com/sdfond/archive/2010/02/06/107393.htmlsdfondsdfondSat, 06 Feb 2010 10:07:00 GMThttp://m.shnenglu.com/sdfond/archive/2010/02/06/107393.htmlhttp://m.shnenglu.com/sdfond/comments/107393.htmlhttp://m.shnenglu.com/sdfond/archive/2010/02/06/107393.html#Feedback1http://m.shnenglu.com/sdfond/comments/commentRss/107393.htmlhttp://m.shnenglu.com/sdfond/services/trackbacks/107393.html  高斯消元法适用的两U情况ؓ(f)域上的问题和环上的问题。域上的问题是可以通过加减乘除把系数阵化简成ؓ(f)对角U全1的Ş式,是允许有除法的,一般用于QҎ(gu)的高斯消元。而环上的问题一般涉?qing)整C?qing)取模,除法是不允许的,此外环上的问题一般都要涉?qing)高斯消元的一个比较难处理的问题:(x)无穷解问题?br>
【问题分析?br>  首先考虑比较单的环上的问题:(x)?问题Q这c问题的l典代表是开关灯问题。其实这c问题可以允?dng)R法(用异或代替)(j)Q每ơ消元的时候如果出C定的变量,那么跌当前列,保持行不变,l箋消元。当消元q后?x)出现的问题是,如果pL늚U小于增光矩늚U,那么无解Q或者不是所有的变量都已l取|Dq个的原因一个是消元时出现全0列,一个是pL늚U等于增光矩늚U且于未知数的个数Q也是出现无穷解。在?域上出现无穷解的时候只需枚D每个不确定变元的|0?Q,一般是用来扑ֈ一个最优解。这里一个比较y妙的Ҏ(gu)是保留消元过E的对角矩阵Q这样一旦确定了(jin)未知敎ͼ直接回带找解Q无需重新建立方程?br>  模n域上的无I问题更ؓ(f)复杂一些。一个是变元的取D围变大了(jin)Q?到n-1Q某些问题取D?x)是负的Q,另一个问题是׃模n未必是素敎ͼ如果是素数存在解׃定唯一Q不是素数的话会(x)出现多组解,q得l箋枚D才行。以几个题目ZQ?br>  POJ 2947 Widget FactoryQ这是环上问题的基础版,考察?jin)对于变元数和方E数不确定的时候对方程解数的判断方法。消元的q程q是很简单的Q细节考虑清楚可以了(jin)?br>  POJ 1395 Cog-WheelsQ方E的建立很y妙,׃数的范围很小Q?00以内Q,因此可以Ҏ(gu)每个质因数的q次建立方程Q对每个轮子除以最的那个数后可以进行质因数分解Q方E数很少Q最后徏立的是一个整pL方程。不q这里的问题是由于存在无I的情况,要搜索;而且变量的取D围不太好把握Q我是取增广늚所有系数的最大值maxQ把枚D的界定在?jin)|max|以内Q有点像扩展Ƨ几里d的思想Q如果有x、y满ax + by = dQ那么x上下动b个,y上下动a个依然方E成立。另外注意的是徏立方E的时候会(x)产生齐次方程Q要特别判断一下。总而言之这个题目写h很恶?j),复杂度感觉巨高,但是实际q行速度很快?br>  POJ 2055 Kid's ProblemQ这个题目BTE度又进?jin)一步,是个模线性方E组Q不仅可能存在无IQ而且模不一定是素数Q对于确定的变元取g?x)很多,M是各种搜烦(ch)。不q这个题目很无聊的一Ҏ(gu)在消元过E中Q之前我一直是取要消元的两个系数的最公倍数Q分别放大然后再减去Q就像分数通分的做法,做其他的题目都没有问题(因ؓ(f)没有影响解的情况Q;但是q个题目q样居然?x)超Ӟ当然不是时在高斯消元的q程Q而是之后枚D的过E。这个题目必d用那U类似求gcd的方法,两个方程互相减来减去Q因个题目数据取D围太了(jin)Q?0以内Q,因此q样做的复杂度也不高。这两种做法的唯一区别是后者消元后的对角阵中,d角线的系数很(减来减去减得很小Q,而用“通分”的方法系C(x)保留为原pLQ可能很大)(j)Q虽然最后计的l果完全相同Q但是可能后者能够快速得C个好的可行解Q利用这个剪掉了(jin)不少冗余情况Q而前者也许差?jin)一些,p时了(jin)?br>  Ural 1561 Winnie the PoohQ应该是高斯消元问题的终极版本了(jin)Q考察的是寚w斯消元的理解Q不q没有在方程的徏立上讄太多的坎Q。这个题目可以归lؓ(f)包含若干操作的动态高斯消元问题:(x)d一个变元,d一个方E,询问l定方程解的情况。因Z是询问方E组的解Q而是询问方程的解Q这L(fng)话有可能虽然有多l解但是最后对应方E的值是相同的。我一开始采用枚举方E的取值判断有解的Ҏ(gu)Q超时了(jin)Q后来改成出C定解的时候搜索判断解的情况,依然时。这两种Ҏ(gu)的复杂度都达到O(n ^ 3)以上Q所以需要好的办法。仔l思考之后发玎ͼ如果方程有解且唯一Q那么它一定和已经存在的方E组Q看成是向量Q是U性相关的Q这L(fng)话可以每ơ添加方E都l护对角阵,对于一ơ询问,利用已有的方E组依次对给定的方程消元Q到最后判断这个方E的pL是否?Q如果是的话解个模方E就行了(jin)Q如果不是的话说明这个方E的取g(x)有很多种情况。每ơ添加方E都判断是否产生矛盾Q无解)(j)Q如果无解以后不再判断,一直输出无解。利用这U方式可以很快的处理查询Q每ơ复杂度才O(n ^ 2)?br>
【问题ȝ?br>  环上的高斯消元问题应用比较广泛,但是~码的复杂度也比较高。此外,不同的题目往往要求各异Q因此也没有l一的模板,需要根据题目的要求来编写程序。通过以上几个题目的练?fn),对于高斯消元的求解已l没有太大的问题?jin)。但是题目中方程的徏立以?qing)优化求解依然是隄Q需要不断地U篏和ȝ?

注:(x)本文作于2009q???0Ҏ(gu)


sdfond 2010-02-06 18:07 发表评论
]]>
SPOJ 2154 Kruskalhttp://m.shnenglu.com/sdfond/archive/2010/02/06/107365.htmlsdfondsdfondSat, 06 Feb 2010 01:04:00 GMThttp://m.shnenglu.com/sdfond/archive/2010/02/06/107365.htmlhttp://m.shnenglu.com/sdfond/comments/107365.htmlhttp://m.shnenglu.com/sdfond/archive/2010/02/06/107365.html#Feedback0http://m.shnenglu.com/sdfond/comments/commentRss/107365.htmlhttp://m.shnenglu.com/sdfond/services/trackbacks/107365.html  猴子和Kruskal玩一个取矛_游戏Q给定n堆石子,n不大?00Q每堆石子的个数大于2于2 ^ 32Q双方轮取子,每次可以从一堆中取最多k个,当一方取完石子后某堆矛_的个数是素数的话那么当前玩家莯。问猴子是否有必胜策略?br>
【题目分析?br>  q是一道BT题,中间讄?jin)许多trick。开始对题意没有完全理解Q错?jin)很多次Q后来找来了(jin)数据Q才发现?jin)问题?br>  题目中描q的莯{略是:(x)"A player wins if after his move the size of some heap is a prime number."q句话乍一看以为是取完矛_后剩下的矛_个数是素数的时候就莯Q其实还隐藏着另一U可能:(x)如果多堆矛_个数是素敎ͼ当前玩家无论怎样取都能获胜,因ؓ(f)在他取完之后Q其他堆的石子个数是素数Q也满莯条g?br>  接下来考虑一般情c(din)这个题目是限制中间状态的Nim游戏Q也是_(d)对于一堆个Cؓ(f)n的石子而言Q它的SG值取决于于n的最大素数。注意这里题讑֏有了(jin)一个小trickQ题目说明了(jin)需要取1到k个,如果当前矛_个数本n是素敎ͼ当然是没用的Q因此是于n的最大素数。设于n的最大素数是p(题目中说明了(jin)矛_个数大于2Q因此p一定存?Q那么可以在k步以内到达p的一定是必胜态,而且是直接获胜,需要在输入的时候特?q一炚w要注意,在解决限制中间状态的Nim游戏时一般都需要特?。然后就是p + k + 1q个状态,因ؓ(f)它可辄状态全是必胜态,因此它是必|态,SGgؓ(f)0。现在考虑大于p + k + 1的状态,问题出来?jin)。以p + k + 2q个状态ؓ(f)例,因ؓ(f)它可以到达p + 2 ... p + k + 1q些状态,因ؓ(f)p + 2 ... p + k都是直接莯状态,如何判定他们的SG值呢Q如果假讑֮们的SG值是1Q那么p + k + 2q个状态的SG值应该是2。但是思考一下SG值的定义Q它是定义在一个DAG上的Q所有的状态最后都是可以在有限步内转移到终止?必|?。但是p + 1 ... p + kq些状态都转移C(jin)pq个状态上Q我们肯定不能认定p状态是l止态,因此仅仅凭借p + 1 ... p + kq些状态是必胜态就单的把它们的SGD?是不恰当的;q些限制状态和以前的题目还不同Q这些限制状态都不能转移到终止态上Q但是由于题目的要求Q它们又都是必胜态,因此把它们的SGD为无I大更合适些?br>  仔细思考一下带限制状态的SG游戏Q可以发玎ͼ它们和一般的SG游戏的区别在于,在分析一般的SG游戏的时候,对于一个状态图而言Q{Udl止态的时候ƈ不意味着游戏l束Q因为玩家可以通过走其他的状态图来保证是否达到必胜态;但是带限制状态的SG游戏Q限制的状态双斚w是不敢走的,因ؓ(f)一旦一方走入限制状态,另一方立刻获胜,游戏q止了(jin)。可以认为,只要走入限制态就相当于认输,对于双方玩家而言肯定都不?x)这样做Q因此这些限制状态就成了(jin)“ȝ?#8221;Q完全可以忽视这些状态(也就是说不存在到q些状态的转移Q。通过上述分析Q我们可以认定p + k + 2q个状态的SG值应该是1而不??br>  现在q个问题的做法就比较明朗?jin),对于每堆矛_Q去掉限制态的讨论后,变成了(jin)在集合{1...k}中选择元素的一个Subtraction GameQ它的SG值是?k + 1)循环的?br>  然后是求最q素数的问题?jin),q个没有好办法,只能暴力枚D。对于一个数nQ在sqrt(n)到n之间存在素数Q感觉应该是Q但是不?x)证Q,因此最多枚举sqrt(n)ơ就能找到解。但是每ơ枚丑ֈ素的复杂度还是sqrt(n)Qd杂度q是比较高,我在本地跑数据跑?U,交上去超时了(jin)QSPOJ的时?0U,q居然也时Q数据够变态)(j)。想?jin)很久也没有什么新的算法,无奈只能在判素上下点功夫Q直接把Miller-Rabin搞出来了(jin)Q速度提高C(jin)2U,仍然时。后来又加了(jin)一些常C的优化,l于q了(jin)?br>
【ȝ?br>  q个题目做了(jin)很长旉Q一斚w是审题不清,错了(jin)几次Q另一斚w是对于SG的理论理解的不够透彻Q想?jin)很久终于想明白了(jin);再有是优化法也花了(jin)很长时间。不q通过q个题目对于SG理论的理解又q了(jin)一步,感觉不错Q呵c(din)?

注:(x)本文作于2009q???9?7?br>


sdfond 2010-02-06 09:04 发表评论
]]>
l合游戏ȝ——基本博弈问?/title><link>http://m.shnenglu.com/sdfond/archive/2010/02/06/107364.html</link><dc:creator>sdfond</dc:creator><author>sdfond</author><pubDate>Sat, 06 Feb 2010 00:55:00 GMT</pubDate><guid>http://m.shnenglu.com/sdfond/archive/2010/02/06/107364.html</guid><wfw:comment>http://m.shnenglu.com/sdfond/comments/107364.html</wfw:comment><comments>http://m.shnenglu.com/sdfond/archive/2010/02/06/107364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/sdfond/comments/commentRss/107364.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/sdfond/services/trackbacks/107364.html</trackback:ping><description><![CDATA[<p>【概q?br>  最q的几次比赛Q博弈的题目一直不,而且博弈问题是一块比较复杂、庞大的内容Q因此在q里结一下,希望能够帮自q清一些思\Q争取也多来几个pdQ呵c(din)?/p> 竞赛中出现的l合游戏问题一般都满以下特征Q?br>    1. 二h博弈游戏Q每个h都采用对自己最有利的策略,q且是两个h轮流做出决策<br>    2. 在游戏中的Q意时刻,每个玩家可选择的状态是固定的,没有随机成分<br>    3. 游戏在有限步数内l束Q没有^局出现<br>  大部分的题目都满上q条Ӟ因此q里只讨论在上述条g范畴内的博弈问题。这cd弈问题,通常q有若干分类。一U是规定Ud最后一步的游戏者获胜,q种规则叫做<span style="color: red;">Normal Play Rule</span>Q另一U是规定Ud最后一步的游戏者输Q这U规则叫?span style="color: red;">Misere Play Rule</span>Q也UCؓ(f)Anti-SG游戏。此外,对于游戏的双方,如果二者博弈的规则相同Q那么称cL戏是<span style="color: red;">对等</span>(impartial games)的;否则UCؓ(f)<span style="color: red;">不^{游?/span>(partizan games )。当初WHU的那场比赛就是由于对于这个概念不是很清晰Q导致看完题目之后就用SG定理来做Q浪费了(jin)很多机时。实际上Q解决不q等博弈问题的方法和普通的博弈问题QSG游戏Q是有区别的Q一般会(x)采用动态规划或者surreal number?br><br>【博弈基知识?br>  在SG游戏中,最Zh熟知的是必胜必|态,也叫NP态理论。注意的是,P态对应的是先手必败态,N态对应的是先手必胜态。必胜必败态理论是Q?br>  1. All terminal positions are P-positions<br>  2. From every N-position, there is at least one move to a P-position<br>  3. From every P-position, every move is to an N-position<br>  英文的表q非常简z清晎ͼ而且q个理论也很好理解,如果在当前状态的下一步可以走到必败态,那么当前玩家可以走到那个状态,把必败态推l另一方;如果所有可辄态都是必胜态,那么当前玩家无论如何赎ͼ都会(x)把必胜态让l对斏V根据必胜必败态理论,我们可以递归的求出每个状态是N态还是P态。必胜必败态理论其实已l把博弈问题转化成了(jin)一个有向图Q借助图这个模型来分析问题Q得问题变得Ş象了(jin)许多。需要注意的是,q种SG游戏对应的有向图是无环的Q因为如果有环,那么游戏双方可能在环上不停的{换状态,游戏不能在有限步l止Q这样就不满组合游戏的特征3?jin)?br>  然而在很多时候仅仅知道某个状态是必胜q是必|是不够的Q因为如果存在多个组合游戏(比如l典的NimQ,对应的状态集合非常大Q无法直接利用必胜必败态理论求解,因此需要用到博弈论中一个很重要的工P(x)SG函数?br>  某个状态的SG函数值定义ؓ(f)当前状态所有不可达的状态编号中最的~号Q其中终止态的SG函数值是0。有?jin)这个工P引入一个非常强大的定理——SG分解定理Q?br><br>  <span style="background-color: #ffffff; color: red;">多个l合游戏的SG函数值是每个l合游戏的函数值的和?/span>Q这里的和定义ؓ(f)异或操作Q?br>  <br>  SG分解定理的证明不是很难,其实和Nim的证明很像。根据这个定理,我们q道ؓ(f)什么Nim的解法是异或所有的矛_个数?jin),因?f)每堆矛_的SG值就是石子的个数。SG分解定理告诉我们MSG游戏都可以{化成Nim游戏来做?br>  Nim中的一个变形就是拿走最后一块石子的人算输。通过修改SG的计规则,可以得出相同的结论(因ؓ(f)当石子个数是1的时候SGgؓ(f)0Q因此要单独处理Q;当然也可以利用一个叫做SJ定理的方法来做,依然是要处理当所有堆的SGg大于1的情c(din)?br><br>【博弈基本模型?br>  除了(jin)Nim模型Q很多模型都看似复杂Q最后都划归C(jin)Nim模型上,然后利用SG分解来做的。在证明两种模型{h(hun)的时候,可以通过计算SG值判断是否相同,或者通过判断必胜{略的走法将其{化ؓ(f)Nim。许多模型非常的奇Q其莯{略又千差万别,因此无法一一列DQ但是掌握一些经典模型是必须的,q样通过模型的{化可以简化问题的隑ֺ?br>  <span style="background-color: yellow;">l典模型1QNim变种?/span>包括Q?br>    (1) 楼梯Nim。把奇数台阶的石子作为NimQ二者等P因ؓ(f)必胜的策略是相同的?br>    (2) 每次可以取k堆,q个是经典的Moore Nim。它是泛化的Nim游戏?br>    (3) 两堆矛_Q每ơ可以取一堆或两堆Q从两堆取得时候个数必ȝ同,谁先取完莯。这个是著名的威佐夫博弈Q跟黄金分割数有养I具体证明不是很清楚,但是用SG值打表可以找?gu)律。代码如下:(x) <br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include </span><span style="color: #000000;"><</span><span style="color: #000000;">cstdio</span><span style="color: #000000;">></span><span style="color: #000000;"><br>#include </span><span style="color: #000000;"><</span><span style="color: #000000;">cmath</span><span style="color: #000000;">></span><span style="color: #000000;"><br>#include </span><span style="color: #000000;"><</span><span style="color: #000000;">algorithm</span><span style="color: #000000;">></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;"> </span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> std;<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> main()<br>{<br>    </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> </span><span style="color: #0000ff;">double</span><span style="color: #000000;"> k </span><span style="color: #000000;">=</span><span style="color: #000000;"> (sqrt(</span><span style="color: #000000;">5.0</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">) </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">2.0</span><span style="color: #000000;">;<br>    </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> a, b, t;<br><br>    </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d %d</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">&</span><span style="color: #000000;">a, </span><span style="color: #000000;">&</span><span style="color: #000000;">b) </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">)<br>    {<br>        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (a </span><span style="color: #000000;">></span><span style="color: #000000;"> b)<br>            swap(a, b);<br>        t </span><span style="color: #000000;">=</span><span style="color: #000000;"> b </span><span style="color: #000000;">-</span><span style="color: #000000;"> a;<br>        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (a </span><span style="color: #000000;">==</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(t </span><span style="color: #000000;">*</span><span style="color: #000000;"> k))<br>            puts(</span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>        </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>            puts(</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>    }<br><br>    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div> <br>    (4) Subtraction Games。一U通用的Nim游戏Q每ơ从可用状态集合中选择下一步的状态,有很多变形,核心(j)思想q是计算SG函数倹{?br>    (5) Take-and-Break Game。每ơ把局面分成多个Nim子游戏,利用SG分解定理求出对应的SG倹{?br>  <span style="background-color: yellow;">l典模型2Q翻币游戏(Coin Turning Game)</span><br>    (1) 一l的ȝ币游戏,每次可以?个或两个。通过单独考虑每个可以ȝ币发现QCoin Turning Game的SG值和Nim{h(hun)Q因此两个模型等仗需要注意的是,许多ȝ币游戏根据题目的要求Q一般编号从0开始?br>    (2) 一l的ȝ币游戏,每次可以?个或两个Q限定了(jin)ȝ二枚币的范_(d)那么和Subtraction Game{h(hun)?jin)?br>    (3) 一l的ȝ币游戏,每次可以?个?个或3个,q个游戏叫做Mock TurtlesQ有一个神奇的规律Q是Odious Number序列?br>    (4) 高维的翻币游戏Q需要用到NimU和Tartan定理?br>  ȝ币模型的变化更多Q很多模型都有一些奇妙的规律Q需要打表才能发现?br>  <span style="background-color: yellow;">l典模型3Q删Ҏ(gu)?Green Hackenbush)</span><br>    (1) ?wi)的删边游戏QColon原理证明q种模型和Nim依然是等L(fng)Q多个叉的SG值异或就是对应根节点的SG倹{?br>    (2) 无向囑ֈҎ(gu)戏:(x)利用Fursion定理收羃圈,然后p{换成?wi)的删边游戏了(jin),不过q个定理q不?x)证? <br><br>注:(x)本文作于2009q???09?3?br><br> <img src ="http://m.shnenglu.com/sdfond/aggbug/107364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/sdfond/" target="_blank">sdfond</a> 2010-02-06 08:55 <a href="http://m.shnenglu.com/sdfond/archive/2010/02/06/107364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU 3244 Difference between Tripletshttp://m.shnenglu.com/sdfond/archive/2009/07/14/89999.htmlsdfondsdfondTue, 14 Jul 2009 02:34:00 GMThttp://m.shnenglu.com/sdfond/archive/2009/07/14/89999.htmlhttp://m.shnenglu.com/sdfond/comments/89999.htmlhttp://m.shnenglu.com/sdfond/archive/2009/07/14/89999.html#Feedback0http://m.shnenglu.com/sdfond/comments/commentRss/89999.htmlhttp://m.shnenglu.com/sdfond/services/trackbacks/89999.html  定义两个三元lI(xi, yi, zi)和J(xj, yj, zj)Q他们的差ؓ(f)D(I, J) = max{xi - xj, yi - yj, zi - zj} - min{xi - xj, yi - yj, zi - zj}Q给定n个三元组Qn <= 200000Q,求Q意两个三元组的差的和?br>
【题目分析?br>  数据范围非常大,枚D必然不可Q需要数学方法。这个题目y妙之处在于,模型l过?jin)层层的包装Q要想一下子有想法还真不Ҏ(gu)。既然不能枚举了(jin)Q这个max和min操作׃好办?jin),应该设法L。max{a, b, c} - min{a, b, c} = |a - b| + |b - c| + | c - a| / 2Q这个公式应该不难想刎ͼ但是q只是第一步,因ؓ(f)引进?jin)绝对|依然不好做。可以先出分子Q最后再?。接下来需要一个等价变换,以a - bZQa - b = xi - xj - yi + yj = (xi - yi) - (xj - yj)Q同理把b - c、c - a都写成这UŞ式。这一步变换看g用不大,但是假设我们出所有的xi - yi之后Qi = 0... n - 1Q,其排序Q会(x)发现Q对于第i个xi - yiQ它前面的都比它?yu),后面的都比它大。而实际上Q由于求L两个三元l的差,肯定xi - yi?x)和L的xj - yj都作差的Q加?jin)绝对值后Q它Ҏ(gu)后的l果׃(x)贡献i?xi - yi)Qn - i - 1?(xi - yi)。同L(fng)Ҏ(gu)出所有的(yi - zi)?zi - xi)Q结果就能够求出来了(jin)。算法复杂度O(n * logn)?br>
【题目ȝ?br>  q是一道不错的题目Q首先考察?jin)公式的变ŞQ需要改写max - min操作Q之后的{h(hun)变换和排序的思想都非常值得借鉴?br>题目代码Q?br>
#include <cstdio>
#include 
<algorithm>
using namespace std;
const int N = 200010;

int x[N], y[N], z[N];
int main()
{
    
int n, a, b, c;

    
while (scanf("%d"&n) == 1 && n)
    {
        
for (int i = 0; i < n; i++)
        {
            scanf(
"%d %d %d"&a, &b, &c);
            x[i] 
= a - b;
            y[i] 
= b - c;
            z[i] 
= c - a;
        }
        sort(x, x 
+ n);
        sort(y, y 
+ n);
        sort(z, z 
+ n);
        
long long ans = 0;
        
for (int i = 0; i < n; i++)
            ans 
+= (2 * i + 1 - n) * (long long)(x[i] + y[i] + z[i]);
        printf(
"%I64d\n", ans / 2);
    }

    
return 0;
}


sdfond 2009-07-14 10:34 发表评论
]]>
PKU 1723 SOLDIERShttp://m.shnenglu.com/sdfond/archive/2009/06/25/88486.htmlsdfondsdfondThu, 25 Jun 2009 02:13:00 GMThttp://m.shnenglu.com/sdfond/archive/2009/06/25/88486.htmlhttp://m.shnenglu.com/sdfond/comments/88486.htmlhttp://m.shnenglu.com/sdfond/archive/2009/06/25/88486.html#Feedback0http://m.shnenglu.com/sdfond/comments/commentRss/88486.htmlhttp://m.shnenglu.com/sdfond/services/trackbacks/88486.html  题目大意是给定n个点的坐标(n <= 10000Q,问把q些点移动到一横行q且一个挨着一个(具体位置LQ的最移动步敎ͼ其中每次只能向上下左右移动一个坐标)(j)?br>  q个题目体现?jin){化的思想。首先考虑q样的问题:(x)一个数轴上有n个坐标,问把qn个坐标移动到一个点上最移动步敎ͼ其中每次Ud一个格子。根据中位数的定义,把所有坐标排序后Wn / 2个坐标是中位敎ͼ把所有坐标移动到q上面移动次数最。证明很Ҏ(gu)惛_Q因为如果不q样的话Q把目标坐标往左^U还是往叛_^U,势必造成左半部的坐标集体变化1Q右半部的坐标也集体变化1Q如果左叛_部坐标的个数不同Q那么显然就不是最优的?jin)?br>  接下来考虑题目Q题目中x和y的移动是孤立的,可以分开讨论。y的移动方法和上面讨论的情况一P现在考虑x的移动。x的移动要求最l是一个挨着一个的Qx排好序之后,假设最l所有点以x0为左端点依次排开Q对应的点分别ؓ(f)x0, x1...那么问题的答案就{于把这n个坐标依ơ对应的挪到x0到xn-1上的步数。如果我们把qn个目标点分别都移动到x0上,那么问题p{化成?jin)中位数问题了(jin)。考虑把xiUd到x0上,要花费i步,Z(jin)保证问题是等价变换的Q应该把xi在原坐标中对应的xi'也相应的向左Udi步,q样xi'Ud到xi的代价就是不变的。设xi'左移i步后的新位置是xi''Q那么问题就转化成:(x)把x0''到xn-1''qn个点UdC个坐标的最步敎ͼ用中位数的方法就可以做出来了(jin)?br>  q个题目的y妙之处在于把一个未知问题{化成一个已知问题。{化的思想在数学中用的很多Q应该多多练?fn)?br>
题目代码Q?br>

#include <cstdio>
#include 
<algorithm>
using namespace std;
const int N = 10010;

int main()
{
    
int x[N], y[N], n;

    
while (scanf("%d"&n) == 1)
    {
        
for (int i = 0; i < n; i++)
            scanf(
"%d %d"&x[i], &y[i]);
        sort(x, x 
+ n);
        sort(y, y 
+ n);
        
for (int i = 0; i < n; i++)
            x[i] 
-= i;
        sort(x, x 
+ n);
        
int ans = 0;
        
for (int i = 0; i < n / 2; i++)
            ans 
+= x[n-i-1- x[i] + y[n-1-i] - y[i];
        printf(
"%d\n", ans);
    }

    
return 0;
}


sdfond 2009-06-25 10:13 发表评论
]]>
HOJ 2565 高斯消元http://m.shnenglu.com/sdfond/archive/2009/06/10/87357.htmlsdfondsdfondWed, 10 Jun 2009 13:49:00 GMThttp://m.shnenglu.com/sdfond/archive/2009/06/10/87357.htmlhttp://m.shnenglu.com/sdfond/comments/87357.htmlhttp://m.shnenglu.com/sdfond/archive/2009/06/10/87357.html#Feedback0http://m.shnenglu.com/sdfond/comments/commentRss/87357.htmlhttp://m.shnenglu.com/sdfond/services/trackbacks/87357.html   q个题目做得好辛苦。题目大意是l三个算术表辑ּQ前两个相加{于W三个,每位数都用字母代替,问最后字母对应的数是多少。数据范围n <= 26。由于进位不定Q因此需要枚举进位,再用高斯消元求解。我报着试一试的态度敲了(jin)一? ^ n * n ^ 3的程序上去,果然时?jin)。不知道应该如何优化Q到|上看了(jin)一下,因ؓ(f)每次枚D的都是常敎ͼ因此可以先把每个未知数用帔R表示出来Q这hơ枚丑֛带求解的复杂度就降到?jin)O(n ^ 2)。感觉这U做法很巧妙Q不q实现的时候出?jin)很多问题,搞?jin)一下午才搞? -!
  首先需要保存对于每个变量,它对应的每个常数的系数是多少。开始的时候我列方E的方向想错?jin),相当成模n域的方程l来求解。结果写?jin)很久之后发现因为n不一定是素数Q所以求解的时候解可能有多个,q样的话比较复杂了(jin)。后来一怒之下烦(ch)性当成实数域来求解,重新列了(jin)方程Q这栯是唯一的了(jin)Q但是中间运全是QҎ(gu)Q很担心(j)_ֺ问题Q交上去居然q了(jin)?br>  q个题目加速消元的思想q是很值得借鉴的,高斯消元的优化问题不多,但是感觉都挺有意思,像用u囑֊速高斯消元。根据方E的不同特点来选择合适的优化Ҏ(gu)很重要啊?



sdfond 2009-06-10 21:49 发表评论
]]>
博弈论的一些题?/title><link>http://m.shnenglu.com/sdfond/archive/2009/05/31/86318.html</link><dc:creator>sdfond</dc:creator><author>sdfond</author><pubDate>Sun, 31 May 2009 13:53:00 GMT</pubDate><guid>http://m.shnenglu.com/sdfond/archive/2009/05/31/86318.html</guid><wfw:comment>http://m.shnenglu.com/sdfond/comments/86318.html</wfw:comment><comments>http://m.shnenglu.com/sdfond/archive/2009/05/31/86318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/sdfond/comments/commentRss/86318.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/sdfond/services/trackbacks/86318.html</trackback:ping><description><![CDATA[先把题目贴出来,ȝ再说Q?br>POJ 2234 Matches Game<br>HOJ 2533 Stone II<br>POJ 2975 Nim<br>HOJ 1367 A Stone Game<br>POJ 2505 A multiplication game<br>ZJU 3057 beans game<br>POJ 1067 取石子游?br>POJ 2484 A Funny Game<br>POJ 2425 A Chess Game<br>POJ 2960 S-Nim<br>POJ 1704 Georgia and Bob<br>POJ 1740 A New Stone Game<br>POJ 2068 Nim<br>POJ 3480 John<br>POJ 2348 Euclid's Game<br>HOJ 2645 WNim<br>POJ 3710 Christmas Game <br>POJ 3533 Light Switching Game <br> <img src ="http://m.shnenglu.com/sdfond/aggbug/86318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/sdfond/" target="_blank">sdfond</a> 2009-05-31 21:53 <a href="http://m.shnenglu.com/sdfond/archive/2009/05/31/86318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高斯消元?/title><link>http://m.shnenglu.com/sdfond/archive/2009/05/26/85820.html</link><dc:creator>sdfond</dc:creator><author>sdfond</author><pubDate>Tue, 26 May 2009 09:13:00 GMT</pubDate><guid>http://m.shnenglu.com/sdfond/archive/2009/05/26/85820.html</guid><wfw:comment>http://m.shnenglu.com/sdfond/comments/85820.html</wfw:comment><comments>http://m.shnenglu.com/sdfond/archive/2009/05/26/85820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/sdfond/comments/commentRss/85820.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/sdfond/services/trackbacks/85820.html</trackback:ping><description><![CDATA[  高斯消元法用于求解线性方E组Q采用选主元的Ҏ(gu)Q算法复杂度O(N ^ 3)。相应的题型一U是在实数域q行求解Q一U是在整数域求解Q一般涉?qing)到取模。实数域的求解比较简单,整数域需要注意几个问题。模p一定是素数Q因Z是素数的话求解的时候可能会(x)出现多个解,处理h比较ȝ(ch)。一个特D的情况是模2域下的求解,可以采用位运优化。还有一点要注意的是在最开始构造系数矩阵和增广矩阵的时候,一定要先模pQ否则选主元的时候一些模p?的系C(x)被误选?br>  高斯消元法另一个需要讨论的地方是解的情况。分为无解、唯一解和无穷解。这三种情况Ҏ(gu)U性代数的知识很容易判断,主要是看系数阵的秩和增qK的秩。如果某一ơ选主元发现当前列的系数都?Q那么对应的变量是一个自由变元,解不定。这个时候要跌q一列,保持行不变,l箋q行消元。在消元之后查看增广늚U确定是否无解,若有解再Ҏ(gu)自由变元是否存在来判断是否是唯一解?br>  如果解是无穷多个的时候,需要枚丑֏元的取倹{一般用于处理解I间很小的情况,比如在模2域上的求解。枚丑֏元后无需重新列方E,只需q行一ơ回带找解即可?<img src ="http://m.shnenglu.com/sdfond/aggbug/85820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/sdfond/" target="_blank">sdfond</a> 2009-05-26 17:13 <a href="http://m.shnenglu.com/sdfond/archive/2009/05/26/85820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>龙贝格积?/title><link>http://m.shnenglu.com/sdfond/archive/2009/05/20/83506.html</link><dc:creator>sdfond</dc:creator><author>sdfond</author><pubDate>Wed, 20 May 2009 11:56:00 GMT</pubDate><guid>http://m.shnenglu.com/sdfond/archive/2009/05/20/83506.html</guid><wfw:comment>http://m.shnenglu.com/sdfond/comments/83506.html</wfw:comment><comments>http://m.shnenglu.com/sdfond/archive/2009/05/20/83506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/sdfond/comments/commentRss/83506.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/sdfond/services/trackbacks/83506.html</trackback:ping><description><![CDATA[<p>  龙贝格积分的基本思想是先利用复化梯形公式把曲线划分若干区_(d)把每个小区间当成梯Ş来求和;然后每次区间数加倍,直到收敛C定精度范围内为止?br>  E序基本参照计算Ҏ(gu)的书写的Q但是开始写完之后发现巨慢。找?jin)网上一个版本和我的比较下,发现我们俩只是二l数l的两个l代表的含义互换?jin),但是旉复杂度完全相同。后来改?jin)一下发现居然快很多Q囧。之后可以过JOJ 2457。但是仍然过不了(jin)HOJ 2539。一旦把_ֺ调高TLEQ郁闗?br>  后来扑ֈ?jin)liuyu大牛曄写过的rombergU分模板Q发现巨快,研究?jin)一下发C把那个T数组巧妙的压~成?jin)一l_(d)但是L间复杂度不变Q不知道Z么那么快Q也许是因ؓ(f)二维数组遍历的时候寻址比较耗时间吧。按照他的方法改?jin)下Q仍然过不了(jin)Q但是这回是WA。找?jin)很久发现在更新的时候每ơ乘以定值就?x)WAQ用pow才可以过Q估计是数据的精度有问题。改?jin)之后终于过了(jin),速度很快:-)</p><img src ="http://m.shnenglu.com/sdfond/aggbug/83506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/sdfond/" target="_blank">sdfond</a> 2009-05-20 19:56 <a href="http://m.shnenglu.com/sdfond/archive/2009/05/20/83506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速傅里叶变换http://m.shnenglu.com/sdfond/archive/2009/05/18/83287.htmlsdfondsdfondMon, 18 May 2009 08:01:00 GMThttp://m.shnenglu.com/sdfond/archive/2009/05/18/83287.htmlhttp://m.shnenglu.com/sdfond/comments/83287.htmlhttp://m.shnenglu.com/sdfond/archive/2009/05/18/83287.html#Feedback0http://m.shnenglu.com/sdfond/comments/commentRss/83287.htmlhttp://m.shnenglu.com/sdfond/services/trackbacks/83287.html  多项式有两种表示Q系数Ş式和点DC。如果把两个多项式写成点值Ş式,那么怹的复杂度是O(n)的。FFT的基本思想是通过把系数Ş式化成点值Ş式,怹之后再化回来Q得复杂度降到O(nlogn)。具体就是先通过巧妙地选取n个复数单位根Q利用复数的一些非常好的性质求得DFTQ把q一步的复杂度降到O(nlogn)Q然后将得到的点值相乘后Q利用插值再变换成系数Ş式。插值的q程居然和求DFT的过E惊人的怼Q复杂度依然为O(nlogn)?br>  在实现的时候基本参照算法导论,感觉递归不太好写Q就写了(jin)个P代的。N久不用复C(jin)Q连基本q算都忘?jin),D实现的时候出?jin)一堆错Q后来好不容易写好了(jin)Q结果却一炚w不靠谱。查?jin)好久才发现Q初始w?的时候,我把实部和虚部都设成1?jin),囧。实际上虚部应该?。改完后发现多项式的表示又出?jin)问题,后来发现我把pL的顺序写反了(jin)。然后利用这个做?jin)HDU 1402Q就是高_ֺ乘法。WA?jin)几ơ,很抓狂。后来写?jin)一个程序跑?jin)一l极限数据,居然挂了(jin)。仔l观察后发现是精度的问题。因为FFT中间q算q程都是点敎ͼ但是最后要输出整数Q取整的时候舍入精度出?jin)问题,加?jin)1e-3之后q了(jin)?br>  q有一道比较y妙的FFT的题目,SRM 436 DIV 1 1000ptQ做的时候开始Z0忘记取模?jin),l果q以为是模板的问题,找了(jin)很长旉才发现。做题还是要l心(j)啊?img src ="http://m.shnenglu.com/sdfond/aggbug/83287.html" width = "1" height = "1" />

sdfond 2009-05-18 16:01 发表评论
]]>
þ޹ƷAVϼ| ŷ޳ҹƷþ| 66ƷۺϾþþþþþ| þĻȫ| þ| þþƷˬ97| þù޾ƷӰԺ| 97þùۺϾƷŮ| ƷþӰԺ| þþֻоƷձ| 99þþƷһ| ˳ɵӰվþ| ƷþëƬ| þþþþ˸߳ӰԺ | þþþþùƷ| avþþƷ| ɫۺϾþþþĻ| 91Ʒ91þۺ| ƷëٸAVѾþ| ƷþþӰ㽶 | þþWWW˳ɾƷ| þþþþþĻ | һþۺ³³ŷһ | 69Ʒþþþ99| ھƷþþþӰԺ޹²| þþɫۺϾɫ99| þùƷһ| þۺۺϾþۺ| ھƷþ| һþaþþƷۺ㽶| þþоƷĻ| žžþþƷ| þþþAVȥ| þ޸ۺ| þþƷɫ鶹| þۺ97ɫֱ| þݺҹҹ2020츾| һƷþþ޹ | ղƷ99þþþþ| þùƷƬ| þĻȫ|