<?xml version="1.0" encoding="UTF-8" ?>
  <rss version="2.0">
    <channel>

<title>O興~</title>
      <link>http://imlazy.ycool.com/</link>
      <description><![CDATA[]]></description>
      <pubDate>Sat, 04 Jul 2009 11:07:19 GMT</pubDate>
      <lastBuildDate>Sat, 04 Jul 2009 11:07:19 GMT</lastBuildDate>
      <image>
        <url>http://sta.yculblog.com/images/logo/general-88x31.gif</url>
        <title>O興~</title>
        <link>http://imlazy.ycool.com/</link>
      </image>
<item>
        <title>在跆拳道馆遇到温喜庆了</title>
        <link>http://imlazy.ycool.com/post.2443157.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; 真是巧了。<br />
<br />
&nbsp;&nbsp;&nbsp; 因为学校放暑假，跆拳道社团停了，我也就没处可锻练了。自从去年受伤以后，我也没有去过原来在宝山的那家道馆了。那里后来换了个韩国教练，我也不好交流了。而且那里的小孩太多了，不适合我。<br />
<br />
&nbsp;&nbsp;&nbsp; 一直想找一家成人多一点的道馆，以后工作了就去那里练。可是现在社会上大多数的道馆都是儿童补习班性质的，全是小孩，完全变了味了。<br />
<br />
&nbsp;&nbsp;&nbsp; 上星期，在实习的公司附近找到了一家武馆，是学校社团的教练推荐的。本来不抱有太大希望，只是去看看。谁知那里的气氛很好。虽然场地不是很大，环境很朴素，但是那里的人都很有激情，而且大多数是成人，我和想象中的、影视剧里那样的道馆很像。而且不仅有跆拳道，拳击、武术等等各种项目的人都在一起练习，各自在自己的区域，但是互相之间没有隔离开。<br />
<br />
&nbsp;&nbsp;&nbsp; 最有趣有就是，温喜庆也在那里练拳击。可见这家武馆真的不错，连名人都认可了它。而且价格一点也不贵，我两天工资就能交一个暑假的学费了。我想我以后会一直去那里练习的，如果我能继续在第一资讯或者周围上班的话。<br />
<br />
&nbsp;&nbsp;&nbsp; 不过这家武馆的名字我不能说，不然就泄露了名人的隐私了。<br />
<br />
&nbsp;&nbsp;&nbsp; 锻练身体之余，不免要担心一下我的论文。由于种种原因，进度很慢。我确实是个爱磨蹭的人。<br />
<br />
&nbsp;&nbsp;&nbsp; 最后顺便说一下，今天公司组织我们去看《<a href="http://fifid.com/search/%E5%8F%98%E5%BD%A2%E9%87%91%E5%88%9A2?src=yb_qsal&utm_source=yb_qsal&utm_medium=link&utm_content=rsspost" target="_blank">变形金刚2</a>》，我觉得真好看。不了解变形金刚的人看了可能会累，但是金刚迷一定会觉得很爽。...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2443157.html</guid>
        <pubDate>Sat, 04 Jul 2009 10:07:20 GMT</pubDate>
<category>跆拳道</category>

        <category>温喜庆</category>
      </item>

      <item>
        <title>报告一下我的近况吧</title>
        <link>http://imlazy.ycool.com/post.2351158.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; 实习工作得还顺利，忙碌而紧凑。而论文还在初期构思阶段，多少有点被工作耽误，但是这也没办法。现在我每周一、二去学校做论文相关的事情；每周三、四、五去上班。<br />
<br />
&nbsp;&nbsp;&nbsp; 在工作日的午饭吃得都很好；晚上回家以后妈妈也给我供了一大堆吃的，所以自从去年底长胖了以来，一直没瘦下去。幸亏我每周还有两天可以在学校自己合理饮食、练两次跆拳道。<br />
<br />
&nbsp;&nbsp;&nbsp; 昨天公司的同事们组织了去南北湖春游。风景真的是不怎么样；但是如果只是当作到大自然里去散散步、聊聊天的话，还是不错的。<br />
<br />
&nbsp;&nbsp;&nbsp; 发一张我的照片吧。飞行棋T恤好帅啊。<br />
<br />
<div align="center"><img alt="" align="middle" border="0" src="http://node0.foto.ycstatic.com/200905/17/e/27795406.jpg" /></div>...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2351158.html</guid>
        <pubDate>Sun, 17 May 2009 05:05:31 GMT</pubDate>

      </item>

      <item>
        <title>如果这样下去，我可能没法再写 BLOG 了</title>
        <link>http://imlazy.ycool.com/post.2267854.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; 虽然在 FIRST DATA 的这份工作挺好的，但是八小时没有停下来的，除了每天中午出去搓一顿。八小时给单位，八小时外给论文。跟老外说话说不遛，还得练英语，没业余时间了。这是我对实习唯一有点后悔的地方。<br />
<br />
&nbsp;&nbsp;&nbsp; 把这一年熬过去，八小时之外我就自己撑握了。盼啊～...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2267854.html</guid>
        <pubDate>Wed, 11 Feb 2009 12:02:05 GMT</pubDate>
<category>实习</category>
      </item>

      <item>
        <title>ACM-ICPC 2008 杭州赛区第 C 题，Cryptography Reloaded</title>
        <link>http://imlazy.ycool.com/post.2261251.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; <a href="http://acm.hdu.edu.cn/showproblem.php?pid=2466">这道题目</a>要求跟据 RSA 加密算法中的 n、 e 和 d 求出 p 和 q。其中 n = pq；e 和 d 互为 MOD (p - 1)(q - 1) 情况下的逆元，即 ed MOD (p - 1)(q - 1) = 1；p &lt; q；n, d &le; 10<sup>100</sup>； 3 &le; e &le; 31。<br />
<br />
&nbsp;&nbsp;&nbsp; 我记得比赛时有不少队做出了这道题，可是我们毫无头绪。以下是 PROXIMA 队的做法。<br />
<br />
&nbsp;&nbsp;&nbsp; 已知 ed - 1 是 (p - 1)(q - 1) 的倍数，则可以枚举可能的 (p - 1)(q - 1) 值。他们枚举了 ed - 1、(ed - 1) / 2&hellip;&hellip;直到 (ed - 1) / 100。<br />
<br />
&nbsp;&nbsp;&nbsp; 然后设 t = (p - 1)(q - 1)，n = pq，则可以解出 p 和 q：<br />
<ul>
 <li>p = <a href="http://www.codecogs.com/eqnedit.php?latex=\frac{n-t-1-\sqrt{(n-t-1)^{2}-4t}}{2}+1"><img border="0" align="absmiddle" alt="" title="\frac{n-t-1-\sqrt{(n-t-1)^{2}-4t}}{2}+1" src="http://latex.codecogs.com/gif.latex?\frac{n-t-1-\sqrt{(n-t-1)^{2}-4t}}{2}+1" /></a></li>
 <li>q = <a href="http://www.codecogs.com/eqnedit.php?latex=\frac{n-t-1+\sqrt{(n-t-1)^{2}-4t}}{2}+1"><img border="0" align="absmiddle" alt="" src="http://latex.codecogs.com/gif.latex?\frac{n-t-1+\sqrt{(n-t-1)^{2}-4t}}{2}+1" title="\frac{n-t-1+\sqrt{(n-t-1)^{2}-4t}}{2}+1" /></a></li>
</ul>
&nbsp;&nbsp;&nbsp; 只要碰到中间过程整除都除得尽、根号都开得出的，就是答案了。这么说起来好像一点也不难，我们怎么就是想不出呢，主要还是被大数吓到了。以下是 PROXIMA 队的代码，其中第 61 ~ 80 行重复了两遍，我没看出这有什么作用： <br />
<br />
<div style="overflow: auto; height: 150px; width: 550px;">
<pre name="code" class="cpp"><br />import java.io.FileInputStream;<br />import java.math.BigInteger;<br />import java.util.Random;<br />import java.util.Scanner;<br /><br />/*<br /> * To change this template, choose Tools | Templates<br /> * and open the template in the editor.<br /> */<br />/**<br /> *<br /> * @author acm<br /> */<br />public class Main {<br /><br />    public static BigInteger sqrt(BigInteger a) {<br />        double ad = a.doubleValue();<br />        ad = Math.sqrt(ad);<br />        BigInteger l = BigInteger.valueOf(0);<br />        BigInteger r = new BigInteger(a.toString());<br />        /*double size = Math.log10(a.doubleValue());<br />        if (size)*/<br />        while (l.compareTo(r)&lt;0) {<br />            BigInteger mid = l.add(r).divide(BigInteger.valueOf(2));<br />            int res = mid.multiply(mid).compareTo(a);<br />            if (res==0) return mid;<br />            if (res&lt;0) l = mid.add(BigInteger.ONE);<br />            else r = mid.subtract(BigInteger.ONE);<br />        }<br />        return l;<br />    }<br />    /**<br />     * @param args the command line arguments<br />     */<br />    public static void main(String[] args) {<br />/*        BigInteger a1 = BigInteger.probablePrime(100, new Random());<br />        BigInteger a2 = BigInteger.probablePrime(100, new Random());<br />        BigInteger d = BigInteger.probablePrime(199, new Random());<br />        System.out.println(a1);<br />        System.out.println(a2);<br />        System.out.println(a1.multiply(a2));<br />        System.out.println(d);<br />        System.out.println();<br />  */      <br />        try {<br />            Scanner in = new Scanner(new FileInputStream(&quot;c.in&quot;));<br />            for (int tt=1;; tt++) {<br />                BigInteger n = in.nextBigInteger();<br />                BigInteger d = in.nextBigInteger();<br />                int e = in.nextInt();<br />                if (e==0) break;<br />                <br />                d = d.multiply(BigInteger.valueOf(e)).subtract(BigInteger.ONE);<br />                for (int kk=1; kk&lt;=100; kk++) {<br />                    BigInteger t = d.divide(BigInteger.valueOf(kk));<br />                    if (t.multiply(BigInteger.valueOf(kk)).equals(d)) {<br />                        BigInteger tosqrt = n.subtract(t).subtract(BigInteger.ONE).pow(2).subtract(t.multiply(BigInteger.valueOf(4)));<br />                        if (tosqrt.compareTo(BigInteger.ZERO)&gt;=0) {<br />                            BigInteger sol = sqrt(tosqrt);<br />                            if (sol.pow(2).equals(tosqrt)) {<br />                                BigInteger x = n.subtract(t).subtract(BigInteger.ONE).add(sol).divide(BigInteger.valueOf(2));<br />                                BigInteger y = n.subtract(t).subtract(BigInteger.ONE).subtract(x);<br />                                BigInteger p = x.add(BigInteger.ONE), q = y.add(BigInteger.ONE);<br />                                if (p.signum()&gt;0 &amp;&amp; q.signum()&gt;0 &amp;&amp; p.multiply(q).equals(n) &amp;&amp; p.isProbablePrime(100) &amp;&amp; q.isProbablePrime(100)) {<br />                                    if (p.compareTo(q)&gt;0) {<br />                                        BigInteger sw = p; p = q; q = sw;<br />                                    }<br />                                    System.out.println(&quot;Case #&quot;+tt+&quot;: &quot;+p+&quot; &quot;+q);<br />                                    break;<br />                                }<br />                                x = n.subtract(t).subtract(BigInteger.ONE).subtract(sol).divide(BigInteger.valueOf(2));<br />                                y = n.subtract(t).subtract(BigInteger.ONE).subtract(x);<br />                                p = x.add(BigInteger.ONE); q = y.add(BigInteger.ONE);<br />                                if (p.signum()&gt;0 &amp;&amp; q.signum()&gt;0 &amp;&amp; p.multiply(q).equals(n) &amp;&amp; p.isProbablePrime(100) &amp;&amp; q.isProbablePrime(100)) {<br />                                    if (p.compareTo(q)&gt;0) {<br />                                        BigInteger sw = p; p = q; q = sw;<br />                                    }<br />                                    System.out.println(&quot;Case #&quot;+tt+&quot;: &quot;+p+&quot; &quot;+q);<br />                                    break;<br />                                }<br />                            }<br />                        }<br />                    }<br />                }<br />            }<br />        } catch (Exception e) {<br />            e.printStackTrace();<br />        }<br />    }<br />}<br /></pre>
</div>...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2261251.html</guid>
        <pubDate>Sat, 31 Jan 2009 05:01:00 GMT</pubDate>
<category>acm</category>

        <category>杭州</category>

        <category>icpc</category>

        <category>杭电</category>

        <category>杭州电子科技大学</category>
      </item>

      <item>
        <title>《非诚勿扰》中的风景很漂亮</title>
        <link>http://imlazy.ycool.com/post.2257126.html</link>
        <description><![CDATA[&nbsp; &nbsp; 我觉得《<a href="http://fifid.com/search/%E9%9D%9E%E8%AF%9A%E5%8B%BF%E6%89%B0?src=yb_qsal&utm_source=yb_qsal&utm_medium=link&utm_content=rsspost" target="_blank">非诚勿扰</a>》这个电影有一个很大的亮点，那就是当中有很多风景很漂亮。<br />
<br />
<div align="center"><img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/0/27481296.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/c/27481292.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/9/27481289.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/b/27481291.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/d/27481293.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/f/27481295.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/3/27481299.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/e/27481294.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/1/27481297.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/a/27481290.jpg" /><br />
<br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200901/22/2/27481298.jpg" /></div>...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2257126.html</guid>
        <pubDate>Thu, 22 Jan 2009 14:01:31 GMT</pubDate>
<category>非诚勿扰</category>
      </item>

      <item>
        <title>2008-12-07，东华蝉联好动杯</title>
        <link>http://imlazy.ycool.com/post.2247061.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; 很高兴我是这么强的一支队伍的一员，我们是上海第一的大学跆拳道社团（不包括体校）。<br />
<br />
&nbsp;&nbsp;&nbsp; 很遗憾的是当时我的腰伤还没好（到现在还是没完全好），没法参加团体特技比赛，只能参加个人品势。本来我是奔着冠军去的，可是中途输给别人了。有一定偶然性，但是个人水平也是因素之一，而且前一个月养伤养胖了许多。还好社长 ZLY 同学帮我报了仇，得了冠军。<br />
<br />
<table width="" cellspacing="0" cellpadding="5" border="1" align="center" summary="">
 <tbody>
  <tr>
   <td align="center"><a href="http://node2.foto.ycstatic.com/200901/13/2/27450114o.jpg" target="_blank"><img border="0" src="http://node3.foto.ycstatic.com/200901/13/a/27450266.jpg" alt="" /></a><br />
   <br />
   个人品势比赛</td>
   <td align="center"><a href="http://node2.foto.ycstatic.com/200901/13/4/27450116o.jpg" target="_blank"><img border="0" src="http://node3.foto.ycstatic.com/200901/13/e/27450270.jpg" alt="" /></a><br />
   <br />
   社长 ZLY，男子个人品势冠军<br />
   </td>
  </tr>
 </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp; 最后的团体特技比赛是我们的强项。最终我们的各项总分也得到了第一，蝉联了好动杯。<br />
<br />
<table width="" cellspacing="0" cellpadding="5" border="1" align="center" summary="">
 <tbody>
  <tr>
   <td align="center"><a href="http://node2.foto.ycstatic.com/200901/13/7/27450119o.jpg" target="_blank"><img border="0" alt="" src="http://node3.foto.ycstatic.com/200901/13/3/27450275.jpg" /></a><br />
   <br />
   忘了是谁的腾空八字了</td>
   <td align="center"><a href="http://node3.foto.ycstatic.com/200901/13/0/27450112o.jpg" target="_blank"><img border="0" alt="" src="http://node3.foto.ycstatic.com/200901/13/1/27450273.jpg" /></a><br />
   <br />
   JLM 腾空三前踢<br />
   </td>
   <td align="center"><a href="http://node2.foto.ycstatic.com/200901/13/6/27450118o.jpg" target="_blank"><img border="0" src="http://node3.foto.ycstatic.com/200901/13/0/27450272.jpg" alt="" /></a><br />
   <br />
   PY 单腿旋风踢<br />
   </td>
  </tr>
  <tr>
   <td align="center"><a href="http://node2.foto.ycstatic.com/200901/13/8/27450120o.jpg" target="_blank"><img border="0" alt="" src="http://node3.foto.ycstatic.com/200901/13/f/27450271.jpg" /></a><br />
   <br />
   SXQ 后空翻</td>
   <td align="center"><a href="http://node2.foto.ycstatic.com/200901/13/5/27450117o.jpg" target="_blank"><img border="0" alt="" src="http://node3.foto.ycstatic.com/200901/13/c/27450268.jpg" /></a><br />
   <br />
   PH 飞人后踢<br />
   </td>
   <td align="center"><a href="http://node3.foto.ycstatic.com/200901/13/1/27450113o.jpg" target="_blank"><img border="0" alt="" src="http://node3.foto.ycstatic.com/200901/13/b/27450267.jpg" /></a><br />
   <br />
   YSY 飞人侧踢<br />
   </td>
  </tr>
  <tr>
   <td align="center"><a href="http://node2.foto.ycstatic.com/200901/13/3/27450115o.jpg" target="_blank"><img border="0" src="http://node3.foto.ycstatic.com/200901/13/2/27450274.jpg" alt="" /></a><br />
   <br />
   东华跆拳道社团部分社员<br />
   </td>
   <td align="center"><br />
   </td>
   <td align="center"><br />
   </td>
  </tr>
 </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp; 另外，我学到了一个教训，就是抓拍运动的东西的时候，不要吝惜把感光度调高；一定要保证曝光时间够短，否则只会像这次一样，人都糊掉了。...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2247061.html</guid>
        <pubDate>Tue, 13 Jan 2009 06:01:02 GMT</pubDate>
<category>跆拳道</category>

        <category>东华</category>

        <category>好动杯</category>
      </item>

      <item>
        <title>记昨天在 FIRST DATA 的面试</title>
        <link>http://imlazy.ycool.com/post.2234518.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; 人生第一次写简历，第一次面试，第一次穿皮鞋 + 西裤 + 衬衫 + 毛衣，第一次跟老外说话。昨天我把这么多第一次献给了 FIRST DATA 公司。<br />
<br />
&nbsp;&nbsp;&nbsp; 衣服令我很尴尬。他们来学校宣传的时候，说衣服要正式，不可以穿牛仔裤。结果我到了那一看，明明都是运动鞋牛仔裤。如果有下次去，我肯定不会穿成这样了。<br />
<br />
&nbsp;&nbsp;&nbsp; 公司位于淮海中路香港新世界大厦的 39 楼，我也是第一次从这个高度俯瞰大上海，真大。<br />
<br />
&nbsp;&nbsp;&nbsp; 我感觉，这个公司的情调还是很资产阶级的。我想一是因为它是美国的大公司；二是因为它本身就是为银行做支付系统之类的，客户都是知名大银行，所以钞票的味道是很重的。里面有很多老外和港台人，要养这群人，钞票肯定是不能少的。<br />
<br />
&nbsp;&nbsp;&nbsp; 我发觉在近一段时间，小资思想在我心中萌芽，居然被这种单位所吸引，有点背离了我当初只是想要玩电脑的淳朴的职业理想。但是还好，即使在这个单位，我还是做软件的，还是搞技术的。<br />
<br />
&nbsp;&nbsp;&nbsp; 让我回忆一下面试内容吧。首先是笔试，很简单：<br />
<ul>
 <li>由于出现了一些技术问题，项目要延期交付了。用英文写一封 EMAIL，向客户说明情况。</li>
 <li>一些智力题。</li>
</ul>
&nbsp;&nbsp;&nbsp; 然后是谈话，我记得问了我如下问题：<br />
<ul>
 <li>谈谈对公司的了解</li>
 <li>自我介绍一下</li>
 <li>JAVA
 <ul>
  <li>InputStream 和 InputStreamReader 有什么区别<br />
  </li>
  <li>虚函数有什么用</li>
  <li>函数重载算不算多态</li>
 </ul>
 </li>
</ul>
&nbsp;&nbsp;&nbsp; 接下来问了我一些实际的问题：<br />
<ul>
 <li>如果系统在客户那边突然不能工作了，该怎么办？<br />
 &nbsp;&nbsp;&nbsp; 我只说了我会用什么方法去找出故障的所在，可是他说最先要做的应该是弄一个应急的方案，让系统能工作起来，这一点我没想到。</li>
</ul>
<ul>
 <li>目前公司所用的技术是我没有接触过的领域，我该怎么入手？<br />
 &nbsp;&nbsp;&nbsp; 我想这个问题是针对我的，因为我确实没什么经验。我当然只能回答虚心请教，积极学习之类的，我还能回答什么呢。</li>
</ul>
<ul>
 <li>如果在工作中发现公司现有的产品有不足之处，但是也能用，可改可不改，那我会怎么做？<br />
 &nbsp;&nbsp;&nbsp; 我说如果有空的话还是会积极向上级请示，要不要让我来改改看。我觉得我这个回答他还是满意的。</li>
</ul>
&nbsp;&nbsp;&nbsp; 接下来是老外和我谈话：<br />
<ul>
 <li>自我介绍一下</li>
 <li>讲讲自己的兴趣爱好</li>
 <li>要做一个象棋的程序，我会有哪些步骤？<br />
 &nbsp;&nbsp;&nbsp; 我是往人工智能方面说的，说我会搜集大量棋局的资料，这当中可能需要一些启发式的搜索。可是后来我才知道他是想让我从软件工程的角度说说有哪些步骤，需求分析啦，设计啦，写文档啦，测试啦&hellip;&hellip;之类的。看来这个问题我没有回答好。</li>
</ul>
&nbsp;&nbsp;&nbsp; 老外的话我不是全都能听懂，只是七八分知道他讲的是什么。我说的时候也经常不知怎么表达，看来我的英文对话能力是需要提高的。<br />
<br />
&nbsp;&nbsp;&nbsp; 就是这样了，感觉不好也不坏。...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2234518.html</guid>
        <pubDate>Tue, 30 Dec 2008 10:12:18 GMT</pubDate>
<category>面试</category>

        <category>第一资讯</category>

        <category>first data</category>
      </item>

      <item>
        <title>ACM-ICPC 2008 杭州赛区第 D 题，Déjà vu</title>
        <link>http://imlazy.ycool.com/post.2234430.html</link>
        <description><![CDATA[<strong>&nbsp;&nbsp;&nbsp; </strong><a href="http://acm.hdu.edu.cn/showproblem.php?pid=2467" target="_blank">这道题目</a>是这样的，有起始状态 S 和目标状态 T，它们都是 N 位二进制数（3 &le; N &le; 20）；又有 M 个不同的开关（M &le; <a href="http://www.codecogs.com" target="_blank"><img border="0" align="absmiddle" alt="C_N^3" src="http://www.codecogs.com/gif.latex?C_N^3" /></a>），分别都是 N 位二进制数，并且每个开关中都恰好有 3 个 1；从 S 开始，每一步状态转换都是与一个开关进行异或（以下用&ldquo;&oplus;&rdquo;表示）；问是否可能到达状态 T，如果可能，至少需要几步。<br />
<br />
&nbsp;&nbsp;&nbsp; <a href="#code-d">代码 1</a> 是 PROXIMA 队这题的代码，好像是楼天成打的。虽然他们在比赛当场 AC 了，可是这个代码现在提交到 <a target="_blank" href="http://acm.hdu.edu.cn/">HDOJ</a> 上是超时的。因为楼天成做了一件画蛇添足的事，在<a href="#code-d">代码 1</a> 的第 123 ~ 132 行，他判断了输入当中是否有重复的开关。实际上是没有这种输入的。去掉这一段的话，就可以在 <a target="_blank" href="http://acm.hdu.edu.cn/">HDOJ</a> 上 AC 了。<br />
<br />
<a name="code-d"></a>
<div style="overflow: auto; height: 150px;">
<pre name="code" class="cpp">#include &lt;stdlib.h&gt;<br />#include &lt;cstdio&gt;<br />#include &lt;string&gt;<br />#include &lt;set&gt;<br /><br />using namespace std;<br /><br />#define two(X) (1&lt;&lt;(X))<br /><br />const int maxn=20;<br />const int maxm=2000;<br />const int maxsize=two(maxn);<br /><br />#define two(X) (1&lt;&lt;(X))<br />#define contain(S,X) (((S)&amp;two(X))&gt;0)<br /><br />int n,m;<br />int S[maxm];<br />int src,dest,state;<br />int A[maxn+5][maxm];<br />int side[maxsize];<br />int Q[2][maxsize],op[2],cl[2];<br />int RD[maxn+5];<br /><br />int countbit(int n)<br />{<br />    return (n==0)?0:(1+countbit(n&amp;(n-1)));<br />}<br />int solve()<br />{<br />    if (state==0) return 0;<br />//    printf(&quot;HERE\n&quot;);<br />    for (int i=1;i&lt;=n;i++)<br />    {<br />        int k=1;<br />        for (;k&lt;=m &amp;&amp; A[i][k]==0;k++);<br />        if (k&gt;m)<br />        {<br />            if (A[i][0]==1) return -1;<br />            continue;<br />        }<br />        for (int j=i+1;j&lt;=n;j++) if (A[j][k]==1)<br />            for (int v=0;v&lt;=m;v++)<br />                A[j][v]^=A[i][v];<br />    }<br />    int base=0;<br />    while (RD[countbit(state)]&gt;5 &amp;&amp; m&gt;=50)<br />    {<br />        int k=-1;<br />        for (int i=1;i&lt;=m;i++)<br />        {<br />            int newstate=state^S[i];<br />            if (RD[countbit(newstate)]==RD[countbit(state)]-1)<br />            {<br />                k=i;<br />                break;<br />            }<br />        }<br />        if (k&lt;0) break;<br />        base++;<br />        state=state^S[k];<br />    }<br />    op[0]=op[1]=0;<br />    cl[0]=cl[1]=1;<br />    memset(side,255,sizeof(side));<br />    Q[0][++op[0]]=0;<br />    side[0]=0;<br />    Q[1][++op[1]]=state;<br />    side[state]=1;<br />    for (int D=1;1;D++)<br />    {<br />      //  printf(&quot;%d %d %d\n&quot;,D,op[0],op[1]);<br />        int s=D%2;<br />        for (int tmp=op[s];cl[s]&lt;=tmp;cl[s]++)<br />        {<br />            int set=Q[s][cl[s]];<br />            for (int i=1;i&lt;=m;i++)<br />            {<br />                int newset=set^S[i];<br />                if (side[newset]==s) continue;<br />                if (side[newset]&lt;0)<br />                {<br />                    side[newset]=s;<br />                    Q[s][++op[s]]=newset;<br />                }<br />                else<br />                    return D+base;<br />            }<br />        }<br />    }<br />    return -1;<br />}<br />int main()<br />{<br />/*    freopen(&quot;d.in&quot;,&quot;w&quot;,stdout);<br />    n=20;<br />    printf(&quot;%d %d\n&quot;,n,n*(n-1)*(n-2)/6);<br />    printf(&quot;%d %d\n&quot;,0,two(n)-1);<br />    for (int i=0;i&lt;n;i++) for (int j=i+1;j&lt;n;j++) for (int k=j+1;k&lt;n;k++)<br />        printf(&quot;%d\n&quot;,two(i)|two(j)|two(k));<br />    printf(&quot;0 0\n&quot;);<br />    return 0;<br /> */<br />    freopen(&quot;d.in&quot;,&quot;r&quot;,stdin);<br />    for (int i=0;i&lt;maxn+5;i++) RD[i]=1000000;<br />    RD[0]=0;<br />    for (int step=0;step&lt;maxn+5;step++)<br />        for (int i=0;i&lt;maxn+5;i++)<br />            for (int d=-3;d&lt;=3;d+=2)<br />            {<br />                int j=i+d;<br />                if (j&gt;=0 &amp;&amp; j&lt;maxn+5 &amp;&amp; RD[i]+1&lt;RD[j])<br />                    RD[j]=RD[i]+1;<br />            }<br />    int caseId=0;<br />    while (scanf(&quot;%d%d&quot;,&amp;n,&amp;m)!=-1 &amp;&amp; n!=0)<br />    {<br />        caseId++;<br />        printf(&quot;Case #%d: &quot;,caseId);<br />        scanf(&quot;%d%d&quot;,&amp;src,&amp;dest);<br />  //      printf(&quot;%d %d %d %d\n&quot;,n,m,src,dest);<br />        state=src^dest;<br />        set&lt;int&gt; M;<br />        M.clear();<br />        for (int i=1;i&lt;=m;i++)<br />        {<br />            int value=0;<br />            scanf(&quot;%d&quot;,&amp;value);<br />            M.insert(value);<br />        }<br />        m=0;<br />        for (set&lt;int&gt;::iterator it=M.begin();it!=M.end();++it) S[++m]=*it;<br />      //  printf(&quot;m = %d %d\n&quot;,m,state);<br />        for (int i=1;i&lt;=n;i++)<br />        {<br />            A[i][0]=(int)contain(state,i-1);<br />            for (int j=1;j&lt;=m;j++)<br />                A[i][j]=(int)contain(S[j],i-1);<br />        }<br />    //    printf(&quot;m = %d %d\n&quot;,m,state);<br />        int ret=solve();<br />        if (ret&lt;0) printf(&quot;Impossible\n&quot;);<br />        else printf(&quot;%d\n&quot;, ret);<br />    }<br />    return 0;<br />}</pre>
</div>
<br />
<div align="center">代码 1<br />
</div>
<br />
&nbsp;&nbsp; 他们的算法基本上还是双向 BFS。但是在这个问题中，状态空间很大，最多有 2<sup>20</sup> 种；每一步的分枝也很多，最多有 <a target="_blank" href="http://www.codecogs.com"><img border="0" align="absmiddle" src="http://www.codecogs.com/gif.latex?C_{20}^3" alt="C_{20}^3" /></a> = 6840 种开关可选；因此直接开始搜的话就会超时。对此，楼天成做了以下三个重要的优化。<br />
<br />
&nbsp;&nbsp;&nbsp; 首先，他对状态 S 和 T 做了转换，S 变成 S &oplus; T，T 变成 0，在<a href="#code-d">代码 1</a> 的第 122 行。这样与原问题是等价的。因为原问题是要把 S 变成和 T 一样，也就是要把 S 的不同于 T 的那几位都取反；而经过转换后的 S，只有在原来 S 和 T 不同的那几位上是 1，现在的目标就是要把这些 1 消掉，让 S 变成全 0。<br />
<br />
&nbsp;&nbsp;&nbsp; 经过这一转化，使问题的逻辑简化了不少，也为后面的优化做了铺垫。<br />
<br />
&nbsp;&nbsp;&nbsp; 接下来，在<a href="#code-d">代码 1</a> 的第 33 ~ 45 行，他基于<a href="#lemma-d">定理 1</a> 快速地判断出了是否有解。<br />
<br />
<a name="lemma-d"></a>
<table width="90%" cellspacing="0" cellpadding="0" border="0" align="center" summary="">
 <tbody>
  <tr>
   <td bgcolor="#ffffff">    (1) 如果所有开关的第一位都是 0，而 S 的第一位是 1，则无解。<br />
   <br />
   (2) 如果所有开关和 S 的第一位都是 0，则说明在本问题中，第一位是是没有任何作用的。现在可以把问题转化，把 S 和所有开关的第一位都 &ldquo;砍掉&rdquo;，也就是都变成 N - 1 位。得到的新问题的可解性和原问题相同。<br />
   <br />
   (3) 如果存在第一位是 1 的开关，则把问题进行如下转换，转换得到的新问题的可解性与原问题相同。
   <ul>
    <li>任取一个第一位为 1 的开关，称它为 x。     </li>
    <li>对于 x 除外的每个开关 y，如果它的第一位也为 1，则把它变成 y &oplus; x。</li>
    <li>如果 S 的第一位为 1，同样，也把它变成 S &oplus; x。</li>
    <li>把 x 从开关的集合中去掉。</li>
    <li>把 S 和所有开关的第一位都 &ldquo;砍掉&rdquo;，变成 N - 1 位。</li>
   </ul>
   (4) 如果 S 被转化为空，则有解。</td>
  </tr>
 </tbody>
</table>
<br />
<div align="center">定理 1<br />
</div>
<br />
&nbsp;&nbsp;&nbsp; 要证明<a href="#lemma-d">定理 1</a>，需要借助几个基本的事实：<br />
<ul>
 <li>异或运算满足交换率和结合率。</li>
 <li>异或同一个值偶数次，等于什么都没做。</li>
 <li>异或同一个值奇数次，等于只异或了一次。</li>
</ul>
&nbsp;&nbsp;&nbsp; 现在看<a href="#lemma-d">定理 1</a> 的第 (3) 点。如果存在一组开关，是原问题的一个解，且 S 的第一位为 0，则由于 S 的第一位最终必须仍是 0，这个解一定包含偶数个第一位为 1 的开关。在这偶数个开关中，如果包含 x （可以假设只包含一个 x，因为拿任何开关异或一次以上都是没有意义的），则从这个解当中把 x 去掉，就成了新问题的一个解。因为在这个解当中，x 除外的奇数个第一位为 1 的开关在新问题中都 &ldquo;附带&rdquo; 了一个 x，所以在新的解当中，x 出现了奇数次，相当于出现了一次，因此新的解等价于原解。<br />
<br />
&nbsp;&nbsp;&nbsp; 对于 x 不包含在原解当中，或者原 S 的第一位为 1，或者原问题无解的情况，证明的方法都是完全类似的，我就不赘述了。<br />
<br />
&nbsp;&nbsp;&nbsp; 最后一个优化在<a href="#code-d">代码 1</a> 的第 47 ~ 62 行。内容很简单，是一个贪心，如果 S 包含的 1 的个数比较多，并且可选的开关比较多的话，则只要碰到任何一个开关能使 S 更接进 0，就把它包含到最优解当中去。所谓的 &ldquo;更接进 0&rdquo;，需要靠数组 RD 来判断。它是在<a href="#code-d">代码 1</a> 的第 105 ~ 114 行初始化好的，值为 {0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, &hellip;}。RD[11] = 5 的含义为，如果 S 包含 11 个 1，则至少需要 5 步才能把 S 变成 0。<br />
<br />
&nbsp;&nbsp;&nbsp; 我想，<a href="#code-d">代码 1</a> 的第 47 行中的 &ldquo;5&rdquo; 和 &ldquo;50&rdquo; 这两个值是跟据经验指定的。我记得听到楼天成在赛后对别人说，他有一题的算法是错的；周源也说有一个参数改小了就 WRONG ANSWER，改大了就超时，折中一点就 AC 了；我估计他们说的就是这里。无论如何，这样也能 AC，就是牛bility。...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2234430.html</guid>
        <pubDate>Tue, 30 Dec 2008 07:12:27 GMT</pubDate>
<category>acm</category>

        <category>杭州</category>

        <category>icpc</category>

        <category>杭电</category>

        <category>杭州电子科技大学</category>
      </item>

      <item>
        <title>ACM-ICPC 2008 杭州赛区第 F 题，Fire-Control System</title>
        <link>http://imlazy.ycool.com/post.2234422.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; <a href="http://acm.hdu.edu.cn/showproblem.php?pid=2469" target="_blank">这道题目</a>要求对于平面上的 N 个点（1 &le; N &le; 5,000），找出一个以点 (0, 0) 为圆心的扇形，使其能覆盖其中至少 K 个点（K &le; N），并且该扇形的面积要最小。<br />
<br />
&nbsp;&nbsp;&nbsp; 我想这个算法很容易想到，枚举即可。因为对于最小的扇形，它的弧和两条边上肯定都至少覆盖了一个点。所以枚举半径，对于每个半径，把扇形的两条边扫一圈，即可达到 O(N<sup>2</sup>) 的复杂度（两条边一起扫一圈是 O(N) 的复杂度，可不是 O(N<sup>2</sup>) 哦）。<br />
<br />
&nbsp;&nbsp;&nbsp; <a href="#code-f">代码 1</a> 是 PROXIMA 队的代码，从风格上看，好像不是楼天成写的。<br />
<br />
<a name="code-f"></a>
<div style="overflow: auto; height: 150px;">
<pre class="cpp" name="code">#include &lt;vector&gt;<br />#include &lt;algorithm&gt;<br />using namespace std;<br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;math.h&gt;<br /><br />FILE *Fin = fopen(&quot;f.in&quot;,&quot;r&quot;);<br />FILE *Fou = stdout;<br /><br />#define maxn 5100<br />int p[maxn][2];<br />int n,m;<br /><br />struct Point<br />{<br />    int r;<br />    double d;<br />} q[maxn+maxn];<br />bool operator &lt; (Point a, Point b) { return a.d&lt;b.d; }<br />const double PI = atan2(0,-1.0);<br /><br />inline int hypot2(int a, int b) { return a*a+b*b; }<br /><br />int main()<br />{<br />    int tt=0,i,j,k;<br />    while (fscanf(Fin,&quot;%d%d&quot;,&amp;n,&amp;m)!=EOF)<br />    {<br />        tt++;<br />        if (n==0) break;<br />        for (i=0; i&lt;n; i++)<br />        {<br />            fscanf(Fin,&quot;%d%d&quot;,p[i],p[i]+1);<br />            q[i].r = hypot2(p[i][0], p[i][1]);<br />            q[i].d = atan2((double)p[i][1], (double)p[i][0]);<br />        }<br />        if (m==0||m==1)<br />        {<br />            fprintf(Fou,&quot;Case #%d: 0.00\n&quot;,tt);<br />            continue;<br />        }<br />        for (i=0; i&lt;n; i++)<br />        {<br />            q[n+i] = q[i];<br />            q[n+i].d += PI+PI;<br />        }<br />        sort(q, q+n+n);<br />        double best = 1e100;<br />        for (i=0; i&lt;n; i++)<br />        {<br />            int l = 0, r = -1, c = 0;<br />            for (j=0; j&lt;n+n; j++) {<br />                if (q[j].r&lt;=q[i].r) {<br />                    c++;<br />                    if (c==m) {<br />                        r = j;<br />                        break;<br />                    }<br />                }<br />            }<br />            if (r!=-1) {<br />                c--, r--;<br />                for (j=r+1; j&lt;n+n; j++) {<br />                    if (q[j].r&lt;=q[i].r) {<br />                        c++;<br />                        while (q[l].r&gt;q[i].r) l++;<br />                        if (c&gt;m) {<br />                            c--;<br />                            l++;<br />                            while (q[l].r&gt;q[i].r) l++;<br />                        }<br />                    }<br />                    if (j-l+1&lt;=n) {<br />                        if ((q[j].d - q[l].d) * q[i].r &lt; best)<br />                            best = (q[j].d - q[l].d) * q[i].r;<br />                    }<br />                }<br />            }<br />        }<br />        fprintf(Fou,&quot;Case #%d: %.2lf\n&quot;,tt,best/2);<br />    }<br />    return 0;<br />}</pre>
</div>
<br />
<div align="center">代码 1<br />
</div>
<br />
&nbsp;&nbsp;&nbsp; 我们队在比赛时，最后做的就是这题。TRY 打的代码，可惜一直 WRONG ANSWER。最后我们一起帮他找错误，可惜最终还是没 AC。事后我自己也做了一遍这道题，发现原来它的时间要求还是很严格的，开始我一直超时。后来看了 PROXIMA 的代码，才发现有一些常数级的优化是很有必要的：<br />
<ul>
 <li>两条边扫一圈的时候，最好以点为前进单位，而不要以角度为单位。<br />
 <br />
 &nbsp;&nbsp;&nbsp; 虽然这两种方法是等价的，但是后者需要先把角度相同的点都找出来，还要统计各个角度上分别有几个点，这要花费一些初始化的时间。然而，在最差情况下，每个点所在的角度都可以是不同的，那么以角度为前进单位就完全没有必要了，还白白浪费了初始化的时间。<br />
 <br />
 </li>
 <li>最好把所有点复制一份，把第二份的所有点的角度都加上 2&pi;。<br />
 <br />
 &nbsp;&nbsp;&nbsp; 也就是说，下标为 0 ~ N-1 的点是第一圈，下标为 N ~ 2N-1 的点是第二圈。这样一来，当扫完了一圈回到开头时，下标不必回到 0，直接走到 N 继续下去就好了。这可以节省很多 MOD 运算的时间。<br />
 </li>
</ul>
&nbsp;&nbsp;&nbsp; 然而，我认为<a href="#code-f">代码 1</a>有一个错误，他们是碰巧 AC 的。比如它对<a href="#data-f">数据 1</a>的输出是&ldquo;15.71&rdquo;，而我认为答案应该是&ldquo;17.67&rdquo;。我觉得问题出在<a href="#code-f">代码 1</a>的第 20 行，给点排序的关键字只有角度，而没有半径；这样，当快速排序后，处在相同角度的点的顺序就会不稳定。而在<a href="#code-f">代码 1</a> 的第 48 行可以看到，第一圈和第二圈的点是放在一起排序的，所以在排序之后，两圈点的相对顺序就有可能不同，最终导致搜索出错。<br />
<br />
<div align="center"><a name="data-f"></a>
<pre style="border: 1px inset ; margin: 0px; padding: 6px; overflow: auto; width: 500px; font-family: 'monospace'; height: 150px; background-color: rgb(255, 255, 255); text-align: left;">10 7<br />-3 0<br />1 -1<br />2 -3<br />-2 0<br />-1 2<br />0 3<br />1 2<br />2 1<br />0 -2<br />-3 -3<br /></pre>
<br />
数据 1 </div>
<br />
&nbsp;&nbsp;&nbsp; 不过还是那句话，人家 AC 了就是 AC 了，我们怎么就没有既错又 AC 的本事呢！...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2234422.html</guid>
        <pubDate>Tue, 30 Dec 2008 07:12:06 GMT</pubDate>
<category>acm</category>

        <category>杭州</category>

        <category>icpc</category>

        <category>杭电</category>

        <category>杭州电子科技大学</category>
      </item>

      <item>
        <title>ACM-ICPC 2008 杭州之旅</title>
        <link>http://imlazy.ycool.com/post.2209673.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; 随着这场比赛的结束，我的 ACM 选手生涯也告一段落。又一次接近银牌，但还是失败了。铜牌之路，我们这样戏称自己。<br />
<br />
&nbsp;&nbsp;&nbsp; 这次比赛还有一大收获，就是见到了清华 PROXIMA 队的三位天王，并且有幸与他们邻桌比赛，一睹了他的神速。比赛之后我问他们要了一份代码。他们人很大方，不仅毫不吝啬地给了我们代码，而且还让我们事后也发回给他们一份，因为当时他们没有带优盘。我在后面会一一分析他们的算法。<br />
<br />
<table width="" cellspacing="0" cellpadding="5" border="1" align="center" summary="">
 <tbody>
  <tr>
   <td align="center"><a target="_blank" href="http://node2.foto.ycstatic.com/200812/11/6/27333142o.jpg"><img border="0" src="http://node1.foto.ycstatic.com/200812/11/7/27333175.jpg" alt="" /></a><br />
   <br />
   比赛场馆：杭电体育馆，<br />
   CBA 浙江万马队主场</td>
   <td align="center"><a target="_blank" href="http://node1.foto.ycstatic.com/200812/11/2/27333138o.jpg"><img border="0" src="http://node1.foto.ycstatic.com/200812/11/3/27333171.jpg" alt="" /></a><br />
   <br />
   楼教主打代码时的风采</td>
   <td align="center"><a target="_blank" href="http://node1.foto.ycstatic.com/200812/03/a/27311034o.jpg"><img border="0" alt="" src="http://node1.foto.ycstatic.com/200812/03/1/27310289.jpg" /></a><br />
   <br />
   我们队的大牛：TRY</td>
  </tr>
  <tr>
   <td align="center"><a target="_blank" href="http://node2.foto.ycstatic.com/200812/11/7/27333143o.jpg"><img border="0" alt="" src="http://node1.foto.ycstatic.com/200812/11/8/27333176.jpg" /></a><br />
   <br />
   东华 TRY 队，从左至右：<br />
   TRY、我、FRANKHUHU</td>
   <td align="center"><a target="_blank" href="http://node2.foto.ycstatic.com/200812/11/8/27333144o.jpg"><img border="0" src="http://node2.foto.ycstatic.com/200812/11/9/27333177.jpg" alt="" /></a><br />
   <br />
   黄金雄在颁奖典礼上讲话</td>
   <td align="center"><a target="_blank" href="http://node3.foto.ycstatic.com/200812/03/e/27310878o.jpg"><img border="0" alt="" src="http://node3.foto.ycstatic.com/200812/03/b/27310939.jpg" /></a><br />
   <br />
   清华 PROXIMA 队的三位天王，<br />
   从左至右：周源、楼天成、朱泽园</td>
  </tr>
  <tr>
   <td align="left" colspan="3">西湖风景：</td>
  </tr>
  <tr>
   <td align="center"><a target="_blank" href="http://node1.foto.ycstatic.com/200812/11/3/27333139o.jpg"><img border="0" src="http://node1.foto.ycstatic.com/200812/11/4/27333172.jpg" alt="" /></a>    </td>
   <td align="center"><a target="_blank" href="http://node2.foto.ycstatic.com/200812/11/4/27333140o.jpg"><img border="0" src="http://node1.foto.ycstatic.com/200812/11/5/27333173.jpg" alt="" /></a>    </td>
   <td align="center"><a target="_blank" href="http://node1.foto.ycstatic.com/200812/11/1/27333137o.jpg"><img border="0" src="http://node1.foto.ycstatic.com/200812/11/2/27333170.jpg" alt="" /></a></td>
  </tr>
  <tr>
   <td align="center"><a target="_blank" href="http://node2.foto.ycstatic.com/200812/04/e/27312782o.jpg"><img border="0" alt="" src="http://node3.foto.ycstatic.com/200812/03/c/27310940.jpg" /></a>    </td>
   <td align="center"><a target="_blank" href="http://node2.foto.ycstatic.com/200812/11/5/27333141o.jpg"><img border="0" alt="" src="http://node1.foto.ycstatic.com/200812/11/6/27333174.jpg" /></a>    </td>
   <td align="center"><a target="_blank" href="http://node2.foto.ycstatic.com/200812/11/9/27333145o.jpg"><img border="0" alt="" src="http://node2.foto.ycstatic.com/200812/11/a/27333178.jpg" /></a></td>
  </tr>
 </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp; 由于单篇字数限制，接下来题目分析我就每题单独一篇文章了。虽然有很多事要忙，但是我一有空就会写点儿，会断断续续补全的，可能会花个大半年的时间吧。<br />
<br />
&nbsp;&nbsp;&nbsp; C. <a href="http://imlazy.ycool.com/post.2261251.html">Cryptography Reloaded</a><br />
&nbsp;&nbsp;&nbsp; D. <a target="_blank" href="http://imlazy.ycool.com/post.2234430.html">D&eacute;j&agrave; vu</a><br />
&nbsp;&nbsp;&nbsp; F. <a target="_blank" href="http://imlazy.ycool.com/post.2234422.html">Fire-Control System</a><br />
<br />
&nbsp;&nbsp;&nbsp; 未完待续&hellip;&hellip;...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2209673.html</guid>
        <pubDate>Wed, 03 Dec 2008 07:12:48 GMT</pubDate>
<category>acm</category>

        <category>杭州</category>

        <category>icpc</category>

        <category>杭电</category>

        <category>杭州电子科技大学</category>
      </item>

      <item>
        <title>PKU 3706， System Test。楼天成出的题很考验人。</title>
        <link>http://imlazy.ycool.com/post.2147565.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; <a target="_blank" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3706">PKU 3706</a> 的题意是说：一次编程比赛中有 N 个选手（1 &le; N &le; 40），M 道题目（1 &le; M &le; 40）。每个选手都有一个起平分，在 -2,000 ~ 2,000 之间；对于每道题，各个选手做出它所得到的分数各不相同，在 0 ~ 1,000 之间；如果没做出，都是得 0 分；总分就是起平分加上做出的题目的分数。总分越高的排名越靠前；每个选手都有一个编号，如果有选手总分相同，则编号越小的排名越靠前。最终，排在前 C<sub>1</sub> 名的选手进入决赛；从第 C<sub>1</sub> + 1 名开始，接下来 C<sub>2</sub> 人进入复活赛；最后 C<sub>3</sub>  人淘汰（C<sub>3</sub> = N - C<sub>1</sub>  - C<sub>2</sub>）。问可能有<strong>几种不同的</strong>比赛结果（分别是哪些人进入决赛，哪些人淘汰）。只要三个集合的人员都相同，即使排名不同，也算是相同的结果。比如有三个人进决赛，则前三名为&ldquo;甲、乙、丙&rdquo;与&ldquo;丙、乙、甲&rdquo;是同一个结果。<br />
<br />
&nbsp;&nbsp;&nbsp; 乍一看是挺难的，需要下面这个重要的结论作为突破口。如果一个人进入决赛了，则即使进把它的排名提前，把前面的人挤下来，决赛的名单也不会改变。同样，对于淘汰的人，即使排名下降，使其它淘汰的人排名上升，总的淘汰名单也不会改变。我们又知道，如果让一个人做出全部题目，则他的排名一定会提前或者不变；如果做出 0 题，则排名一定会下降或者不变。所以说，在一种比赛结果中，让任意进入决赛的选手做出 M 题，或者任意淘汰的选手做出 0 题，结果都是不会改变的。再转化一下，最终的结论就是：<br />
<br />
&nbsp;&nbsp;&nbsp; 在每一类等价的比赛结果中，一定有一个是<strong>所有</strong>进入<strong>决赛</strong>的人都得<strong>满分</strong>，而<strong>所有淘汰</strong>的人都得<strong>起平分</strong>。<br />
<br />
&nbsp;&nbsp;&nbsp; 因此，基本的大方向就是，枚举决赛的最后一名选手 a，和淘汰的第一名选手 b，在此基础上，选 C<sub>1</sub> - 1 个人放进决赛， C<sub>3</sub> - 1 个人淘汰，其余的人进入复活赛，统计有多少种选法。<br />
<br />
&nbsp;&nbsp;&nbsp; 对于一组 a 和 b，不是所有人都可以放进决赛、复活赛或淘汰的。比如一个选手的即使得满分也不如 a 的满分高（前面说了，进决赛的人都是满分），他就不可能进决赛；如果一个选手的起平分比 b 的起平分低，但是它每题的分数都很高，只要做出一题，就立刻超过 a 的满分，则他就不可能进复活赛。诸如此类的判断还需要一些小小的算法。<br />
<br />
&nbsp;&nbsp;&nbsp; 40 道题目的对错有 2<sup>40</sup> &asymp; 10<sup>12</sup> 种可能，但是一名选手的得分没有这么多种可能，因为每道题最多 1,000 分，所以总分一定在 -2,000 ~ 42,000 之间。因此，用一个简单的动态归划就可以算出一个选手的所有可能得分。为了方便比较，可以把选手编号融入到分数中去，即总分 = 原总分 &times; 100 + (100 - 编号)，这样就可以把总分和选手编号一起比较了，编号较小的，新分数末两位就会较大。<br />
<br />
&nbsp;&nbsp;&nbsp; 判断能不能进入决赛或淘汰，只要看满分和起平分就好了。判断能不能进入复活赛，则需要用二分搜索，看一名选手可能得的分当中，存不存在比 a 的满分低，并且比 b 的起平分高的。<br />
<br />
&nbsp;&nbsp;&nbsp; 下面要开始计数了，对于每一组 a 和 b，把其余选手分成下面几类：（为了说活方便，把进入决赛的选手称为集合 A，淘汰的称为集合 B，进入复活赛的称为集合 C）<br />
<br />
&nbsp;&nbsp;&nbsp; S<sub>1</sub>: 可以放进 A 的（满分比 a 的满分高）， S<sub>2</sub>: 可以放进 B 的（起平分比 b 的起平分低）， S<sub>3</sub>: 可以放进 C 的（存在一个可能的分数在 a 的满分与 b 的起平分之间）。<br />
&nbsp;&nbsp;&nbsp; S<sub>4</sub>: 只能放进 A 的（满足 S<sub>1</sub>，不满足 S<sub>2</sub> 和 S<sub>3</sub>）， S<sub>5</sub>: 只能放进 B 的（满足 S<sub>2</sub>，不满足 S<sub>1</sub> 和 S<sub>3</sub>）， S<sub>6</sub>: 只能放进 C 的（满足 S<sub>3</sub>，不满足 S<sub>1</sub> 和 S<sub>2</sub>）。<br />
&nbsp;&nbsp;&nbsp; S<sub>7</sub>: 只能放进 A 或 B 的（满足 S<sub>1</sub> 和 S<sub>2</sub>，不满足 S<sub>3</sub>）。<br />
&nbsp;&nbsp;&nbsp; S<sub>8</sub>: 只能放进 A 或 C 的（满足 S<sub>1</sub> 和 S<sub>3</sub>，不满足 S<sub>2</sub>）， S<sub>9</sub>: 只能放进 B 或 C 的（满足 S<sub>2</sub> 和 S<sub>3</sub>，不满足 S<sub>1</sub>）<br />
&nbsp;&nbsp;&nbsp; S<sub>10</sub>: 放进 A、 B 或 C 都有可能的（S<sub>1</sub>、 S<sub>2</sub> 和 S<sub>3</sub> 都满足）。<br />
<br />
&nbsp;&nbsp;&nbsp; 首先，如果 S<sub>1</sub>、 S<sub>2</sub> 和 S<sub>3</sub> 的人数没有分别达到 C<sub>1</sub> - 1、 C<sub>3</sub> - 1 和 C<sub>2</sub> ，则这组 a 和 b 是不可能的，直接就跳出了。<br />
<br />
&nbsp;&nbsp;&nbsp; 接下来，S<sub>4</sub> ~ S<sub>10</sub> 是两两不重叠的。对于 S<sub>4</sub>、 S<sub>5</sub> 和 S<sub>6</sub>，它们是铁定放进 A、 B 和 C 的，放进去之后，把 A、 B 和 C 剩下的空位数记作 D<sub>A</sub>、 D<sub>B</sub> 和 D<sub>C</sub>。<br />
<br />
&nbsp;&nbsp;&nbsp; 然后要从 S<sub>7</sub> 中分配 i 个人放进 A，其余的放进 B。枚举一下 i。<br />
<br />
&nbsp;&nbsp;&nbsp; 接着要从 S<sub>10</sub> 中分配 j 个人放进 C，剩下的人又要分配 k 个人放进 A，其余的放进 B。枚举一下 j 和 k。<br />
<br />
&nbsp;&nbsp;&nbsp; 最后，就是要从 S<sub>8</sub> 中分配 x = D<sub>A</sub> - i - k 个人放进 A，其余的放进 C；从 S<sub>9</sub> 中分配 y = D<sub>B</sub> - (|S<sub>7</sub>| - i) - (|S<sub>10</sub>| - j - k) 个人放进 B，其余的放进 C。因此，对于每组 i、 j 和 k，都有 <a href="http://www.codecogs.com" target="_blank"><img border="0" align="absmiddle" alt="C_{|S_7|}^i" src="http://www.codecogs.com/gif.latex?C_{|S_7|}^i" /></a> &times; <a href="http://www.codecogs.com" target="_blank"><img border="0" align="absmiddle" alt="C_{|S_{10}|}^j" src="http://www.codecogs.com/gif.latex?C_{|S_{10}|}^j" /></a> &times; <a href="http://www.codecogs.com" target="_blank"><img border="0" align="absmiddle" src="http://www.codecogs.com/gif.latex?C_{|S_{10}|-j}^k" alt="C_{|S_{10}|-j}^k" /></a> &times; <a href="http://www.codecogs.com" target="_blank"><img border="0" align="absmiddle" alt="C_{|S_8|}^x" src="http://www.codecogs.com/gif.latex?C_{|S_8|}^x" /></a> &times; <a href="http://www.codecogs.com" target="_blank"><img border="0" align="absmiddle" alt="C_{|S_9|}^y" src="http://www.codecogs.com/gif.latex?C_{|S_9|}^y" /></a> 种选法。<br />
<br />
&nbsp;&nbsp;&nbsp; 当然，枚举 i、 j 和 k 的时候不要忘了上限： i + j &le; D<sub>A</sub>；  (|S<sub>7</sub>| - i) + (|S<sub>10</sub>| - j - k)  &le; D<sub>B</sub>；x &le; |S<sub>8</sub>|； y &le; |S<sub>9</sub>|。<br />
<br />
&nbsp;&nbsp;&nbsp; 好了，这就是楼天成的杰作。说穿了每一步都不难，但是关键是要想得到那个突破口，并且把问题分析清楚。这种题目非常能区分出水平，真是好题。...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2147565.html</guid>
        <pubDate>Sat, 01 Nov 2008 13:11:48 GMT</pubDate>
<category>acm</category>

        <category>poj</category>

        <category>楼天成</category>
      </item>

      <item>
        <title>你看过韩国电影《黑帮高中》吗</title>
        <link>http://imlazy.ycool.com/post.2144717.html</link>
        <description><![CDATA[&nbsp;&nbsp;&nbsp; 告诉你一个秘密，这个电影是由我主演的。不过是反派男一号。有剧照为证。<br />
<br />
<div align="center"><img border="0" src="http://node2.foto.ycstatic.com/200810/27/1/27175745o.jpg" alt="" /><br />
<img border="0" alt="" src="http://node1.foto.ycstatic.com/200810/28/e/27178062o.jpg" /></div>...
]]></description>
        <guid isPermaLink="true">http://imlazy.ycool.com/post.2144717.html</guid>
        <pubDate>Mon, 27 Oct 2008 11:10:09 GMT</pubDate>
<category>电影</category>

        <category>韩国</category>

        <category>黑帮高中</category>
      </item>
    </channel>
  </rss>
