<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>海之树</title>
  <subtitle>The Tree Of The Sea</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://haizs.com/"/>
  <updated>2017-03-07T09:32:12.000Z</updated>
  <id>https://haizs.com/</id>
  
  <author>
    <name>Haizs Chen</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>修复 Hexo 日归档生成错误</title>
    <link href="https://haizs.com/post/fix-hexo-daily-archives-error/"/>
    <id>https://haizs.com/post/fix-hexo-daily-archives-error/</id>
    <published>2017-03-07T08:04:03.000Z</published>
    <updated>2017-03-07T09:32:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>Hexo 静态博客是好啊，但是还是有 bug 的。</p>
<p>虽然应该没多少人会用到日归档的功能，但是对我而言还是有用的，因为比如说过去贴代码那会儿好多天都是一天发几篇的，而且侧边栏还有个月历的挂件，因此还是把生成日归档的功能打开了。但是这个功能有个 bug，就是有的时候每个月之后生成第一天的日归档。</p>
<a id="more"></a>
<p>已经有人在 GitHub 上提交了 <a href="https://github.com/hexojs/hexo-generator-archive/issues/4" target="_blank" rel="external">issue</a>，不过看上去时间蛮久了也没改动，所以翻了下代码自己 <a href="https://github.com/Haizs/hexo-generator-archive/commit/9301189c4b324db9f9af998ddd3ff2d505a8370f" target="_blank" rel="external">commit</a> 修掉了，也提 PR 了但是过不了测试 <a href="#fn1" class="footnoteRef" id="fnref1"><sup>1</sup></a>，不是很懂 Node.js 所以也没继续去修。。</p>
<p>不过其实只加了对引号还是进文件自己改吧。</p>
<p>Hexo 根目录下的 <code>node_modules/hexo-generator-archive/lib/generator.js</code> 第 70 行改为</p>
<div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript">       <span class="cf">if</span> (<span class="op">!</span>posts[year][month].<span class="at">hasOwnProperty</span>(<span class="st">&#39;day&#39;</span>)) <span class="op">{</span></code></pre></div>
<p>保存后再运行 <code>hexo g</code> 应该就能正常生成日归档了。</p>
<div class="footnotes">
<hr>
<ol>
<li id="fn1"><p>我认为他测试用的判断逻辑有误。。<a href="#fnref1">↩</a></p></li>
</ol>
</div>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Hexo 静态博客是好啊，但是还是有 bug 的。&lt;/p&gt;
&lt;p&gt;虽然应该没多少人会用到日归档的功能，但是对我而言还是有用的，因为比如说过去贴代码那会儿好多天都是一天发几篇的，而且侧边栏还有个月历的挂件，因此还是把生成日归档的功能打开了。但是这个功能有个 bug，就是有的时候每个月之后生成第一天的日归档。&lt;/p&gt;
    
    </summary>
    
      <category term="技术探讨" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/"/>
    
      <category term="Hexo" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/Hexo/"/>
    
    
      <category term="bug-fix" scheme="https://haizs.com/tags/bug-fix/"/>
    
  </entry>
  
  <entry>
    <title>批量删除腾讯微博</title>
    <link href="https://haizs.com/post/delete-all-tweibo/"/>
    <id>https://haizs.com/post/delete-all-tweibo/</id>
    <published>2017-03-06T05:24:15.000Z</published>
    <updated>2017-03-07T09:22:28.000Z</updated>
    
    <content type="html"><![CDATA[<p>已经忘了什么时候开通的腾讯微博，大概是比注册新浪微博还早的时候，而且当时腾讯微博会默认自动同步空间说说的内容，导致删完说说之后还是会有所谓的黑历史留在腾讯微博上，一直有想删除的想法但是每次看到大几百的数量顿时就懒了。。这次终于是写了个脚本给批量删掉了。</p>
<p><em>这是自用笔记所以所写的代码有可能不是很通用，遇错请自行修改。。</em></p>
<a id="more"></a>
<ul>
<li>最简单的 js，直接复制到浏览器的 console 中运行，但是速度比较慢。</li>
</ul>
<div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">var</span> count <span class="op">=</span> <span class="dv">0</span><span class="op">;</span>
<span class="kw">function</span> <span class="at">clickdelbtn</span>() <span class="op">{</span>
    <span class="va">console</span>.<span class="at">log</span>(count <span class="op">+</span> <span class="st">&#39;-1&#39;</span>)<span class="op">;</span>
    <span class="va">document</span>.<span class="at">getElementsByClassName</span>(<span class="st">&#39;delBtn&#39;</span>)[<span class="dv">0</span>].<span class="at">click</span>()
    <span class="at">setTimeout</span>(clickdelchose<span class="op">,</span> <span class="dv">3000</span>)<span class="op">;</span>
<span class="op">}</span>
<span class="kw">function</span> <span class="at">clickdelchose</span>() <span class="op">{</span>
    <span class="va">console</span>.<span class="at">log</span>(count <span class="op">+</span> <span class="st">&#39;-2&#39;</span>)<span class="op">;</span>
    <span class="va">document</span>.<span class="at">getElementsByClassName</span>(<span class="st">&#39;delChose&#39;</span>)[<span class="dv">0</span>].<span class="at">children</span>[<span class="dv">2</span>].<span class="at">children</span>[<span class="dv">0</span>].<span class="at">click</span>()
    count <span class="op">+=</span> <span class="dv">1</span><span class="op">;</span>
    <span class="at">setTimeout</span>(clickdelbtn<span class="op">,</span> <span class="dv">3000</span>)<span class="op">;</span>
<span class="op">}</span></code></pre></div>
<ul>
<li>然后写了个 Python，需要用到 cookie，速度挺快但是删了大概几页之后会返回验证码，需要自己手动删一条填个验证码再继续跑。。</li>
</ul>
<div class="sourceCode"><pre class="sourceCode python"><code class="sourceCode python"><span class="im">import</span> requests
<span class="im">import</span> json
<span class="im">import</span> re
<span class="im">import</span> csv
<span class="im">import</span> time

talk_headers <span class="op">=</span> [<span class="st">&#39;bkname&#39;</span>, <span class="st">&#39;contAdd&#39;</span>, <span class="st">&#39;content&#39;</span>, <span class="st">&#39;count&#39;</span>, <span class="st">&#39;counts&#39;</span>, <span class="st">&#39;eventId&#39;</span>, <span class="st">&#39;flag&#39;</span>, <span class="st">&#39;from&#39;</span>, <span class="st">&#39;fromIco&#39;</span>, <span class="st">&#39;fromTxt&#39;</span>,
                <span class="st">&#39;fromid&#39;</span>, <span class="st">&#39;gender&#39;</span>, <span class="st">&#39;height&#39;</span>, <span class="st">&#39;height&#39;</span>, <span class="st">&#39;icon&#39;</span>, <span class="st">&#39;id&#39;</span>, <span class="st">&#39;image&#39;</span>, <span class="st">&#39;imageInfo&#39;</span>, <span class="st">&#39;img&#39;</span>, <span class="st">&#39;media&#39;</span>, <span class="st">&#39;miniMedia&#39;</span>,
                <span class="st">&#39;name&#39;</span>, <span class="st">&#39;nick&#39;</span>, <span class="st">&#39;node&#39;</span>, <span class="st">&#39;node&#39;</span>, <span class="st">&#39;passCert&#39;</span>, <span class="st">&#39;phoneCert&#39;</span>, <span class="st">&#39;pic&#39;</span>, <span class="st">&#39;qinfo&#39;</span>, <span class="st">&#39;realtime&#39;</span>, <span class="st">&#39;rich&#39;</span>, <span class="st">&#39;sign&#39;</span>,
                <span class="st">&#39;signIcon&#39;</span>, <span class="st">&#39;signSubType&#39;</span>, <span class="st">&#39;source&#39;</span>, <span class="st">&#39;status&#39;</span>, <span class="st">&#39;syncQzone&#39;</span>, <span class="st">&#39;tid&#39;</span>, <span class="st">&#39;time&#39;</span>, <span class="st">&#39;timestamp&#39;</span>, <span class="st">&#39;tran&#39;</span>, <span class="st">&#39;tv&#39;</span>,
                <span class="st">&#39;tvs&#39;</span>, <span class="st">&#39;type&#39;</span>, <span class="st">&#39;type&#39;</span>, <span class="st">&#39;type&#39;</span>, <span class="st">&#39;videos&#39;</span>, <span class="st">&#39;width&#39;</span>]

t_cookie <span class="op">=</span> <span class="st">&#39;&#39;</span>

talksCount <span class="op">=</span> <span class="dv">0</span>
lastTimestamp <span class="op">=</span> <span class="st">&#39;&#39;</span>lastId <span class="op">=</span><span class="st">&#39;&#39;</span>
startTime <span class="op">=</span> time.time()


<span class="kw">def</span> delTalk(talk):
    <span class="bu">print</span>(<span class="st">&#39;- - Delete Id:&#39;</span>, talk[<span class="st">&#39;id&#39;</span>])
    <span class="bu">print</span>(<span class="st">&#39;- - - Content:&#39;</span>, talk[<span class="st">&#39;content&#39;</span>])
    <span class="bu">print</span>(<span class="st">&#39;- - - Time:&#39;</span>, talk[<span class="st">&#39;time&#39;</span>])
    url <span class="op">=</span> <span class="st">&#39;http://api.t.qq.com/old/delete.php&#39;</span>
    payload <span class="op">=</span> {
        <span class="st">&#39;id&#39;</span>: talk[<span class="st">&#39;id&#39;</span>],
        <span class="st">&#39;apiType&#39;</span>: <span class="dv">14</span>,
        <span class="st">&#39;apiHost&#39;</span>: <span class="st">&#39;http://api.t.qq.com&#39;</span>
    }
    headers <span class="op">=</span> {
        <span class="st">&#39;Referer&#39;</span>: <span class="st">&#39;http://api.t.qq.com/proxy.html&#39;</span>,
        <span class="st">&#39;Cookie&#39;</span>: t_cookie
    }
    dsTime <span class="op">=</span> time.time()
    r <span class="op">=</span> requests.post(url, data<span class="op">=</span>payload, headers<span class="op">=</span>headers)
    data <span class="op">=</span> json.loads(
        r.text.replace(<span class="st">&#39;result&#39;</span>, <span class="st">&#39;&quot;result&quot;&#39;</span>).replace(<span class="st">&#39;msg&#39;</span>, <span class="st">&#39;&quot;msg&quot;&#39;</span>).replace(<span class="st">&#39;info&#39;</span>, <span class="st">&#39;&quot;info&quot;&#39;</span>).replace(<span class="st">&#39;</span><span class="ch">\&#39;</span><span class="st">&#39;</span>, <span class="st">&#39;&quot;&#39;</span>))
    <span class="cf">if</span> data[<span class="st">&#39;result&#39;</span>] <span class="op">!=</span> <span class="dv">0</span>:
        <span class="cf">raise</span> <span class="pp">RuntimeError</span>(<span class="st">&#39;Delete Failed.&#39;</span>)
    <span class="bu">print</span>(<span class="st">&#39;- - Msg:&#39;</span>, data[<span class="st">&#39;msg&#39;</span>], <span class="st">&#39;&#39;</span>, time.time() <span class="op">-</span> dsTime,<span class="st">&#39;seconds.&#39;</span>)


<span class="kw">def</span> handleTalks(talks):
    <span class="kw">global</span> talksCount, lastTimestamp, lastId
    <span class="cf">if</span> <span class="bu">len</span>(talks) <span class="op">==</span> <span class="dv">0</span>:
        <span class="cf">raise</span> <span class="pp">RuntimeError</span>(<span class="st">&#39;No talks.&#39;</span>)
    talksCount <span class="op">=</span> talksCount <span class="op">+</span> <span class="bu">len</span>(talks)
    <span class="bu">print</span>(<span class="st">&#39;- Got&#39;</span>, <span class="bu">len</span>(talks), <span class="st">&#39;Talks. Total:&#39;</span>, talksCount)
    lastId <span class="op">=</span> talks[<span class="bu">len</span>(talks) <span class="op">-</span> <span class="dv">1</span>][<span class="st">&#39;id&#39;</span>]
    lastTimestamp <span class="op">=</span> talks[<span class="bu">len</span>(talks) <span class="op">-</span> <span class="dv">1</span>][<span class="st">&#39;timestamp&#39;</span>]
    <span class="cf">with</span> <span class="bu">open</span>(<span class="st">&#39;talks.csv&#39;</span>, <span class="st">&#39;a&#39;</span>) <span class="im">as</span> f:
        f_csv <span class="op">=</span> csv.DictWriter(f, talk_headers)
        f_csv.writerows(talks)
    <span class="cf">for</span> talk <span class="kw">in</span> talks:
        delTalk(talk)


<span class="kw">def</span> getTalks(page):
    <span class="kw">global</span> lastTimestamp, lastId
    <span class="bu">print</span>(<span class="st">&#39;Page:&#39;</span>, page)
    url <span class="op">=</span> <span class="st">&#39;http://api.t.qq.com/asyn/index.php&#39;</span>
    <span class="cf">if</span> page <span class="op">&gt;</span> <span class="dv">1</span>:
        params <span class="op">=</span> {
            <span class="st">&#39;id&#39;</span>: lastId,
            <span class="st">&#39;time&#39;</span>: lastTimestamp,
            <span class="st">&#39;page&#39;</span>: page,
            <span class="st">&#39;isrecom&#39;</span>: <span class="dv">0</span>,
            <span class="st">&#39;apiType&#39;</span>: <span class="dv">14</span>,
            <span class="st">&#39;apiHost&#39;</span>: <span class="st">&#39;http://api.t.qq.com&#39;</span>
        }
    <span class="cf">else</span>:
        params <span class="op">=</span> {
            <span class="st">&#39;page&#39;</span>: page,
            <span class="st">&#39;isrecom&#39;</span>: <span class="dv">0</span>,
            <span class="st">&#39;apiType&#39;</span>: <span class="dv">14</span>,
            <span class="st">&#39;apiHost&#39;</span>: <span class="st">&#39;http://api.t.qq.com&#39;</span>
        }
    headers <span class="op">=</span> {
        <span class="st">&#39;Referer&#39;</span>: <span class="st">&#39;http://api.t.qq.com/proxy.html&#39;</span>,
        <span class="st">&#39;Cookie&#39;</span>: t_cookie
    }
    rsTime <span class="op">=</span> time.time()
    r <span class="op">=</span> requests.get(url, params<span class="op">=</span>params, headers<span class="op">=</span>headers)
    t <span class="op">=</span> re.sub(<span class="vs">r&quot;(msg:)\&#39;(.*?)\&#39;&quot;</span>, <span class="vs">r&#39;\1&quot;\2&quot;&#39;</span>, r.text)
    t <span class="op">=</span> re.sub(<span class="vs">r&quot;(\&#39;user\&#39;:)\&#39;(.*?)\&#39;&quot;</span>, <span class="vs">r&#39;\1&quot;\2&quot;&#39;</span>, t)
    data <span class="op">=</span> json.loads(t.replace(<span class="st">&#39;result&#39;</span>, <span class="st">&#39;&quot;result&quot;&#39;</span>).replace(<span class="st">&#39;msg&#39;</span>, <span class="st">&#39;&quot;msg&quot;&#39;</span>).replace(<span class="st">&#39;</span><span class="ch">\&#39;</span><span class="st">info</span><span class="ch">\&#39;</span><span class="st">&#39;</span>,<span class="st">&#39;&quot;info&quot;&#39;</span>) <span class="op">\</span>
                      .replace(<span class="st">&#39;</span><span class="ch">\&#39;</span><span class="st">user</span><span class="ch">\&#39;</span><span class="st">&#39;</span>,<span class="st">&#39;&quot;user&quot;&#39;</span>).replace(<span class="st">&#39;</span><span class="ch">\&#39;</span><span class="st">hasNext</span><span class="ch">\&#39;</span><span class="st">&#39;</span>, <span class="st">&#39;&quot;hasNext&quot;&#39;</span>).replace(<span class="st">&#39;</span><span class="ch">\&#39;</span><span class="st">time</span><span class="ch">\&#39;</span><span class="st">&#39;</span>,<span class="st">&#39;&quot;time&quot;&#39;</span>). <span class="op">\</span>
                      replace(<span class="st">&#39;</span><span class="ch">\&#39;</span><span class="st">talk</span><span class="ch">\&#39;</span><span class="st">&#39;</span>,<span class="st">&#39;&quot;talk&quot;&#39;</span>).replace(<span class="st">&#39;</span><span class="ch">\&#39;</span><span class="st">noSign</span><span class="ch">\&#39;</span><span class="st">&#39;</span>, <span class="st">&#39;&quot;noSign&quot;&#39;</span>) <span class="op">\</span>
                      .replace(<span class="st">&#39;</span><span class="ch">\&#39;</span><span class="st">signuserinfo</span><span class="ch">\&#39;</span><span class="st">&#39;</span>,<span class="st">&#39;&quot;signuserinfo&quot;&#39;</span>))
    <span class="bu">print</span>(<span class="st">&#39;- Connected:&#39;</span>, data[<span class="st">&#39;msg&#39;</span>], <span class="st">&#39;&#39;</span>, time.time() <span class="op">-</span> rsTime,<span class="st">&#39;seconds.&#39;</span>)
    <span class="cf">if</span> data[<span class="st">&#39;result&#39;</span>] <span class="op">!=</span> <span class="dv">0</span>:
        <span class="cf">raise</span> <span class="pp">RuntimeError</span>(<span class="st">&#39;No result.&#39;</span>)
    info <span class="op">=</span> data[<span class="st">&#39;info&#39;</span>]
    <span class="bu">print</span>(<span class="st">&#39;- User:&#39;</span>, info[<span class="st">&#39;user&#39;</span>])
    handleTalks(info[<span class="st">&#39;talk&#39;</span>])
    <span class="cf">if</span> info[<span class="st">&#39;hasNext&#39;</span>]:
        getTalks(page <span class="op">+</span> <span class="dv">1</span>)


<span class="cf">if</span> <span class="va">__name__</span> <span class="op">==</span> <span class="st">&#39;__main__&#39;</span>:
    <span class="bu">print</span>(<span class="st">&#39;Project Start.&#39;</span>)
    <span class="cf">with</span> <span class="bu">open</span>(<span class="st">&#39;talks.csv&#39;</span>, <span class="st">&#39;a&#39;</span>) <span class="im">as</span> f:
        f_csv <span class="op">=</span> csv.DictWriter(f, talk_headers)
        f_csv.writeheader()
    <span class="cf">try</span>:
        getTalks(<span class="dv">1</span>)
        <span class="bu">print</span>(<span class="st">&#39;---------------------------&#39;</span>)
        <span class="bu">print</span>(<span class="st">&#39;Deleted All&#39;</span>, talksCount, <span class="st">&#39;Talks.&#39;</span>)
        <span class="bu">print</span>(<span class="st">&#39;Runtime:&#39;</span>, time.time() <span class="op">-</span> startTime, <span class="st">&#39;seconds.&#39;</span>)
    <span class="cf">except</span> <span class="pp">RuntimeError</span> <span class="im">as</span> e:
        <span class="cf">for</span> i <span class="kw">in</span> e.args:
            <span class="bu">print</span>(i)</code></pre></div>
<p>不管怎样很快就能删完了，反正这种脚本也就只会用到一次╮(╯▽╰)╭。</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;已经忘了什么时候开通的腾讯微博，大概是比注册新浪微博还早的时候，而且当时腾讯微博会默认自动同步空间说说的内容，导致删完说说之后还是会有所谓的黑历史留在腾讯微博上，一直有想删除的想法但是每次看到大几百的数量顿时就懒了。。这次终于是写了个脚本给批量删掉了。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这是自用笔记所以所写的代码有可能不是很通用，遇错请自行修改。。&lt;/em&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="个人笔记" scheme="https://haizs.com/categories/%E4%B8%AA%E4%BA%BA%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="腾讯微博" scheme="https://haizs.com/tags/%E8%85%BE%E8%AE%AF%E5%BE%AE%E5%8D%9A/"/>
    
  </entry>
  
  <entry>
    <title>阿里云 ECS 系统设置初始化</title>
    <link href="https://haizs.com/post/initialize-ecs-system/"/>
    <id>https://haizs.com/post/initialize-ecs-system/</id>
    <published>2017-03-05T04:07:53.000Z</published>
    <updated>2017-03-07T09:25:18.000Z</updated>
    
    <content type="html"><![CDATA[<p>阿里云国际版真的是弄了特别多的优惠，之前活动每月 8 刀用了半年多的 HKB，速度什么的对于电信这种出国哪里都烂的真的是最满意的了，而且至少算是个大厂不用像之前各种换 VPS 那般折腾。</p>
<p>但是大概是秉承一贯的优良作风，阿里云所提供的系统模板并不是官方最初始的，比如添加了很多很多诸如自己的源地址之类的，或许对于位于国内的服务器有效果，但是为什么国际版也有这些乱七八糟的玩意啊，而且理论算是内网连接吧但是不知道速度是怎么回事还不如官方源快。</p>
<p>所以我都是重装系统后第一时间把这些配置文件初始化到默认状态。</p>
<a id="more"></a>
<ul>
<li>删除 apt 代理</li>
</ul>
<pre class="shell"><code>rm /etc/apt/apt.conf</code></pre>
<ul>
<li>恢复官方源地址</li>
</ul>
<pre class="shell"><code>vi /etc/apt/sources.list</code></pre>
<pre><code># Ubuntu 16.04
deb http://archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
## 测试版源
deb http://archive.ubuntu.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ xenial-proposed main restricted universe multiverse</code></pre>
<ul>
<li>修改 DNS 服务器</li>
</ul>
<pre class="shell"><code>vi /etc/resolvconf/resolv.conf.d/tail</code></pre>
<pre><code>options timeout:1 attempts:2 rotate
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 2001:4860:4860::8888</code></pre>
<ul>
<li>删除 pypi 代理</li>
</ul>
<pre class="shell"><code>rm ~/.pip/pip.conf</code></pre>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;阿里云国际版真的是弄了特别多的优惠，之前活动每月 8 刀用了半年多的 HKB，速度什么的对于电信这种出国哪里都烂的真的是最满意的了，而且至少算是个大厂不用像之前各种换 VPS 那般折腾。&lt;/p&gt;
&lt;p&gt;但是大概是秉承一贯的优良作风，阿里云所提供的系统模板并不是官方最初始的，比如添加了很多很多诸如自己的源地址之类的，或许对于位于国内的服务器有效果，但是为什么国际版也有这些乱七八糟的玩意啊，而且理论算是内网连接吧但是不知道速度是怎么回事还不如官方源快。&lt;/p&gt;
&lt;p&gt;所以我都是重装系统后第一时间把这些配置文件初始化到默认状态。&lt;/p&gt;
    
    </summary>
    
      <category term="个人笔记" scheme="https://haizs.com/categories/%E4%B8%AA%E4%BA%BA%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="阿里云" scheme="https://haizs.com/tags/%E9%98%BF%E9%87%8C%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>自定义 Hexo 博客</title>
    <link href="https://haizs.com/post/customize-hexo/"/>
    <id>https://haizs.com/post/customize-hexo/</id>
    <published>2017-03-04T15:34:45.000Z</published>
    <updated>2017-03-07T09:21:10.000Z</updated>
    
    <content type="html"><![CDATA[<p>换到了新的工具 Hexo 怎么能不折腾一下呢。</p>
<p>最主要的当然是十几天的时间自己写了一个主题。作为前端新手半抄半查的拼出来了至少能看的页面，好多 CSS 感觉蛮混乱的。不过用自己的主题有一点好的就是哪里出 bug 了看的不顺眼了很方便就知道是哪里的问题，可以随手改。</p>
<p>当然为了让博客符合自己的习惯，还是做了不少的自定义。</p>
<a id="more"></a>
<h2 id="hexo-theme-hai"><a href="https://github.com/Haizs/hexo-theme-hai" target="_blank" rel="external">hexo-theme-hai</a></h2>
<p>名字可以算是乱起的啦 =_=</p>
<p>还没完工，比如评论以及顶上的导航栏点进去的页面可以算是都还没弄。只是开学了想扔一段时间再说。。</p>
<h2 id="更换渲染引擎">更换渲染引擎</h2>
<p>因为要写 Latex 数学公式所以用了 Mathjax 渲染，但是默认的 markdown 渲染引擎会与数学公式所用到的下划线星号等有冲突，所以我是选择了 markdown 的扩展语法 Pandoc 进行渲染。首先要在自己的系统上 <a href="http://pandoc.org/installing.html" target="_blank" rel="external">安装 Pandoc</a>，然后是更换 hexo 的渲染引擎。</p>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="ex">brew</span> install pandoc
<span class="ex">npm</span> install hexo-renderer-pandoc --save</code></pre></div>
<h2 id="seo-优化">SEO 优化</h2>
<p>分别是生成 sitemap、RSS、给外站链接添加 nofollow 属性。</p>
<pre><code>npm install hexo-generator-sitemap --save
npm install hexo-generator-feed --save
npm install hexo-autonofollow --save</code></pre>
<h2 id="开启日归档">开启日归档</h2>
<p>因为主题用到了日历 widget 所以开启了日归档，修改 <code>node_modules/hexo-generator-archive/index.js</code> 中的 daily 参数。</p>
<div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="va">hexo</span>.<span class="va">config</span>.<span class="at">archive_generator</span> <span class="op">=</span> <span class="at">assign</span>(<span class="op">{</span>
  <span class="dt">per_page</span><span class="op">:</span> per_page<span class="op">,</span>
  <span class="dt">yearly</span><span class="op">:</span> <span class="kw">true</span><span class="op">,</span>
  <span class="dt">monthly</span><span class="op">:</span> <span class="kw">true</span><span class="op">,</span>
  <span class="dt">daily</span><span class="op">:</span> <span class="kw">true</span>
<span class="op">},</span> <span class="va">hexo</span>.<span class="va">config</span>.<span class="at">archive_generator</span>)<span class="op">;</span></code></pre></div>
<h2 id="添加置顶功能">添加置顶功能</h2>
<p>修改原生的首页生成方法 <code>node_modules/hexo-generator-index/lib/generator.js</code> 在 <code>return pagination</code> 前添加</p>
<div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript">    <span class="va">posts</span>.<span class="at">data</span> <span class="op">=</span> <span class="va">posts</span>.<span class="va">data</span>.<span class="at">sort</span>(<span class="kw">function</span> (a<span class="op">,</span> b) <span class="op">{</span>
        <span class="cf">if</span> (<span class="va">a</span>.<span class="at">top</span> <span class="op">&amp;&amp;</span> <span class="va">b</span>.<span class="at">top</span>) <span class="op">{</span>
            <span class="cf">if</span> (<span class="va">a</span>.<span class="at">top</span> <span class="op">==</span> <span class="va">b</span>.<span class="at">top</span>) <span class="cf">return</span> <span class="va">b</span>.<span class="at">date</span> <span class="op">-</span> <span class="va">a</span>.<span class="at">date</span><span class="op">;</span>
            <span class="cf">else</span> <span class="cf">return</span> <span class="va">b</span>.<span class="at">top</span> <span class="op">-</span> <span class="va">a</span>.<span class="at">top</span><span class="op">;</span>
        <span class="op">}</span>
        <span class="cf">else</span> <span class="cf">if</span> (<span class="va">a</span>.<span class="at">top</span> <span class="op">&amp;&amp;</span> <span class="op">!</span><span class="va">b</span>.<span class="at">top</span>) <span class="op">{</span>
            <span class="cf">return</span> <span class="op">-</span><span class="dv">1</span><span class="op">;</span>
        <span class="op">}</span>
        <span class="cf">else</span> <span class="cf">if</span> (<span class="op">!</span><span class="va">a</span>.<span class="at">top</span> <span class="op">&amp;&amp;</span> <span class="va">b</span>.<span class="at">top</span>) <span class="op">{</span>
            <span class="cf">return</span> <span class="dv">1</span><span class="op">;</span>
        <span class="op">}</span>
        <span class="cf">else</span> <span class="cf">return</span> <span class="va">b</span>.<span class="at">date</span> <span class="op">-</span> <span class="va">a</span>.<span class="at">date</span><span class="op">;</span>
    <span class="op">}</span>)<span class="op">;</span></code></pre></div>
<h2 id="中英文间添加空格">中英文间添加空格</h2>
<p>官方的插件许久不更新了，反正都是调用的 <a href="https://github.com/vinta/pangu.js" target="_blank" rel="external">pang.js</a>，于是干脆自己写了个调用的最新版的 <a href="https://github.com/Haizs/hexo-pangu-spacing" target="_blank" rel="external">hexo-pangu-spacing</a>，虽然好像时而会有莫名其妙的 bug 出现 <a href="#fn1" class="footnoteRef" id="fnref1"><sup>1</sup></a>。。。</p>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="ex">npm</span> install hexo-pangu-spacing --save</code></pre></div>
<h2 id="使用-prettify-高亮代码">使用 Prettify 高亮代码</h2>
<p>查了下这算是目前见到的唯一一款支持代码因网页宽度自适应换行后还能正确显示行号的 <a href="https://github.com/google/code-prettify" target="_blank" rel="external">代码高亮插件</a>，所以用到了自己的主题里，然后在配置文件_config.yml` 中关闭自带的代码高亮。</p>
<div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml"><span class="fu">highlight:</span>
  <span class="fu">enable:</span><span class="at"> false</span></code></pre></div>
<h2 id="修改永久链接格式">修改永久链接格式</h2>
<p>不是很喜欢链接中加日期以及希望能自己选择 url，所以配置文件 <code>_config.yml</code> 中修改了文章链接的格式。</p>
<div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml"><span class="fu">permalink:</span><span class="at"> post/:url/</span></code></pre></div>
<h2 id="修改默认-front-matter">修改默认 Front-matter</h2>
<p>修改生成文章的模板 <code>scaffolds/post.md</code>，在 Front-matter 部分添加</p>
<div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml"><span class="fu">tags:</span>
  <span class="kw">-</span> <span class="dt">null</span>
<span class="fu">categories:</span>
  <span class="kw">-</span> uncategorized
<span class="fu">mathjax:</span><span class="at"> false</span>
<span class="fu">top:</span><span class="at"> 0</span>
<span class="fu">url:</span><span class="at"> </span></code></pre></div>
<h2 id="使用-rsync-同步">使用 rsync 同步</h2>
<p>因为不知道什么的缘故我的 VPS 生成不了网页总是会在 <code>hexo g</code> 的时候卡住 <a href="#fn2" class="footnoteRef" id="fnref2"><sup>2</sup></a>，所以只能选择在本地生成好后复制到服务器上。</p>
<div class="sourceCode"><pre class="sourceCode bash"><code class="sourceCode bash"><span class="ex">npm</span> install hexo-deployer-rsync --save</code></pre></div>
<p>配置文件 <code>_config.yml</code> 中修改为</p>
<div class="sourceCode"><pre class="sourceCode yaml"><code class="sourceCode yaml"><span class="fu">deploy:</span>
  <span class="fu">type:</span><span class="at"> rsync</span>
  <span class="fu">host:</span><span class="at"> </span><span class="co">#服务器地址</span>
  <span class="fu">user:</span><span class="at"> root</span>
  <span class="fu">port:</span><span class="at"> 22</span>
  <span class="fu">root:</span><span class="at"> </span><span class="co">#服务器上的目录</span></code></pre></div>
<div class="footnotes">
<hr>
<ol>
<li id="fn1"><p>有的时候英文链接和中文之间不会加空格。。<a href="#fnref1">↩</a></p></li>
<li id="fn2"><p>大概是阿里云的 CPU 太差了？<a href="#fnref2">↩</a></p></li>
</ol>
</div>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;换到了新的工具 Hexo 怎么能不折腾一下呢。&lt;/p&gt;
&lt;p&gt;最主要的当然是十几天的时间自己写了一个主题。作为前端新手半抄半查的拼出来了至少能看的页面，好多 CSS 感觉蛮混乱的。不过用自己的主题有一点好的就是哪里出 bug 了看的不顺眼了很方便就知道是哪里的问题，可以随手改。&lt;/p&gt;
&lt;p&gt;当然为了让博客符合自己的习惯，还是做了不少的自定义。&lt;/p&gt;
    
    </summary>
    
      <category term="技术探讨" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/"/>
    
      <category term="Hexo" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/Hexo/"/>
    
    
      <category term="Hexo" scheme="https://haizs.com/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>Hello World, again!</title>
    <link href="https://haizs.com/post/hello-world-again/"/>
    <id>https://haizs.com/post/hello-world-again/</id>
    <published>2017-03-03T03:27:42.000Z</published>
    <updated>2017-03-07T09:19:44.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="时隔两年">时隔两年</h2>
<p>又是三月。距上一篇博文的发表已经过去两年的时光。其实这之中也曾想着有些东西可以写写放上来的，但是终究没有成文，于是还在登录 WordPress 后台的时候看到一篇不知啥时候留下的草稿惊讶了一小下。</p>
<p>依然三月。三年前第一篇博文也是写于三月的日子里。那么我想大概也可算是某种意义上的回归吧。在大学之后感觉更是需要写些什么锻炼下自己的语言表达能力呢。</p>
<h2 id="新的开始">新的开始</h2>
<p>切换到 Hexo 静态博客。</p>
<p>用上了自己写的主题。</p>
<p>从 OI 进阶到了 ACM.</p>
<p>Write the code. Change the world.</p>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;时隔两年&quot;&gt;时隔两年&lt;/h2&gt;
&lt;p&gt;又是三月。距上一篇博文的发表已经过去两年的时光。其实这之中也曾想着有些东西可以写写放上来的，但是终究没有成文，于是还在登录 WordPress 后台的时候看到一篇不知啥时候留下的草稿惊讶了一小下。&lt;/p&gt;
&lt;p&gt;依然三月。三年
    
    </summary>
    
      <category term="杂文随笔" scheme="https://haizs.com/categories/%E6%9D%82%E6%96%87%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="Hello-World" scheme="https://haizs.com/tags/Hello-World/"/>
    
  </entry>
  
  <entry>
    <title>Windows 设置开机自动与 Internet 同步时间</title>
    <link href="https://haizs.com/post/sync-time-when-boot/"/>
    <id>https://haizs.com/post/sync-time-when-boot/</id>
    <published>2015-03-27T05:18:17.000Z</published>
    <updated>2017-03-03T16:28:21.000Z</updated>
    
    <content type="html"><![CDATA[<p>前几天发现机房的电脑 CMOS 的电池没电了，除了几乎每一次开机都要按 F1 以及无法保存 BIOS 设置之外，最不爽的就是进入系统之后时间没办法自动更新了，那么我们就必须要让每次开机的时候都要求 Windows 自动联网同步时间了，这里我就介绍一种方法使用系统自带的 vbs 脚本来实现这一功能。</p>
<p>完成以下步骤之后每次开机登录只要能保证能正常联网就可以发现系统时间可以自动更正了。</p>
<a id="more"></a>
<p>首先我们新建一个文本文档，命名随意但后缀名设置为. vbs，比如我这里设置的就是 SyncTime.vbs，复制以下代码，保存到任意文件夹。</p>
<pre class="basic"><code>Set ws = CreateObject(&quot;Wscript.Shell&quot;) 
ws.run &quot;net start w32time&quot; , vbhide
ws.run &quot;w32tm /resync&quot; , vbhide</code></pre>
<p>打开任务计划程序（运行 -“taskschd.msc”），按如图设置添加进去上面那个脚本的位置。</p>
<div class="figure">
<img src="/images/post/sync-time-when-boot-1.png">

</div>
<div class="figure">
<img src="/images/post/sync-time-when-boot-2.png">

</div>
<div class="figure">
<img src="/images/post/sync-time-when-boot-3.png">

</div>
<p>确定之后正常情况这个脚本就可以在每次登录账户时运行了，而之后我们也可以在上次运行时间里检测它是否正常运行了。</p>
<p>那么注销或者重启看看效果吧 (●‘◡’●)。</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;前几天发现机房的电脑 CMOS 的电池没电了，除了几乎每一次开机都要按 F1 以及无法保存 BIOS 设置之外，最不爽的就是进入系统之后时间没办法自动更新了，那么我们就必须要让每次开机的时候都要求 Windows 自动联网同步时间了，这里我就介绍一种方法使用系统自带的 vbs 脚本来实现这一功能。&lt;/p&gt;
&lt;p&gt;完成以下步骤之后每次开机登录只要能保证能正常联网就可以发现系统时间可以自动更正了。&lt;/p&gt;
    
    </summary>
    
      <category term="技术探讨" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/"/>
    
      <category term="Windows" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/Windows/"/>
    
    
      <category term="任务计划" scheme="https://haizs.com/tags/%E4%BB%BB%E5%8A%A1%E8%AE%A1%E5%88%92/"/>
    
      <category term="时间同步" scheme="https://haizs.com/tags/%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5/"/>
    
  </entry>
  
  <entry>
    <title>[POI] 找到了《疑犯追踪》里官方对于 HR 的全称</title>
    <link href="https://haizs.com/post/hr-meaning-in-poi/"/>
    <id>https://haizs.com/post/hr-meaning-in-poi/</id>
    <published>2015-03-23T11:45:35.000Z</published>
    <updated>2017-03-03T15:59:12.000Z</updated>
    
    <content type="html"><![CDATA[<p>看 Person Of Interest 的观众一定会像我一样对于贯穿剧中前三季的邪恶组织 “HR” 颇有兴趣，这样两个字母代表的是什么意思呢？而官方对于这个问题的处理也是颇有趣味，从一开始这个组织的出场，到最后被主角一行人击溃，官方剧本里并未提及这两个字的全称，而维基百科上也只是说明了这是 A group of corrupt police officers work to control organized crime in New York.（于纽约警局内部由腐败警员所组成的组织，并有警方干部居中主导。）</p>
<p>那么其全称必然是引起了大家的关注，这样两个字母的全称到底是什么呢？Harold&amp;Reese？HuaiRen(坏人)？或者按中文维基的“高层”？。。。</p>
<p>殊不知，其实编剧已经在第二季中已经给出了答案。</p>
<p>这也是我第二次复习的时候发现的。</p>
<a id="more"></a>
<p>第二季第五集，大约是 14:31 的时候，出现了记者对于 HR 头目的报到，镜头给了新闻稿一个特写，从图片上可以看出有这样一句话：“Following yesterday’s massive arrests in the growing NYPD scandal, numerous sources confirm that the FBI is close to arresting the man in charge of the network of corrupt police known as’<span style="color:red;font-weight:bold">Human Resources</span>‘or’<span style="color:red;font-weight:bold">HR</span>’.”</p>
<div class="figure">
<img src="/images/post/hr-meaning-in-poi-1.jpg">

</div>
<p>于是呢，可以得到官方对于这个问题还是给出了答案的，那就是所谓的“人力资源”-Human Resources…</p>
<p>当然你想认为是 Harold&amp;Reese 或者 HuaiRen 的话… 嗯开心就好（≧∇≦）</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;看 Person Of Interest 的观众一定会像我一样对于贯穿剧中前三季的邪恶组织 “HR” 颇有兴趣，这样两个字母代表的是什么意思呢？而官方对于这个问题的处理也是颇有趣味，从一开始这个组织的出场，到最后被主角一行人击溃，官方剧本里并未提及这两个字的全称，而维基百科上也只是说明了这是 A group of corrupt police officers work to control organized crime in New York.（于纽约警局内部由腐败警员所组成的组织，并有警方干部居中主导。）&lt;/p&gt;
&lt;p&gt;那么其全称必然是引起了大家的关注，这样两个字母的全称到底是什么呢？Harold&amp;amp;Reese？HuaiRen(坏人)？或者按中文维基的“高层”？。。。&lt;/p&gt;
&lt;p&gt;殊不知，其实编剧已经在第二季中已经给出了答案。&lt;/p&gt;
&lt;p&gt;这也是我第二次复习的时候发现的。&lt;/p&gt;
    
    </summary>
    
      <category term="杂文随笔" scheme="https://haizs.com/categories/%E6%9D%82%E6%96%87%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="HR" scheme="https://haizs.com/tags/HR/"/>
    
      <category term="疑犯追踪" scheme="https://haizs.com/tags/%E7%96%91%E7%8A%AF%E8%BF%BD%E8%B8%AA/"/>
    
  </entry>
  
  <entry>
    <title>[iOS] 手动隐藏应用图标</title>
    <link href="https://haizs.com/post/ios-hide-icon/"/>
    <id>https://haizs.com/post/ios-hide-icon/</id>
    <published>2015-03-21T12:38:11.000Z</published>
    <updated>2017-03-03T16:02:56.000Z</updated>
    
    <content type="html"><![CDATA[<p>作为一名强迫症患者，那么必然会纠结于桌面图标的排列方式，而有时候主屏幕上就是多出了那么几个应用程序的图标破坏了那份完美，那么我们就需要将它们的图标隐藏起来，需要用得到时再用其他方式来打开。</p>
<p>对于一些系统级应用（比如 iTunes Store）我们可以通过打开访问限制来使其隐藏，那么其他的应用呢？越狱之后就有了无限的可能性，除了使用一些专门的软件来隐藏之外，还可以通过手动修改其配置文件来使其隐藏。</p>
<a id="more"></a>
<p>这里以如图所示的最后一个应用 Activator 为例，仅需简单三个步骤即可把它隐藏起来：</p>
<div class="figure">
<img src="/images/post/ios-hide-icon-1.png">

</div>
<ol style="list-style-type: decimal">
<li><p>使用 iFile 等程序以文本编辑模式打开该应用程序文件夹目录下的 Info.plist 文件。（系统级应用在 / Applications / 目录下，用户级应用在每个软件的 *.app / 目录下（注意这里 iOS7 和 iOS8 是不一样的位置））。</p></li>
<li><p>复制如下代码粘贴至第一个 &lt; dict &gt; 之后（或同级任意位置），如图。</p>
<pre><code>&lt;key&gt;SBAppTags&lt;/key&gt;
&lt;array&gt;
  &lt;string&gt;Hidden&lt;/string&gt;
&lt;/array&gt;</code></pre></li>
</ol>
<div class="figure">
<img src="/images/post/ios-hide-icon-2.png">

</div>
<ol start="3" style="list-style-type: decimal">
<li>保存，注销主屏幕（或者重启），即可看到图标已经消失，如果还想打开可设置如 Activator 手势之类的方式调用即可。</li>
</ol>
<div class="figure">
<img src="/images/post/ios-hide-icon-3.png">

</div>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;作为一名强迫症患者，那么必然会纠结于桌面图标的排列方式，而有时候主屏幕上就是多出了那么几个应用程序的图标破坏了那份完美，那么我们就需要将它们的图标隐藏起来，需要用得到时再用其他方式来打开。&lt;/p&gt;
&lt;p&gt;对于一些系统级应用（比如 iTunes Store）我们可以通过打开访问限制来使其隐藏，那么其他的应用呢？越狱之后就有了无限的可能性，除了使用一些专门的软件来隐藏之外，还可以通过手动修改其配置文件来使其隐藏。&lt;/p&gt;
    
    </summary>
    
      <category term="技术探讨" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/"/>
    
      <category term="iOS" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/iOS/"/>
    
    
      <category term="Jailbreak" scheme="https://haizs.com/tags/Jailbreak/"/>
    
  </entry>
  
  <entry>
    <title>完美解决 Windows 和 Mac OS 时间不同步的问题</title>
    <link href="https://haizs.com/post/timefix-for-windows-and-macos/"/>
    <id>https://haizs.com/post/timefix-for-windows-and-macos/</id>
    <published>2015-03-14T04:36:33.000Z</published>
    <updated>2017-03-03T16:32:10.000Z</updated>
    
    <content type="html"><![CDATA[<p>不论是黑苹果还是使用 Bootcamp，在安装了 Windows 和 Mac OS 双系统之后，我们会发现两个系统时间经常不同步，而每次进入系统都要修改时间会变得非常麻烦。究其原因是因为两个系统设定时间时以主板 CMOS 内的时间为依据，但却有不同的时间计算标准。所以导致了系统时间相差八小时。Windows 把系统硬件时间当作本地时间(local time)，即操作系统中显示的时间跟 BIOS 中显示的时间是一样的。Linux/Unix/Mac 把硬件时间当作 UTC，操作系统中显示的时间是硬件时间经过换算得来的，比如说北京时间是 GMT+8，则系统中显示时间是硬件时间 + 8。</p>
<p>当然解决这一问题的方法也很简单，就是让两个系统识别硬件时间的标准统一，以下推荐两种方法，选择其中之一就行了。</p>
<a id="more"></a>
<p>方法一：修改 Windows 注册表，让其将硬件时间识别为 UTC 时间。</p>
<p>打开运行窗口（Win 徽标 + R），输入 CMD（Vista 以上用户需要用管理员方式运行），输入以下命令并回车。</p>
<pre><code>Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1</code></pre>
<p>提示操作成功完成，重启即可发现 windows 时间恢复正常。</p>
<p>方法二：安装补丁，让 Mac 把硬件时间当作本地时间。</p>
<p>下载补丁文件 <a href="">LocalTimeToggle.pkg</a> 在 mac 中双击运行安装即可。</p>
<p>以上两种方式均可以解决 mac 和 win 时间不同步的问题，但就实现方式而言还是推荐修改 windows 注册表的方法。</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;不论是黑苹果还是使用 Bootcamp，在安装了 Windows 和 Mac OS 双系统之后，我们会发现两个系统时间经常不同步，而每次进入系统都要修改时间会变得非常麻烦。究其原因是因为两个系统设定时间时以主板 CMOS 内的时间为依据，但却有不同的时间计算标准。所以导致了系统时间相差八小时。Windows 把系统硬件时间当作本地时间(local time)，即操作系统中显示的时间跟 BIOS 中显示的时间是一样的。Linux/Unix/Mac 把硬件时间当作 UTC，操作系统中显示的时间是硬件时间经过换算得来的，比如说北京时间是 GMT+8，则系统中显示时间是硬件时间 + 8。&lt;/p&gt;
&lt;p&gt;当然解决这一问题的方法也很简单，就是让两个系统识别硬件时间的标准统一，以下推荐两种方法，选择其中之一就行了。&lt;/p&gt;
    
    </summary>
    
      <category term="技术探讨" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/"/>
    
      <category term="macOS" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/macOS/"/>
    
    
      <category term="Windows" scheme="https://haizs.com/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>Windows 8/8.1/10 去除快捷方式箭头</title>
    <link href="https://haizs.com/post/remove-shortcut-arrow/"/>
    <id>https://haizs.com/post/remove-shortcut-arrow/</id>
    <published>2015-03-10T08:29:36.000Z</published>
    <updated>2017-03-06T11:43:36.000Z</updated>
    
    <content type="html"><![CDATA[<p>大家在将一些程序添加到 Windows 桌面快捷方式的时候是否因为过左下角那个难看的箭头而希望去掉呢，不得不说下 Win10 里面把箭头带点透明然后再扁平一下变得更难看了。。。</p>
<p>网上有好多种去除快捷方式箭头的方法，这里介绍一种比较方便的方法吧，也是我一直以来使用的，亲测在 Windows 8 一直到 Windows 10 都是有效果的。</p>
<a id="more"></a>
<ol style="list-style-type: decimal">
<li><p>保存 <a href="/images/post/Empty.ico">Empty.ico</a> 到 <code>C:\windows</code> 中</p></li>
<li><p>新建文本文档，复制以下内容保存。</p></li>
</ol>
<pre class="reg"><code>Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]
&quot;29&quot;=&quot;C:\\Windows\\Empty.ico,0&quot;
</code></pre>
<ol start="3" style="list-style-type: decimal">
<li><p>修改后缀名为. reg，双击导入注册表。</p></li>
<li><p>注销或者重启。</p></li>
</ol>
<p>恢复的方式只需把. reg 文件内容替换为以下内容后导入注册表即可。</p>
<pre class="reg"><code>Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons]</code></pre>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;大家在将一些程序添加到 Windows 桌面快捷方式的时候是否因为过左下角那个难看的箭头而希望去掉呢，不得不说下 Win10 里面把箭头带点透明然后再扁平一下变得更难看了。。。&lt;/p&gt;
&lt;p&gt;网上有好多种去除快捷方式箭头的方法，这里介绍一种比较方便的方法吧，也是我一直以来使用的，亲测在 Windows 8 一直到 Windows 10 都是有效果的。&lt;/p&gt;
    
    </summary>
    
      <category term="技术探讨" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/"/>
    
      <category term="Windows" scheme="https://haizs.com/categories/%E6%8A%80%E6%9C%AF%E6%8E%A2%E8%AE%A8/Windows/"/>
    
    
      <category term="快捷方式" scheme="https://haizs.com/tags/%E5%BF%AB%E6%8D%B7%E6%96%B9%E5%BC%8F/"/>
    
  </entry>
  
  <entry>
    <title>[HDU4812] D Tree</title>
    <link href="https://haizs.com/post/hdu4812/"/>
    <id>https://haizs.com/post/hdu4812/</id>
    <published>2015-01-13T03:49:42.000Z</published>
    <updated>2017-03-03T15:44:23.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>There is a skyscraping tree standing on the playground of Nanjing University of Science and Technology. On each branch of the tree is an integer (The tree can be treated as a connected graph with N vertices, while each branch can be treated as a vertex). Today the students under the tree are considering a problem: Can we find such a chain on the tree so that the multiplication of all integers on the chain (mod 106 + 3) equals to K?</p>
<p>Can you help them in solving this problem?</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>There are several test cases, please process till EOF.<br>
Each test case starts with a line containing two integers N(1 &lt;= N &lt;= 105) and K(0 &lt;=K &lt; 106 + 3). The following line contains n numbers vi(1 &lt;= vi &lt; 106 + 3), where vi indicates the integer on vertex i. Then follows N - 1 lines. Each line contains two integers x and y, representing an undirected edge between vertex x and vertex y.</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>For each test case, print a single line containing two integers a and b (where a &lt; b), representing the two endpoints of the chain. If multiply solutions exist, please print the lexicographically smallest one. In case no solution exists, print “No solution”(without quotes) instead.<br>
For more information, please refer to the Sample Output below.</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>5 60<br>
2 5 2 3 3<br>
1 2<br>
1 3<br>
2 4<br>
2 5<br>
5 2<br>
2 5 2 3 3<br>
1 2<br>
1 3<br>
2 4<br>
2 5</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>3 4<br>
No solution</p>
</blockquote>
<hr>
<p><a href="http://acm.hdu.edu.cn/showproblem.php?pid=4812" target="_blank" rel="external">Hdu 4812</a></p>
<hr>
<h2 id="代码-code">代码 Code</h2>
<p>点分治 + 逆元 + Hash(其实可以不用)。各种 Debug 后自己都不认识了。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="pp">#pragma comment(linker,&quot;/STACK:102400000,102400000&quot;)</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">100005</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = <span class="dv">2</span> * maxn;
<span class="at">const</span> <span class="dt">int</span> mod = <span class="dv">1000003</span>;
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], son[maxn], val[maxn];
<span class="dt">int</span> mp[mod + <span class="dv">5</span>], use[mod + <span class="dv">5</span>];
<span class="dt">bool</span> vis[maxn];
<span class="dt">int</span> cnt, num, ans1, ans2, a, b, c, siz;
<span class="dt">long</span> <span class="dt">long</span> inv[mod + <span class="dv">5</span>];
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v)
{
    e[++cnt].to = v; e[cnt].nx = head[u];
    head[u] = cnt;
}
<span class="dt">int</span> ms[maxn], pos;
<span class="dt">void</span> dfs(<span class="dt">int</span> u, <span class="dt">int</span> fa)
{
    <span class="dt">int</span> i, v;
    son[u] = <span class="dv">1</span>;
    ms[u] = <span class="dv">0</span>;
    <span class="cf">for</span> (i = head[u]; i; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (v == fa || vis[v]) <span class="cf">continue</span>;
        dfs(v, u);
        son[u] += son[v];
        ms[u] = max(ms[u], son[v]);
    }
}
<span class="co">//================</span>
<span class="dt">void</span> findroot(<span class="dt">int</span> u, <span class="dt">int</span> fa, <span class="dt">int</span> all)
{
    <span class="dt">int</span> i, v;
    ms[u] = max(ms[u], all - son[u]);
    <span class="cf">if</span> (ms[u] &lt; ms[pos]) pos = u;
    <span class="cf">for</span> (i = head[u]; i; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (v == fa || vis[v]) <span class="cf">continue</span>;
        findroot(v, u, all);
    }
}
<span class="dt">int</span> getroot(<span class="dt">int</span> u)
{
    dfs(u, <span class="dv">-1</span>);
    pos = u;
    findroot(u, <span class="dv">-1</span>, son[u]);
    <span class="cf">return</span> pos;
}
<span class="co">//=============</span>
<span class="dt">void</span> calc(<span class="dt">int</span> u, <span class="dt">int</span> fa, <span class="dt">int</span> t)
{
    t = (<span class="dt">long</span> <span class="dt">long</span>)t * val[u] % mod;
    <span class="dt">int</span> i, v, c = (<span class="dt">long</span> <span class="dt">long</span>)k * inv[t] % mod;
    <span class="cf">if</span> (mp[c])
    {
        a = u; b = mp[c];
        <span class="cf">if</span> (a &gt; b) swap(a, b);
        <span class="cf">if</span> (a &lt; ans1) ans1 = a, ans2 = b;
        <span class="cf">else</span> <span class="cf">if</span> (a == ans1 &amp;&amp; b &lt; ans2) ans2 = b;
    }
    <span class="cf">for</span> (i = head[u]; i; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (!vis[v] &amp;&amp; v != fa) calc(v, u, t);
    }
}
<span class="dt">void</span> update(<span class="dt">int</span> u, <span class="dt">int</span> fa, <span class="dt">int</span> t)
{
    t = (<span class="dt">long</span> <span class="dt">long</span>)t * val[u] % mod;
    <span class="dt">int</span> i, v;
    <span class="cf">if</span> (!mp[t]) use[num++] = t, mp[t] = u;
    <span class="cf">else</span> mp[t] = min(mp[t], u);
    <span class="cf">for</span> (i = head[u]; i; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (!vis[v] &amp;&amp; v != fa) update(v, u, t);
    }
}
<span class="co">//=============</span>
<span class="dt">void</span> solve(<span class="dt">int</span> s)
{
    <span class="dt">int</span> i, v;
    mp[val[s]] = s;
    vis[s] = <span class="kw">true</span>; num = <span class="dv">0</span>;
    <span class="cf">for</span> (i = head[s]; i; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (!vis[v])
        {
            calc(v, s, <span class="dv">1</span>);
            update(v, s, val[s]);
        }
    }
    <span class="cf">for</span> (i = <span class="dv">0</span>; i &lt; num; i++) mp[use[i]] = <span class="dv">0</span>;
    mp[val[s]] = <span class="dv">0</span>;
    <span class="cf">for</span> (i = head[s]; i; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (!vis[v])
        {
            r = getroot(v);
            solve(r);
        }
    }
}
<span class="co">//=============</span>
<span class="dt">int</span> main()
{
    inv[<span class="dv">1</span>] = <span class="dv">1</span>;
    <span class="cf">for</span> (i = <span class="dv">2</span>; i &lt; mod; i++) inv[i] = (mod - mod / i) * inv[mod % i] % mod;
    <span class="cf">while</span> (scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;n, &amp;k) != EOF)
    {
        memset(head, <span class="dv">0</span>, <span class="kw">sizeof</span>(head));
        memset(vis, <span class="kw">false</span>, <span class="kw">sizeof</span>(vis));
        cnt = <span class="dv">0</span>;
        <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++) scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;val[i]);
        <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt; n; i++) scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;x, &amp;y), ins(x, y), ins(y, x);
        ans1 = ans2 = inf;
        r = getroot(<span class="dv">1</span>);
        solve(r);
        <span class="cf">if</span> (ans1 != inf) printf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st"> </span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans1, ans2);
        <span class="cf">else</span> printf(<span class="st">&quot;No solution</span><span class="sc">\n</span><span class="st">&quot;</span>);
    }
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;There is a skyscraping tree standing on the playground of Nanjing University of Science and Technology. On each branch of the tree is an integer (The tree can be treated as a connected graph with N vertices, while each branch can be treated as a vertex). Today the students under the tree are considering a problem: Can we find such a chain on the tree so that the multiplication of all integers on the chain (mod 106 + 3) equals to K?&lt;/p&gt;
&lt;p&gt;Can you help them in solving this problem?&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="点分治" scheme="https://haizs.com/tags/%E7%82%B9%E5%88%86%E6%B2%BB/"/>
    
      <category term="乘法逆元" scheme="https://haizs.com/tags/%E4%B9%98%E6%B3%95%E9%80%86%E5%85%83/"/>
    
      <category term="HDU" scheme="https://haizs.com/tags/HDU/"/>
    
  </entry>
  
  <entry>
    <title>[BZOJ2152] 聪聪可可</title>
    <link href="https://haizs.com/post/bzoj2152/"/>
    <id>https://haizs.com/post/bzoj2152/</id>
    <published>2015-01-13T03:39:28.000Z</published>
    <updated>2017-03-03T14:46:03.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>聪聪和可可是兄弟俩，他们俩经常为了一些琐事打起来，例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑（可是他们家只有一台电脑）…… 遇到这种问题，一般情况下石头剪刀布就好了，可是他们已经玩儿腻了这种低智商的游戏。他们的爸爸快被他们的争吵烦死了，所以他发明了一个新游戏：由爸爸在纸上画 n 个 “点”，并用 n-1 条“边” 把这 n 个 “点” 恰好连通（其实这就是一棵树）。并且每条 “边” 上都有一个数。接下来由聪聪和可可分别随即选一个点（当然他们选点时是看不到这棵树的），如果两个点之间所有边上数的和加起来恰好是 3 的倍数，则判聪聪赢，否则可可赢。聪聪非常爱思考问题，在每次游戏后都会仔细研究这棵树，希望知道对于这张图自己的获胜概率是多少。现请你帮忙求出这个值以验证聪聪的答案是否正确。</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>输入的第 1 行包含 1 个正整数 n。后面 n-1 行，每行 3 个整数 x、y、w，表示 x 号点和 y 号点之间有一条边，上面的数是 w。</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>以即约分数形式输出这个概率（即 “a/b” 的形式，其中 a 和 b 必须互质。如果概率为 1，输出“1/1”）。</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>5<br>
1 2 1<br>
1 3 2<br>
1 4 1<br>
2 5 3</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>13/25</p>
</blockquote>
<hr>
<p><a href="http://www.lydsy.com/JudgeOnline/problem.php?id=2152" target="_blank" rel="external">BZOJ 2152</a></p>
<hr>
<p>点分治，只需要统计边权除以三余数为 0,1,2 的情况即可。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">10005</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = maxn * <span class="dv">2</span>;
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, vl, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], dis[maxn], a[maxn], son[maxn];;
<span class="dt">bool</span> vis[maxn];
<span class="dt">int</span> cnt, num, ans, len, siz, c;
<span class="dt">void</span> dfs(<span class="dt">int</span> u, <span class="dt">int</span> fa)
{
    <span class="dt">int</span> i, t, v;
    son[u] = <span class="dv">1</span>;
    <span class="cf">for</span> (t = <span class="dv">0</span>, i = head[u]; i; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (!vis[v] &amp;&amp; v != fa)
        {
            dfs(v, u);
            son[u] += son[v];
            t = max(t, son[v]);
        }
    }
    t = max(t, m - son[u]);
    <span class="cf">if</span> (t &lt; siz) c = u, siz = t;
}
<span class="dt">int</span> getcenter(<span class="dt">int</span> s)
{
    c = <span class="dv">0</span>; siz = inf;
    dfs(s, <span class="dv">-1</span>);
    <span class="cf">return</span> c;
}
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v, <span class="dt">int</span> w)
{
    e[++cnt] = (edge)
    {
        v, w, head[u]
    }; head[u] = cnt;
    e[++cnt] = (edge)
    {
        u, w, head[v]
    }; head[v] = cnt;
}
<span class="dt">void</span> getarray(<span class="dt">int</span> u, <span class="dt">int</span> fa)
{
    <span class="dt">int</span> i, v, w;
    a[++len] = dis[u];
    <span class="cf">for</span> (i = head[u]; i; i = e[i].nx)
    {
        v = e[i].to; w = e[i].vl;
        <span class="cf">if</span> (!vis[v] &amp;&amp; v != fa) dis[v] = dis[u] + w, getarray(v, u);
    }
}
<span class="dt">int</span> calc(<span class="dt">int</span> u, <span class="dt">int</span> now)
{
    <span class="dt">int</span> ans = <span class="dv">0</span>;
    dis[u] = now; len = <span class="dv">0</span>;
    getarray(u, <span class="dv">-1</span>);
    sort(a + <span class="dv">1</span>, a + len + <span class="dv">1</span>);
    l = <span class="dv">1</span>; r = len;
    <span class="cf">while</span> (l &lt; r)
    {
        <span class="cf">if</span> (a[r] + a[l] &lt;= k) ans += (r - l), l++;
        <span class="cf">else</span> r--;
    }
    <span class="cf">return</span> ans;
}
<span class="dt">void</span> solve(<span class="dt">int</span> s)
{
    <span class="dt">int</span> i, v, w;
    ans += calc(s, <span class="dv">0</span>);
    vis[s] = <span class="kw">true</span>;
    <span class="cf">for</span> (i = head[s]; i; i = e[i].nx)
    {
        v = e[i].to; w = e[i].vl;
        <span class="cf">if</span> (!vis[v])
        {
            ans -= calc(v, w);
            m = son[v];
            r = getcenter(v);
            solve(r);
        }
    }
}
<span class="dt">int</span> main()
{
    <span class="cf">while</span> (scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;n, &amp;k) != EOF)
    {
        cnt = <span class="dv">0</span>;
        <span class="cf">if</span> (n == <span class="dv">0</span> &amp;&amp; k == <span class="dv">0</span>) <span class="cf">break</span>;
        memset(head, <span class="dv">0</span>, <span class="kw">sizeof</span>(head));
        memset(vis, <span class="dv">0</span>, <span class="kw">sizeof</span>(vis));
        <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt; n; i++) scanf(<span class="st">&quot;</span><span class="sc">%d%d%d</span><span class="st">&quot;</span>, &amp;x, &amp;y, &amp;z), ins(x, y, z);
        ans = <span class="dv">0</span>;
        m = n;
        r = getcenter(<span class="dv">1</span>);
        solve(r);
        printf(<span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans);
    }
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;聪聪和可可是兄弟俩，他们俩经常为了一些琐事打起来，例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑（可是他们家只有一台电脑）…… 遇到这种问题，一般情况下石头剪刀布就好了，可是他们已经玩儿腻了这种低智商的游戏。他们的爸爸快被他们的争吵烦死了，所以他发明了一个新游戏：由爸爸在纸上画 n 个 “点”，并用 n-1 条“边” 把这 n 个 “点” 恰好连通（其实这就是一棵树）。并且每条 “边” 上都有一个数。接下来由聪聪和可可分别随即选一个点（当然他们选点时是看不到这棵树的），如果两个点之间所有边上数的和加起来恰好是 3 的倍数，则判聪聪赢，否则可可赢。聪聪非常爱思考问题，在每次游戏后都会仔细研究这棵树，希望知道对于这张图自己的获胜概率是多少。现请你帮忙求出这个值以验证聪聪的答案是否正确。&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="BZOJ" scheme="https://haizs.com/tags/BZOJ/"/>
    
      <category term="点分治" scheme="https://haizs.com/tags/%E7%82%B9%E5%88%86%E6%B2%BB/"/>
    
  </entry>
  
  <entry>
    <title>[Poj1741] Tree</title>
    <link href="https://haizs.com/post/poj1741/"/>
    <id>https://haizs.com/post/poj1741/</id>
    <published>2015-01-13T01:53:16.000Z</published>
    <updated>2017-03-03T16:17:54.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>Give a tree with n vertices,each edge has a length(positive integer less than 1001).</p>
<p>Define dist(u,v)=The min distance between node u and v.</p>
<p>Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not exceed k.</p>
<p>Write a program that will count how many pairs which are valid for a given tree.</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>The input contains several test cases. The first line of each test case contains two integers n, k. (n&lt;=10000) The following n-1 lines each contains three integers u,v,l, which means there is an edge between node u and v of length l.<br>
The last test case is followed by two zeros.</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>For each test case output the answer on a single line.</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>5 4<br>
1 2 3<br>
1 3 1<br>
1 4 2<br>
3 5 1<br>
0 0</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>8</p>
</blockquote>
<hr>
<p><a href="http://poj.org/problem?id=1741" target="_blank" rel="external">POJ 1741</a></p>
<hr>
<h2 id="代码-code">代码 Code</h2>
<p>点分治。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">10005</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = maxn * <span class="dv">2</span>;
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, vl, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], dis[maxn], a[maxn], son[maxn];;
<span class="dt">bool</span> vis[maxn];
<span class="dt">int</span> cnt, num, ans, len, siz, c;
<span class="dt">void</span> dfs(<span class="dt">int</span> u, <span class="dt">int</span> fa)
{
    <span class="dt">int</span> i, t, v;
    son[u] = <span class="dv">1</span>;
    <span class="cf">for</span> (t = <span class="dv">0</span>, i = head[u]; i; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (!vis[v] &amp;&amp; v != fa)
        {
            dfs(v, u);
            son[u] += son[v];
            t = max(t, son[v]);
        }
    }
    t = max(t, m - son[u]);
    <span class="cf">if</span> (t &lt; siz) c = u, siz = t;
}
<span class="dt">int</span> getcenter(<span class="dt">int</span> s)
{
    c = <span class="dv">0</span>; siz = inf;
    dfs(s, <span class="dv">-1</span>);
    <span class="cf">return</span> c;
}
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v, <span class="dt">int</span> w)
{
    e[++cnt] = (edge)
    {
        v, w, head[u]
    }; head[u] = cnt;
    e[++cnt] = (edge)
    {
        u, w, head[v]
    }; head[v] = cnt;
}
<span class="dt">void</span> getarray(<span class="dt">int</span> u, <span class="dt">int</span> fa)
{
    <span class="dt">int</span> i, v, w;
    a[++len] = dis[u];
    <span class="cf">for</span> (i = head[u]; i; i = e[i].nx)
    {
        v = e[i].to; w = e[i].vl;
        <span class="cf">if</span> (!vis[v] &amp;&amp; v != fa) dis[v] = dis[u] + w, getarray(v, u);
    }
}
<span class="dt">int</span> calc(<span class="dt">int</span> u, <span class="dt">int</span> now)
{
    <span class="dt">int</span> ans = <span class="dv">0</span>;
    dis[u] = now; len = <span class="dv">0</span>;
    getarray(u, <span class="dv">-1</span>);
    sort(a + <span class="dv">1</span>, a + len + <span class="dv">1</span>);
    l = <span class="dv">1</span>; r = len;
    <span class="cf">while</span> (l &lt; r)
    {
        <span class="cf">if</span> (a[r] + a[l] &lt;= k) ans += (r - l), l++;
        <span class="cf">else</span> r--;
    }
    <span class="cf">return</span> ans;
}
<span class="dt">void</span> solve(<span class="dt">int</span> s)
{
    <span class="dt">int</span> i, v, w;
    ans += calc(s, <span class="dv">0</span>);
    vis[s] = <span class="kw">true</span>;
    <span class="cf">for</span> (i = head[s]; i; i = e[i].nx)
    {
        v = e[i].to; w = e[i].vl;
        <span class="cf">if</span> (!vis[v])
        {
            ans -= calc(v, w);
            m = son[v];
            r = getcenter(v);
            solve(r);
        }
    }
}
<span class="dt">int</span> main()
{
    <span class="cf">while</span> (scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;n, &amp;k) != EOF)
    {
        cnt = <span class="dv">0</span>;
        <span class="cf">if</span> (n == <span class="dv">0</span> &amp;&amp; k == <span class="dv">0</span>) <span class="cf">break</span>;
        memset(head, <span class="dv">0</span>, <span class="kw">sizeof</span>(head));
        memset(vis, <span class="dv">0</span>, <span class="kw">sizeof</span>(vis));
        <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt; n; i++) scanf(<span class="st">&quot;</span><span class="sc">%d%d%d</span><span class="st">&quot;</span>, &amp;x, &amp;y, &amp;z), ins(x, y, z);
        ans = <span class="dv">0</span>;
        m = n;
        r = getcenter(<span class="dv">1</span>);
        solve(r);
        printf(<span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans);
    }
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;Give a tree with n vertices,each edge has a length(positive integer less than 1001).&lt;/p&gt;
&lt;p&gt;Define dist(u,v)=The min distance between node u and v.&lt;/p&gt;
&lt;p&gt;Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not exceed k.&lt;/p&gt;
&lt;p&gt;Write a program that will count how many pairs which are valid for a given tree.&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="POJ" scheme="https://haizs.com/tags/POJ/"/>
    
      <category term="点分治" scheme="https://haizs.com/tags/%E7%82%B9%E5%88%86%E6%B2%BB/"/>
    
  </entry>
  
  <entry>
    <title>[POJ1655] Balancing Act</title>
    <link href="https://haizs.com/post/poj1655/"/>
    <id>https://haizs.com/post/poj1655/</id>
    <published>2015-01-09T14:45:05.000Z</published>
    <updated>2017-03-03T16:17:28.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>Consider a tree T with N (1 &lt;= N &lt;= 20,000) nodes numbered 1…N. Deleting any node from the tree yields a forest: a collection of one or more trees. Define the balance of a node to be the size of the largest tree in the forest T created by deleting that node from T.</p>
<p>For example, consider the tree:</p>
<div class="figure">
<img src="http://poj.org/images/1655_1.jpg">

</div>
<p>Deleting node 4 yields two trees whose member nodes are {5} and {1,2,3,6,7}. The larger of these two trees has five nodes, thus the balance of node 4 is five. Deleting node 1 yields a forest of three trees of equal size: {2,6}, {3,7}, and {4,5}. Each of these trees has two nodes, so the balance of node 1 is two.</p>
<p>For each input tree, calculate the node that has the minimum balance. If multiple nodes have equal balance, output the one with the lowest number.</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>The first line of input contains a single integer t (1 &lt;= t &lt;= 20), the number of test cases. The first line of each test case contains an integer N (1 &lt;= N &lt;= 20,000), the number of congruence. The next N-1 lines each contains two space-separated node numbers that are the endpoints of an edge in the tree. No edge will be listed twice, and all edges will be listed.</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>For each test case, print a line containing two integers, the number of the node with minimum balance and the balance of that node.</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>1<br>
7<br>
2 6<br>
1 2<br>
1 4<br>
4 5<br>
3 7<br>
3 1</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>1 2</p>
</blockquote>
<hr>
<p><a href="http://poj.org/problem?id=1655" target="_blank" rel="external">POJ 1655</a></p>
<hr>
<h2 id="代码-code">代码 Code</h2>
<p>找树的重心和去掉重心之后子树最多的节点数。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">20005</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = maxn * <span class="dv">2</span>;
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], used[maxn], son[maxn];
<span class="dt">int</span> cnt, num, T, ans, sum;
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v)
{
    e[++cnt] = (edge)
    {
        v, head[u]
    }; head[u] = cnt;
}
<span class="dt">void</span> dfs(<span class="dt">int</span> u, <span class="dt">int</span> fa, <span class="dt">int</span> tim)
{
    <span class="dt">int</span> i, t, v;
    son[u] = <span class="dv">1</span>;
    used[u] = tim;
    <span class="cf">for</span> (t = <span class="dv">0</span>, i = head[u]; i != <span class="dv">0</span>; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (used[v] != tim &amp;&amp; v != fa)
        {
            dfs(v, u, tim);
            son[u] += son[v];
            t = max(t, son[v]);
        }
    }
    t = max(t, n - son[u]);
    <span class="cf">if</span> ((t &lt; sum) || (t == sum &amp;&amp; ans &gt; u))
    {
        ans = u;
        sum = t;
    }
}
<span class="kw">inline</span> <span class="dt">void</span> getcenter(<span class="dt">int</span> s)
{
    ans = <span class="dv">0</span>; sum = inf;
    dfs(s, <span class="dv">-1</span>, ++num);
    printf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st"> </span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans, sum);
}
<span class="dt">int</span> main()
{
    num = <span class="dv">0</span>;
    scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;T);
    <span class="cf">while</span> (T--)
    {
        cnt = <span class="dv">0</span>;
        memset(head, <span class="dv">0</span>, <span class="kw">sizeof</span>(head));
        memset(son, <span class="dv">0</span>, <span class="kw">sizeof</span>(son));
        scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;n);
        <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt; n; i++)
        {
            scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;x, &amp;y);
            ins(x, y); ins(y, x);
        }
        getcenter(<span class="dv">1</span>);
    }
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;Consider a tree T with N (1 &amp;lt;= N &amp;lt;= 20,000) nodes numbered 1…N. Deleting any node from the tree yields a forest: a collection of one or more trees. Define the balance of a node to be the size of the largest tree in the forest T created by deleting that node from T.&lt;/p&gt;
&lt;p&gt;For example, consider the tree:&lt;/p&gt;
&lt;div class=&quot;figure&quot;&gt;
&lt;img src=&quot;http://poj.org/images/1655_1.jpg&quot;&gt;

&lt;/div&gt;
&lt;p&gt;Deleting node 4 yields two trees whose member nodes are {5} and {1,2,3,6,7}. The larger of these two trees has five nodes, thus the balance of node 4 is five. Deleting node 1 yields a forest of three trees of equal size: {2,6}, {3,7}, and {4,5}. Each of these trees has two nodes, so the balance of node 1 is two.&lt;/p&gt;
&lt;p&gt;For each input tree, calculate the node that has the minimum balance. If multiple nodes have equal balance, output the one with the lowest number.&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="搜索" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E6%90%9C%E7%B4%A2/"/>
    
    
      <category term="POJ" scheme="https://haizs.com/tags/POJ/"/>
    
      <category term="DFS" scheme="https://haizs.com/tags/DFS/"/>
    
  </entry>
  
  <entry>
    <title>[BZOJ2127] happiness</title>
    <link href="https://haizs.com/post/bzoj2127/"/>
    <id>https://haizs.com/post/bzoj2127/</id>
    <published>2015-01-09T07:41:45.000Z</published>
    <updated>2017-03-03T14:43:31.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>高一一班的座位表是个 n*m 的矩阵，经过一个学期的相处，每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了，每个同学对于选择文科与理科有着自己的喜悦值，而一对好朋友如果能同时选文科或者理科，那么他们又将收获一些喜悦值。作为计算机竞赛教练的 scp 大老板，想知道如何分配可以使得全班的喜悦值总和最大。</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>第一行两个正整数 n，m。接下来是六个矩阵第一个矩阵为 n 行 m 列 此矩阵的第 i 行第 j 列的数字表示座位在第 i 行第 j 列的同学选择文科获得的喜悦值。第二个矩阵为 n 行 m 列 此矩阵的第 i 行第 j 列的数字表示座位在第 i 行第 j 列的同学选择理科获得的喜悦值。第三个矩阵为 n-1 行 m 列 此矩阵的第 i 行第 j 列的数字表示座位在第 i 行第 j 列的同学与第 i+1 行第 j 列的同学同时选择文科获得的额外喜悦值。第四个矩阵为 n-1 行 m 列 此矩阵的第 i 行第 j 列的数字表示座位在第 i 行第 j 列的同学与第 i+1 行第 j 列的同学同时选择理科获得的额外喜悦值。第五个矩阵为 n 行 m-1 列 此矩阵的第 i 行第 j 列的数字表示座位在第 i 行第 j 列的同学与第 i 行第 j+1 列的同学同时选择文科获得的额外喜悦值。第六个矩阵为 n 行 m-1 列 此矩阵的第 i 行第 j 列的数字表示座位在第 i 行第 j 列的同学与第 i 行第 j+1 列的同学同时选择理科获得的额外喜悦值。</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>输出一个整数，表示喜悦值总和的最大值</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>2 3<br>
1534 2296 345<br>
551 1429 4085<br>
1488 2707 3095<br>
1198 3778 1811<br>
3571 4832 1658<br>
2894 2742 1118<br>
1690 2112<br>
1279 4179<br>
466 3002<br>
3977 4256</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>32532</p>
</blockquote>
<hr>
<p><a href="http://www.lydsy.com/JudgeOnline/problem.php?id=2127" target="_blank" rel="external">BZOJ 2127</a></p>
<hr>
<p>为求最大收益，则把所有可能的获益之和再减去为达到合理方案而减少的最少的收益，所以可得求最小割。分文理科考虑，源点与每个点建边容量为文科收益，每个点向汇点建边容量为理科收益，于是最后所有点会被分成两个集合，S 集合为选文科的，T 集合为选理科的。</p>
<p>对于相邻的同学，若两人选的相同科，则割掉另一科的边，若不同则两科边都需割掉，所以建图为源点向相邻同学建边容量为文科收益一半，相邻同学向汇点建边容量为理科收益一半，之间也建边，容量为文理各一半之和。为了精度先乘以二处理最后答案再除以二。</p>
<p>自己的程序时间不忍直视。。。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="pp">#include </span><span class="im">&lt;queue&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="pp">#define id(x,y) ((x-1)*m+y)</span>
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">105</span> * <span class="dv">105</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = maxn * <span class="dv">30</span>;
<span class="at">const</span> <span class="dt">int</span> dx[<span class="dv">5</span>] = {<span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">-1</span>};
<span class="at">const</span> <span class="dt">int</span> dy[<span class="dv">5</span>] = {<span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">-1</span>, <span class="dv">0</span>, <span class="dv">0</span>};<span class="co">//R,L,D,U</span>
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, fl, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], dis[maxn], used[maxn], cur[maxn];
<span class="dt">int</span> cnt, num, ans;
<span class="dt">int</span> a[<span class="dv">105</span>][<span class="dv">105</span>][<span class="dv">5</span>];
deque &lt;<span class="dt">int</span>&gt; q;
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v, <span class="dt">int</span> f)
{
    e[cnt] = (edge)
    {
        v, f, head[u]
    }; head[u] = cnt++;
    e[cnt] = (edge)
    {
        u, <span class="dv">0</span>, head[v]
    }; head[v] = cnt++;
}
<span class="kw">inline</span> <span class="dt">bool</span> bfs(<span class="dt">int</span> s, <span class="dt">int</span> t, <span class="dt">int</span> tim)
{
    <span class="dt">int</span> i, u, v;
    <span class="cf">while</span> (!q.empty()) q.pop_front();
    dis[s] = <span class="dv">0</span>; used[s] = tim;
    q.push_back(s);
    <span class="cf">while</span> (!q.empty())
    {
        u = q.front(); q.pop_front();
        <span class="cf">for</span> (i = head[u]; i != <span class="dv">-1</span>; i = e[i].nx)
        {
            v = e[i].to;
            <span class="cf">if</span> (used[v] != tim &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
            {
                used[v] = tim;
                dis[v] = dis[u] + <span class="dv">1</span>;
                q.push_back(v);
            }
        }
    }
    <span class="cf">return</span> (used[t] == tim);
}
<span class="dt">int</span> dfs(<span class="dt">int</span> u, <span class="dt">int</span> t, <span class="dt">int</span> flow)
{
    <span class="dt">int</span> v, d, f = flow;
    <span class="cf">if</span> (u == t) <span class="cf">return</span> flow;
    <span class="cf">for</span> (<span class="dt">int</span> &amp;i = cur[u]; i != <span class="dv">-1</span> &amp;&amp; f &gt; <span class="dv">0</span>; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (dis[v] == dis[u] + <span class="dv">1</span> &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
        {
            d = dfs(v, t, min(f, e[i].fl));
            e[i].fl -= d; e[i ^ <span class="dv">1</span>].fl += d;
            f -= d;
        }
    }
    <span class="cf">return</span> flow - f;
}
<span class="kw">inline</span> <span class="dt">void</span> dinic(<span class="dt">int</span> s, <span class="dt">int</span> t)
{
    <span class="cf">while</span> (bfs(s, t, ++num))
    {
        memcpy(cur, head, <span class="kw">sizeof</span>(head));
        ans -= dfs(s, t, inf);
    }
    printf(<span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans &gt;&gt; <span class="dv">1</span>);
}
<span class="dt">int</span> main()
{
    cnt = num = ans = <span class="dv">0</span>;
    memset(head, <span class="dv">-1</span>, <span class="kw">sizeof</span>(head));
    scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;n, &amp;m);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= m; j++)
        {
            scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;x);
            x &lt;&lt;= <span class="dv">1</span>;
            ans += x;
            ins(<span class="dv">0</span>, id(i, j), x);
        }
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= m; j++)
        {
            scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;x);
            x &lt;&lt;= <span class="dv">1</span>;
            ans += x;
            ins(id(i, j), n * m + <span class="dv">1</span>, x);
        }
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt; n; i++)
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= m; j++)
        {
            scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;x);
            ans += x &lt;&lt; <span class="dv">1</span>;
            ins(<span class="dv">0</span>, id(i, j), x);
            ins(<span class="dv">0</span>, id(i + <span class="dv">1</span>, j), x);
            a[i][j][<span class="dv">3</span>] = a[i + <span class="dv">1</span>][j][<span class="dv">4</span>] += x;
        }
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt; n; i++)
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= m; j++)
        {
            scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;x);
            ans += x &lt;&lt; <span class="dv">1</span>;
            ins(id(i, j), n * m + <span class="dv">1</span>, x);
            ins(id(i + <span class="dv">1</span>, j), n * m + <span class="dv">1</span>, x);
            a[i][j][<span class="dv">3</span>] = a[i + <span class="dv">1</span>][j][<span class="dv">4</span>] += x;
        }
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt; m; j++)
        {
            scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;x);
            ans += x &lt;&lt; <span class="dv">1</span>;
            ins(<span class="dv">0</span>, id(i, j), x);
            ins(<span class="dv">0</span>, id(i, j + <span class="dv">1</span>), x);
            a[i][j][<span class="dv">1</span>] = a[i][j + <span class="dv">1</span>][<span class="dv">2</span>] += x;
        }
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt; m; j++)
        {
            scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;x);
            ans += x &lt;&lt; <span class="dv">1</span>;
            ins(id(i, j), n * m + <span class="dv">1</span>, x);
            ins(id(i, j + <span class="dv">1</span>), n * m + <span class="dv">1</span> , x);
            a[i][j][<span class="dv">1</span>] = a[i][j + <span class="dv">1</span>][<span class="dv">2</span>] += x;
        }
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= m; j++)
            <span class="cf">for</span> (k = <span class="dv">1</span>; k &lt;= <span class="dv">4</span>; k++)
            {
                x = i + dx[k]; y = j + dy[k];
                <span class="cf">if</span> (x &gt; <span class="dv">0</span> &amp;&amp; x &lt;= n &amp;&amp; y &gt; <span class="dv">0</span> &amp;&amp; y &lt;= m) ins(id(i, j), id(x, y), a[i][j][k]);
            }
    dinic(<span class="dv">0</span>, n * m + <span class="dv">1</span>);
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;高一一班的座位表是个 n*m 的矩阵，经过一个学期的相处，每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了，每个同学对于选择文科与理科有着自己的喜悦值，而一对好朋友如果能同时选文科或者理科，那么他们又将收获一些喜悦值。作为计算机竞赛教练的 scp 大老板，想知道如何分配可以使得全班的喜悦值总和最大。&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="BZOJ" scheme="https://haizs.com/tags/BZOJ/"/>
    
      <category term="网络流" scheme="https://haizs.com/tags/%E7%BD%91%E7%BB%9C%E6%B5%81/"/>
    
      <category term="Dinic" scheme="https://haizs.com/tags/Dinic/"/>
    
      <category term="最小割" scheme="https://haizs.com/tags/%E6%9C%80%E5%B0%8F%E5%89%B2/"/>
    
  </entry>
  
  <entry>
    <title>[BZOJ3171]&amp;&amp;[Tjoi2013] 循环格</title>
    <link href="https://haizs.com/post/bzoj3171/"/>
    <id>https://haizs.com/post/bzoj3171/</id>
    <published>2015-01-08T15:54:28.000Z</published>
    <updated>2017-03-03T14:43:31.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>一个循环格就是一个矩阵，其中所有元素为箭头，指向相邻四个格子。每个元素有一个坐标（行，列），其中左上角元素坐标为（0,0）。给定一个起始位置（r，c），你可以沿着箭头防线在格子间行走。即如果（r,c）是一个左箭头，那么走到（r，c-1）; 如果是右箭头那么走到（r，c+1）；如果是上箭头那么走到（r-1，c）；如果是下箭头那么走到（r+1，c）；每一行和每一列都是循环的，即如果走出边界，你会出现在另一侧。</p>
<p>一个完美的循环格是这样定义的：对于任意一个起始位置，你都可以 i 沿着箭头最终回到起始位置。如果一个循环格不满足完美，你可以随意修改任意一个元素的箭头直到完美。给定一个循环格，你需要计算最少需要修改多少个元素使其完美。</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>第一行两个整数 R，C。表示行和列，接下来 R 行，每行 C 个字符 LRUD，表示左右上下。</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>一个整数，表示最少需要修改多少个元素使得给定的循环格完美</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>3 4<br>
RRRD<br>
URLL<br>
LRRR</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>2</p>
</blockquote>
<hr>
<p><a href="http://www.lydsy.com/JudgeOnline/problem.php?id=3171" target="_blank" rel="external">BZOJ 3171</a></p>
<hr>
<p>构成一个循环即每个格子出度入度都相等为一，所以每个格子拆成入点和出点，源向入点建边容量一费用零，出点向汇点建边容量一费用零，然后相邻格子建边容量一费用为是否需要改符号。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="pp">#include </span><span class="im">&lt;queue&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">20</span> * <span class="dv">20</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = maxn * <span class="dv">10</span>;
<span class="at">const</span> <span class="dt">int</span> dx[<span class="dv">5</span>] = {<span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">-1</span>};
<span class="at">const</span> <span class="dt">int</span> dy[<span class="dv">5</span>] = {<span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">-1</span>, <span class="dv">0</span>, <span class="dv">0</span>};
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, fl, co, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], dis[maxn], used[maxn], pre[maxn];
<span class="dt">int</span> cnt, num, c;
<span class="dt">char</span> ch[<span class="dv">20</span>];
deque &lt;<span class="dt">int</span>&gt; q;
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v, <span class="dt">int</span> f, <span class="dt">int</span> c)
{
    e[cnt] = (edge)
    {
        v, f, c, head[u]
    }; head[u] = cnt++;
    e[cnt] = (edge)
    {
        u, <span class="dv">0</span>, -c, head[v]
    }; head[v] = cnt++;
}
<span class="kw">inline</span> <span class="dt">bool</span> spfa(<span class="dt">int</span> s, <span class="dt">int</span> t, <span class="dt">int</span> tim)
{
    <span class="dt">int</span> i, u, v, w;
    <span class="cf">while</span> (!q.empty()) q.pop_front();
    <span class="cf">for</span> (i = s; i &lt;= t; i++) dis[i] = inf;
    dis[s] = <span class="dv">0</span>; used[s] = tim; pre[s] = <span class="dv">-1</span>;
    q.push_back(s);
    <span class="cf">while</span> (!q.empty())
    {
        u = q.front(); q.pop_front(); used[u] = <span class="dv">0</span>;
        <span class="cf">for</span> (i = head[u]; i != <span class="dv">-1</span>; i = e[i].nx)
        {
            v = e[i].to; w = e[i].co;
            <span class="cf">if</span> (dis[v] &gt; dis[u] + w &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
            {
                dis[v] = dis[u] + w;
                pre[v] = i;
                <span class="cf">if</span> (used[v] != tim)
                {
                    used[v] = tim;
                    <span class="cf">if</span> (!q.empty() &amp;&amp; dis[v] &lt; dis[q.front()]) q.push_front(v);
                    <span class="cf">else</span> q.push_back(v);
                }
            }
        }
    }
    <span class="cf">return</span> (dis[t] != inf);
}
<span class="kw">inline</span> <span class="dt">void</span> mcmf(<span class="dt">int</span> s, <span class="dt">int</span> t)
{
    <span class="dt">int</span> i, f, ans = <span class="dv">0</span>;
    <span class="cf">while</span> (spfa(s, t, ++num))
    {
        <span class="cf">for</span> (f = inf, i = pre[t]; i != <span class="dv">-1</span>; i = pre[e[i ^ <span class="dv">1</span>].to]) f = min(f, e[i].fl);
        ans += f * dis[t];
        <span class="cf">for</span> (i = pre[t]; i != <span class="dv">-1</span>; i = pre[e[i ^ <span class="dv">1</span>].to]) e[i].fl -= f, e[i ^ <span class="dv">1</span>].fl += f;
    }
    printf(<span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans);
}
<span class="dt">int</span> main()
{
    cnt = num = <span class="dv">0</span>;
    memset(head, <span class="dv">-1</span>, <span class="kw">sizeof</span>(head));
    scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;r, &amp;c);
    t = r  * c;
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= r; i++)
    {
        scanf(<span class="st">&quot;</span><span class="sc">%s</span><span class="st">&quot;</span>, ch + <span class="dv">1</span>);
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= c; j++)
        {
            ins(<span class="dv">0</span>, (i - <span class="dv">1</span>)*c + j, <span class="dv">1</span>, <span class="dv">0</span>);
            ins(t + (i - <span class="dv">1</span>)*c + j, <span class="dv">2</span> * t + <span class="dv">1</span>, <span class="dv">1</span>, <span class="dv">0</span>);
            <span class="cf">for</span> (k = <span class="dv">1</span>; k &lt;= <span class="dv">4</span>; k++)
            {
                x = i + dx[k]; <span class="cf">if</span> (x &gt; r) x = <span class="dv">1</span>; <span class="cf">if</span> (x &lt; <span class="dv">1</span>) x = r;
                y = j + dy[k]; <span class="cf">if</span> (y &gt; c) y = <span class="dv">1</span>; <span class="cf">if</span> (y &lt; <span class="dv">1</span>) y = c;
                <span class="cf">if</span> (k == <span class="dv">1</span>) ins((i - <span class="dv">1</span>)*c + j, t + (x - <span class="dv">1</span>)*c + y, <span class="dv">1</span>, (ch[j] == <span class="st">&#39;R&#39;</span>) ? <span class="dv">0</span> : <span class="dv">1</span>);
                <span class="cf">if</span> (k == <span class="dv">2</span>) ins((i - <span class="dv">1</span>)*c + j, t + (x - <span class="dv">1</span>)*c + y, <span class="dv">1</span>, (ch[j] == <span class="st">&#39;L&#39;</span>) ? <span class="dv">0</span> : <span class="dv">1</span>);
                <span class="cf">if</span> (k == <span class="dv">3</span>) ins((i - <span class="dv">1</span>)*c + j, t + (x - <span class="dv">1</span>)*c + y, <span class="dv">1</span>, (ch[j] == <span class="st">&#39;D&#39;</span>) ? <span class="dv">0</span> : <span class="dv">1</span>);
                <span class="cf">if</span> (k == <span class="dv">4</span>) ins((i - <span class="dv">1</span>)*c + j, t + (x - <span class="dv">1</span>)*c + y, <span class="dv">1</span>, (ch[j] == <span class="st">&#39;U&#39;</span>) ? <span class="dv">0</span> : <span class="dv">1</span>);
            }
        }
    }
    mcmf(<span class="dv">0</span>, <span class="dv">2</span> * t + <span class="dv">1</span>);
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;一个循环格就是一个矩阵，其中所有元素为箭头，指向相邻四个格子。每个元素有一个坐标（行，列），其中左上角元素坐标为（0,0）。给定一个起始位置（r，c），你可以沿着箭头防线在格子间行走。即如果（r,c）是一个左箭头，那么走到（r，c-1）; 如果是右箭头那么走到（r，c+1）；如果是上箭头那么走到（r-1，c）；如果是下箭头那么走到（r+1，c）；每一行和每一列都是循环的，即如果走出边界，你会出现在另一侧。&lt;/p&gt;
&lt;p&gt;一个完美的循环格是这样定义的：对于任意一个起始位置，你都可以 i 沿着箭头最终回到起始位置。如果一个循环格不满足完美，你可以随意修改任意一个元素的箭头直到完美。给定一个循环格，你需要计算最少需要修改多少个元素使其完美。&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="BZOJ" scheme="https://haizs.com/tags/BZOJ/"/>
    
      <category term="网络流" scheme="https://haizs.com/tags/%E7%BD%91%E7%BB%9C%E6%B5%81/"/>
    
      <category term="MCMF" scheme="https://haizs.com/tags/MCMF/"/>
    
      <category term="TJOI" scheme="https://haizs.com/tags/TJOI/"/>
    
  </entry>
  
  <entry>
    <title>[BZOJ1934]&amp;&amp;[Shoi2007] Vote 善意的投票</title>
    <link href="https://haizs.com/post/bzoj1934/"/>
    <id>https://haizs.com/post/bzoj1934/</id>
    <published>2015-01-08T05:51:30.000Z</published>
    <updated>2017-03-03T14:43:31.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>幼儿园里有 n 个小朋友打算通过投票来决定睡不睡午觉。对他们来说，这个问题并不是很重要，于是他们决定发扬谦让精神。虽然每个人都有自己的主见，但是为了照顾一下自己朋友的想法，他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。 我们的问题就是，每位小朋友应该怎样投票，才能使冲突数最小？</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>第一行只有两个整数 n，m，保证有 2≤n≤300，1≤m≤n(n-1)/2。其中 n 代表总人数，m 代表好朋友的对数。文件第二行有 n 个整数，第 i 个整数代表第 i 个小朋友的意愿，当它为 1 时表示同意睡觉，当它为 0 时表示反对睡觉。接下来文件还有 m 行，每行有两个整数 i，j。表示 i，j 是一对好朋友，我们保证任何两对 i，j 不会重复。</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>只需要输出一个整数，即可能的最小冲突数。</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>9 6<br>
1 1 1 1 1 0 1 0 0<br>
7 9<br>
4 3<br>
1 8<br>
2 7<br>
6 3<br>
3 2</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>3</p>
</blockquote>
<hr>
<p><a href="http://www.lydsy.com/JudgeOnline/problem.php?id=1934" target="_blank" rel="external">BZOJ 1934</a></p>
<hr>
<p>源点与同意的人建边容量无限，反对的人与汇点建边容量无限，互相是朋友的人建边容量一，求最小割。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="pp">#include </span><span class="im">&lt;queue&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">305</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = <span class="dv">3</span> * maxn * maxn;
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, fl, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], dis[maxn], used[maxn], cur[maxn];
<span class="dt">int</span> cnt, num;
deque &lt;<span class="dt">int</span>&gt; q;
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v, <span class="dt">int</span> f)
{
    e[cnt] = (edge)
    {
        v, f, head[u]
    }; head[u] = cnt++;
    e[cnt] = (edge)
    {
        u, <span class="dv">0</span>, head[v]
    }; head[v] = cnt++;
}
<span class="kw">inline</span> <span class="dt">bool</span> bfs(<span class="dt">int</span> s, <span class="dt">int</span> t, <span class="dt">int</span> tim)
{
    <span class="dt">int</span> i, u, v;
    <span class="cf">while</span> (!q.empty()) q.pop_front();
    dis[s] = <span class="dv">0</span>; used[s] = tim;
    q.push_back(s);
    <span class="cf">while</span> (!q.empty())
    {
        u = q.front(); q.pop_front();
        <span class="cf">for</span> (i = head[u]; i != <span class="dv">-1</span>; i = e[i].nx)
        {
            v = e[i].to;
            <span class="cf">if</span> (used[v] != tim &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
            {
                used[v] = tim;
                dis[v] = dis[u] + <span class="dv">1</span>;
                q.push_back(v);
            }
        }
    }
    <span class="cf">return</span> (used[t] == tim);
}
<span class="dt">int</span> dfs(<span class="dt">int</span> u, <span class="dt">int</span> t, <span class="dt">int</span> flow)
{
    <span class="dt">int</span> v, d, f = flow;
    <span class="cf">if</span> (u == t) <span class="cf">return</span> flow;
    <span class="cf">for</span> (<span class="dt">int</span> &amp;i = cur[u]; i != <span class="dv">-1</span> &amp;&amp; f &gt; <span class="dv">0</span>; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (dis[v] == dis[u] + <span class="dv">1</span> &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
        {
            d = dfs(v, t, min(f, e[i].fl));
            e[i].fl -= d; e[i ^ <span class="dv">1</span>].fl += d;
            f -= d;
        }
    }
    <span class="cf">return</span> flow - f;
}
<span class="kw">inline</span> <span class="dt">void</span> dinic(<span class="dt">int</span> s, <span class="dt">int</span> t)
{
    <span class="dt">int</span> ans = <span class="dv">0</span>;
    <span class="cf">while</span> (bfs(s, t, ++num))
    {
        memcpy(cur, head, <span class="kw">sizeof</span>(head));
        ans += dfs(s, t, inf);
    }
    printf(<span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans);
}
<span class="dt">int</span> main()
{
    cnt = num = <span class="dv">0</span>;
    memset(head, <span class="dv">-1</span>, <span class="kw">sizeof</span>(head));
    scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;n, &amp;m);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
    {
        scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;x);
        <span class="cf">if</span> (x == <span class="dv">1</span>) ins(<span class="dv">0</span>, i, <span class="dv">1</span>);
        <span class="cf">else</span> ins(i, n + <span class="dv">1</span>, <span class="dv">1</span>);
    }
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= m; i++)
    {
        scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;x, &amp;y);
        ins(x, y, <span class="dv">1</span>);
        ins(y, x, <span class="dv">1</span>);
    }
    dinic(<span class="dv">0</span>, n + <span class="dv">1</span>);
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;幼儿园里有 n 个小朋友打算通过投票来决定睡不睡午觉。对他们来说，这个问题并不是很重要，于是他们决定发扬谦让精神。虽然每个人都有自己的主见，但是为了照顾一下自己朋友的想法，他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。 我们的问题就是，每位小朋友应该怎样投票，才能使冲突数最小？&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="BZOJ" scheme="https://haizs.com/tags/BZOJ/"/>
    
      <category term="网络流" scheme="https://haizs.com/tags/%E7%BD%91%E7%BB%9C%E6%B5%81/"/>
    
      <category term="Dinic" scheme="https://haizs.com/tags/Dinic/"/>
    
      <category term="最小割" scheme="https://haizs.com/tags/%E6%9C%80%E5%B0%8F%E5%89%B2/"/>
    
      <category term="SHOI" scheme="https://haizs.com/tags/SHOI/"/>
    
  </entry>
  
  <entry>
    <title>[BZOJ1412]&amp;&amp;[ZJOI2009] 狼和羊的故事</title>
    <link href="https://haizs.com/post/bzoj1412/"/>
    <id>https://haizs.com/post/bzoj1412/</id>
    <published>2015-01-08T02:04:19.000Z</published>
    <updated>2017-03-03T14:43:31.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>“狼爱上羊啊爱的疯狂，谁让他们真爱了一场；狼爱上羊啊并不荒唐，他们说有爱就有方向．．．．．．” Orez 听到这首歌，心想：狼和羊如此和谐，为什么不尝试羊狼合养呢？说干就干！ Orez 的羊狼圈可以看作一个 n*m 个矩阵格子，这个矩阵的边缘已经装上了篱笆。可是 Drake 很快发现狼再怎么也是狼，它们总是对羊垂涎三尺，那首歌只不过是一个动人的传说而已。所以 Orez 决定在羊狼圈中再加入一些篱笆，还是要将羊狼分开来养。 通过仔细观察，Orez 发现狼和羊都有属于自己领地，若狼和羊们不能呆在自己的领地，那它们就会变得非常暴躁，不利于他们的成长。 Orez 想要添加篱笆的尽可能的短。当然这个篱笆首先得保证不能改变狼羊的所属领地，再就是篱笆必须修筑完整，也就是说必须修建在单位格子的边界上并且不能只修建一部分。</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>文件的第一行包含两个整数 n 和 m。接下来 n 行每行 m 个整数，1 表示该格子属于狼的领地，2 表示属于羊的领地，0 表示该格子不是任何一只动物的领地。</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>文件中仅包含一个整数 ans，代表篱笆的最短长度。</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>15 17<br>
1 0 1 2 2 1 0 0 1 2 0 2 2 2 0 2 0<br>
2 1 2 2 0 2 1 0 2 2 1 2 2 2 0 2 1<br>
1 1 0 1 1 2 0 2 2 0 0 0 2 0 2 2 2<br>
2 1 2 0 1 1 0 0 1 2 0 1 1 0 2 1 2<br>
2 1 0 0 1 0 0 2 2 1 1 1 2 1 2 0 0<br>
0 1 2 1 2 0 1 0 0 2 0 1 0 0 1 2 2<br>
1 0 1 1 0 1 1 0 1 0 1 2 2 0 2 0 0<br>
2 1 1 0 1 0 1 2 2 2 0 1 2 0 1 2 0<br>
2 1 1 2 1 1 2 2 0 1 2 2 2 0 2 1 2<br>
0 1 2 1 1 1 1 2 2 0 0 0 2 1 1 0 2<br>
0 1 0 2 1 1 1 2 2 1 0 1 1 1 1 0 2<br>
1 1 2 1 1 0 0 1 0 0 2 1 1 2 1 2 2<br>
0 1 0 0 0 2 2 0 0 0 2 2 0 1 0 1 1<br>
0 1 0 0 1 1 0 1 2 0 2 0 1 1 1 0 1<br>
1 1 0 2 2 1 0 0 0 0 1 2 0 1 2 2 0</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>169</p>
</blockquote>
<hr>
<p><a href="http://www.lydsy.com/JudgeOnline/problem.php?id=1412" target="_blank" rel="external">BZOJ 1412</a></p>
<hr>
<p>源点与狼建边容量无限，羊与汇点建边容量无限，中间相邻的狼向空点和羊、空点向空点和羊建边容量一，求最小割。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="pp">#include </span><span class="im">&lt;deque&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">10005</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = <span class="dv">5</span> * maxn;
<span class="at">const</span> <span class="dt">int</span> dx[<span class="dv">5</span>] = {<span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">-1</span>};
<span class="at">const</span> <span class="dt">int</span> dy[<span class="dv">5</span>] = {<span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">-1</span>, <span class="dv">0</span>, <span class="dv">0</span>};
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, fl, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], dis[maxn], used[maxn], cur[maxn];
<span class="dt">int</span> a[<span class="dv">105</span>][<span class="dv">105</span>];
<span class="dt">int</span> cnt, num;
deque &lt;<span class="dt">int</span>&gt; q;
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v, <span class="dt">int</span> f)
{
    e[cnt] = (edge)
    {
        v, f, head[u]
    }; head[u] = cnt++;
    e[cnt] = (edge)
    {
        u, <span class="dv">0</span>, head[v]
    }; head[v] = cnt++;
}
<span class="kw">inline</span> <span class="dt">bool</span> bfs(<span class="dt">int</span> s, <span class="dt">int</span> t, <span class="dt">int</span> tim)
{
    <span class="dt">int</span> i, u, v;
    <span class="cf">while</span> (!q.empty()) q.pop_front();
    dis[s] = <span class="dv">0</span>; used[s] = tim;
    q.push_back(s);
    <span class="cf">while</span> (!q.empty())
    {
        u = q.front(); q.pop_front();
        <span class="cf">for</span> (i = head[u]; i != <span class="dv">-1</span>; i = e[i].nx)
        {
            v = e[i].to;
            <span class="cf">if</span> (used[v] != tim &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
            {
                used[v] = tim;
                dis[v] = dis[u] + <span class="dv">1</span>;
                q.push_back(v);
            }
        }
    }
    <span class="cf">return</span> (used[t] == tim);
}
<span class="dt">int</span> dfs(<span class="dt">int</span> u, <span class="dt">int</span> t, <span class="dt">int</span> flow)
{
    <span class="dt">int</span> v, d, f = flow;
    <span class="cf">if</span> (u == t) <span class="cf">return</span> flow;
    <span class="cf">for</span> (<span class="dt">int</span> &amp;i = cur[u]; i != <span class="dv">-1</span>; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (dis[v] == dis[u] + <span class="dv">1</span> &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
        {
            d = dfs(v, t, min(f, e[i].fl));
            e[i].fl -= d; e[i ^ <span class="dv">1</span>].fl += d;
            f -= d;
            <span class="cf">if</span> (f == <span class="dv">0</span>) <span class="cf">break</span>;
        }
    }
    <span class="cf">return</span> flow - f;
}
<span class="kw">inline</span> <span class="dt">void</span> dinic(<span class="dt">int</span> s, <span class="dt">int</span> t)
{
    <span class="dt">int</span> ans = <span class="dv">0</span>;
    <span class="cf">while</span> (bfs(s, t, ++num))
    {
        memcpy(cur, head, <span class="kw">sizeof</span>(head));
        ans += dfs(s, t, inf);
    }
    printf(<span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans);
}
<span class="dt">int</span> main()
{
    cnt = num = <span class="dv">0</span>;
    memset(head, <span class="dv">-1</span>, <span class="kw">sizeof</span>(head));
    scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;n, &amp;m);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++) <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= m; j++) scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;a[i][j]);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
    {
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= m; j++)
        {
            <span class="cf">if</span> (a[i][j] == <span class="dv">1</span>) ins(<span class="dv">0</span>, m * (i - <span class="dv">1</span>) + j, inf);
            <span class="cf">if</span> (a[i][j] == <span class="dv">2</span>) ins(m * (i - <span class="dv">1</span>) + j, n * m + <span class="dv">1</span>, inf);
            <span class="cf">if</span> (a[i][j] != <span class="dv">2</span>)
            {
                <span class="cf">for</span> (k = <span class="dv">1</span>; k &lt;= <span class="dv">4</span>; k++)
                {
                    x = i + dx[k]; y = j + dy[k];
                    <span class="cf">if</span> (x &lt;= <span class="dv">0</span> || y &lt;= <span class="dv">0</span> || x &gt; n || y &gt; m) <span class="cf">continue</span>;
                    <span class="cf">if</span> ((a[i][j] != <span class="dv">2</span> &amp;&amp; a[x][y] != <span class="dv">1</span>)) ins(m * (i - <span class="dv">1</span>) + j, m * (x - <span class="dv">1</span>) + y, <span class="dv">1</span>);
                }
            }
        }
    }
    dinic(<span class="dv">0</span>, m * n + <span class="dv">1</span>);
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;“狼爱上羊啊爱的疯狂，谁让他们真爱了一场；狼爱上羊啊并不荒唐，他们说有爱就有方向．．．．．．” Orez 听到这首歌，心想：狼和羊如此和谐，为什么不尝试羊狼合养呢？说干就干！ Orez 的羊狼圈可以看作一个 n*m 个矩阵格子，这个矩阵的边缘已经装上了篱笆。可是 Drake 很快发现狼再怎么也是狼，它们总是对羊垂涎三尺，那首歌只不过是一个动人的传说而已。所以 Orez 决定在羊狼圈中再加入一些篱笆，还是要将羊狼分开来养。 通过仔细观察，Orez 发现狼和羊都有属于自己领地，若狼和羊们不能呆在自己的领地，那它们就会变得非常暴躁，不利于他们的成长。 Orez 想要添加篱笆的尽可能的短。当然这个篱笆首先得保证不能改变狼羊的所属领地，再就是篱笆必须修筑完整，也就是说必须修建在单位格子的边界上并且不能只修建一部分。&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="BZOJ" scheme="https://haizs.com/tags/BZOJ/"/>
    
      <category term="ZJOI" scheme="https://haizs.com/tags/ZJOI/"/>
    
      <category term="网络流" scheme="https://haizs.com/tags/%E7%BD%91%E7%BB%9C%E6%B5%81/"/>
    
      <category term="Dinic" scheme="https://haizs.com/tags/Dinic/"/>
    
      <category term="最小割" scheme="https://haizs.com/tags/%E6%9C%80%E5%B0%8F%E5%89%B2/"/>
    
  </entry>
  
  <entry>
    <title>[BZOJ1221]&amp;&amp;[HNOI2001] 软件开发</title>
    <link href="https://haizs.com/post/bzoj1221/"/>
    <id>https://haizs.com/post/bzoj1221/</id>
    <published>2015-01-07T16:00:22.000Z</published>
    <updated>2017-03-03T14:43:31.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>某软件公司正在规划一项 n 天的软件开发计划，根据开发计划第 i 天需要 ni 个软件开发人员，为了提高软件开发人员的效率，公司给软件人员提供了很多的服务，其中一项服务就是要为每个开发人员每天提供一块消毒毛巾，这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种，A 种方式的消毒需要 a 天时间，B 种方式的消毒需要 b 天（b&gt;a），A 种消毒方式的费用为每块毛巾 fA, B 种消毒方式的费用为每块毛巾 fB，而买一块新毛巾的费用为 f（新毛巾是已消毒的，当天可以使用）；而且 f&gt;fA&gt;fB。公司经理正在规划在这 n 天中，每天买多少块新毛巾、每天送多少块毛巾进行 A 种消毒和每天送多少块毛巾进行 B 种消毒。当然，公司经理希望费用最低。你的任务就是：为该软件公司计划每天买多少块毛巾、每天多少块毛巾进行 A 种消毒和多少毛巾进行 B 种消毒，使公司在这项 n 天的软件开发中，提供毛巾服务的总费用最低。</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>第 1 行为 n,a,b,f,fA,fB. 第 2 行为 n1，n2，……，nn. （注：1≤f,fA,fB≤60，1≤n≤1000）</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>最少费用</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>10 2 5 10 7 5<br>
71 17 93 10 82 38 92 4 66 14</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>3947</p>
</blockquote>
<hr>
<p><a href="http://www.lydsy.com/JudgeOnline/problem.php?id=1221" target="_blank" rel="external">BZOJ 1221</a></p>
<hr>
<p>把每天分为二分图两个集合中的顶点 Xi,Yi，建立附加源 S 汇 T。二分图 X 集合中顶点 Xi 表示第 i 天用完的餐巾, Y 集合中每个点 Yi 则是第 i 天需要的餐巾.</p>
<p>1、从 S 向每个 Xi 连一条容量为 ri，费用为 0 的有向边。</p>
<p>2、从每个 Yi 向 T 连一条容量为 ri，费用为 0 的有向边。</p>
<p>3、从 S 向每个 Yi 连一条容量为无穷大，费用为 p 的有向边。</p>
<p>4、从每个 Xi 向 Xi+1(i+1&lt;=N) 连一条容量为无穷大，费用为 0 的有向边。</p>
<p>5、从每个 Xi 向 Yi+m(i+m&lt;=N) 连一条容量为无穷大，费用为 f 的有向边。</p>
<p>6、从每个 Xi 向 Yi+n(i+n&lt;=N) 连一条容量为无穷大，费用为 s 的有向边。</p>
<p>求网络最小费用最大流，费用流值就是要求的最小总花费。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="pp">#include </span><span class="im">&lt;queue&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">2005</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = <span class="dv">6</span> * maxn;
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="dt">int</span> cnt, num, a, b, f, fa, fb;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, fl, co, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], dis[maxn], used[maxn], pre[maxn];
deque &lt;<span class="dt">int</span>&gt; q;
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v, <span class="dt">int</span> f, <span class="dt">int</span> c)
{
    e[cnt] = (edge)
    {
        v, f, c, head[u]
    };
    head[u] = cnt++;
    e[cnt] = (edge)
    {
        u, <span class="dv">0</span>, -c, head[v]
    };
    head[v] = cnt++;
}
<span class="kw">inline</span> <span class="dt">bool</span> spfa(<span class="dt">int</span> s, <span class="dt">int</span> t, <span class="dt">int</span> tim)
{
    <span class="dt">int</span> i, u, v, w;
    <span class="cf">while</span> (!q.empty()) q.pop_front();
    <span class="cf">for</span> (i = s; i &lt;= t; i++) dis[i] = inf;
    dis[s] = <span class="dv">0</span>; used[s] = tim; pre[s] = <span class="dv">-1</span>;
    q.push_back(s);
    <span class="cf">while</span> (!q.empty())
    {
        u = q.front(); q.pop_front(); used[u] = <span class="dv">0</span>;
        <span class="cf">for</span> (i = head[u]; i != <span class="dv">-1</span>; i = e[i].nx)
        {
            v = e[i].to; w = e[i].co;
            <span class="cf">if</span> (dis[v] &gt; dis[u] + w &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
            {
                dis[v] = dis[u] + w;
                pre[v] = i;
                <span class="cf">if</span> (used[v] != tim)
                {
                    used[v] = tim;
                    <span class="cf">if</span> (!q.empty() &amp;&amp; dis[v] &lt; dis[q.front()]) q.push_front(v);
                    <span class="cf">else</span> q.push_back(v);
                }
            }
        }
    }
    <span class="cf">return</span> (dis[t] != inf);
}
<span class="kw">inline</span> <span class="dt">void</span> mcmf(<span class="dt">int</span> s, <span class="dt">int</span> t)
{
    <span class="dt">int</span> i, f, ans = <span class="dv">0</span>;
    <span class="cf">while</span> (spfa(s, t, ++num))
    {
        <span class="co">// cout &lt;&lt; &quot; &quot; &lt;&lt; ans &lt;&lt; endl;</span>
        <span class="cf">for</span> (f = inf, i = pre[t]; i != <span class="dv">-1</span>; i = pre[e[i ^ <span class="dv">1</span>].to]) f = min(f, e[i].fl);
        <span class="cf">for</span> (i = pre[t]; i != <span class="dv">-1</span>; i = pre[e[i ^ <span class="dv">1</span>].to]) e[i].fl -= f, e[i ^ <span class="dv">1</span>].fl += f;
        ans += f * dis[t];
    }
    printf(<span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span>, ans);
}
<span class="dt">int</span> main()
{
    cnt = num = <span class="dv">0</span>;
    memset(head, <span class="dv">-1</span>, <span class="kw">sizeof</span>(head));
    scanf(<span class="st">&quot;</span><span class="sc">%d%d%d%d%d%d</span><span class="st">&quot;</span>, &amp;n, &amp;a, &amp;b, &amp;f, &amp;fa, &amp;fb);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
    {
        scanf(<span class="st">&quot;</span><span class="sc">%d</span><span class="st">&quot;</span>, &amp;x);
        ins(<span class="dv">0</span>, i, x, <span class="dv">0</span>);
        ins(n + i, <span class="dv">2</span> * n + <span class="dv">1</span>, x, <span class="dv">0</span>);
        ins(<span class="dv">0</span>, n + i, inf, f);
    }
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt; n; i++) ins(i, i + <span class="dv">1</span>, inf, <span class="dv">0</span>);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i + a + <span class="dv">1</span> &lt;= n; i++) ins(i, n + i + a + <span class="dv">1</span>, inf, fa);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i + b + <span class="dv">1</span> &lt;= n; i++) ins(i, n + i + b + <span class="dv">1</span>, inf, fb);
    mcmf(<span class="dv">0</span>, <span class="dv">2</span> * n + <span class="dv">1</span>);
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;某软件公司正在规划一项 n 天的软件开发计划，根据开发计划第 i 天需要 ni 个软件开发人员，为了提高软件开发人员的效率，公司给软件人员提供了很多的服务，其中一项服务就是要为每个开发人员每天提供一块消毒毛巾，这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种，A 种方式的消毒需要 a 天时间，B 种方式的消毒需要 b 天（b&amp;gt;a），A 种消毒方式的费用为每块毛巾 fA, B 种消毒方式的费用为每块毛巾 fB，而买一块新毛巾的费用为 f（新毛巾是已消毒的，当天可以使用）；而且 f&amp;gt;fA&amp;gt;fB。公司经理正在规划在这 n 天中，每天买多少块新毛巾、每天送多少块毛巾进行 A 种消毒和每天送多少块毛巾进行 B 种消毒。当然，公司经理希望费用最低。你的任务就是：为该软件公司计划每天买多少块毛巾、每天多少块毛巾进行 A 种消毒和多少毛巾进行 B 种消毒，使公司在这项 n 天的软件开发中，提供毛巾服务的总费用最低。&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="BZOJ" scheme="https://haizs.com/tags/BZOJ/"/>
    
      <category term="HNOI" scheme="https://haizs.com/tags/HNOI/"/>
    
      <category term="网络流" scheme="https://haizs.com/tags/%E7%BD%91%E7%BB%9C%E6%B5%81/"/>
    
  </entry>
  
  <entry>
    <title>[BZOJ1305]&amp;&amp;[CQOI2009] dance 跳舞</title>
    <link href="https://haizs.com/post/bzoj1305/"/>
    <id>https://haizs.com/post/bzoj1305/</id>
    <published>2015-01-07T14:49:01.000Z</published>
    <updated>2017-03-03T14:43:31.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="描述-description">描述 Description</h2>
<p>发生了火警，所有人员需要紧急疏散！假设每个房间是一个 N M 的矩形区域。每个格子如果是’.‘，那么表示这是一块空地；如果是’X’，那么表示这是一面墙，如果是’D’，那么表示这是一扇门，人们可以从这儿撤出房间。已知门一定在房间的边界上，并且边界上不会有空地。最初，每块空地上都有一个人，在疏散的时候，每一秒钟每个人都可以向上下左右四个方向移动一格，当然他也可以站着不动。疏散开始后，每块空地上就没有人数限制了（也就是说每块空地可以同时站无数个人）。但是，由于门很窄，每一秒钟只能有一个人移动到门的位置，一旦移动到门的位置，就表示他已经安全撤离了。现在的问题是：如果希望所有的人安全撤离，最短需要多少时间？或者告知根本不可能。</p>
<a id="more"></a>
<h2 id="输入格式-inputformat">输入格式 InputFormat</h2>
<p>输入文件第一行是由空格隔开的一对正整数 N 与 M，3&lt;=N &lt;=20，3&lt;=M&lt;=20，以下 N 行 M 列描述一个 N M 的矩阵。其中的元素可为字符’.‘、’X’和’D’，且字符间无空格。</p>
<h2 id="输出格式-outputformat">输出格式 OutputFormat</h2>
<p>只有一个整数 K，表示让所有人安全撤离的最短时间，如果不可能撤离，那么输出’impossible’（不包括引号）。</p>
<h2 id="样例输入-sampleinput">样例输入 SampleInput</h2>
<blockquote>
<p>2 1<br>
NY<br>
NY</p>
</blockquote>
<h2 id="样例输出-sampleoutput">样例输出 SampleOutput</h2>
<blockquote>
<p>1</p>
</blockquote>
<hr>
<p><a href="http://www.lydsy.com/JudgeOnline/problem.php?id=1305" target="_blank" rel="external">BZOJ 1305</a></p>
<hr>
<p>男女分别拆成两点 i,i’,j,j’，i-&gt;i’、j’-&gt;j 连边容量 k，男 i 女 j 喜欢连接 i-&gt;j、不喜欢连接 i’-&gt;j’容量均为一。二分答案，源点连接 i 容量二分值，j 连接汇点容量二分值，网络流验证最大流是否是二分值 * n。</p>
<div class="sourceCode"><pre class="sourceCode c++"><code class="sourceCode cpp"><span class="pp">#include </span><span class="im">&lt;stdio.h&gt;</span>
<span class="pp">#include </span><span class="im">&lt;iostream&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cstring&gt;</span>
<span class="pp">#include </span><span class="im">&lt;algorithm&gt;</span>
<span class="pp">#include </span><span class="im">&lt;cmath&gt;</span>
<span class="pp">#include </span><span class="im">&lt;queue&gt;</span>
<span class="kw">using</span> <span class="kw">namespace</span> std;
<span class="at">const</span> <span class="dt">int</span> inf = <span class="bn">0x7fffffff</span> / <span class="fl">27.11</span>;
<span class="at">const</span> <span class="dt">int</span> maxn = <span class="dv">4</span> * <span class="dv">55</span>;
<span class="at">const</span> <span class="dt">int</span> maxm = maxn * maxn;
<span class="dt">int</span> i, j, t, n, m, l, r, k, z, y, x;
<span class="kw">struct</span> edge
{
    <span class="dt">int</span> to, fl, cp, nx;
} e[maxm];
<span class="dt">int</span> head[maxn], dis[maxn], used[maxn], cur[maxn];
<span class="dt">char</span> ch[maxn];
<span class="dt">int</span> num, cnt, sum, mid;
deque &lt;<span class="dt">int</span>&gt; q;
<span class="kw">inline</span> <span class="dt">void</span> ins(<span class="dt">int</span> u, <span class="dt">int</span> v, <span class="dt">int</span> f, <span class="dt">int</span> c)
{
    e[cnt] = (edge)
    {
        v, f, c, head[u]
    }; head[u] = cnt++;
    e[cnt] = (edge)
    {
        u, <span class="dv">0</span>, <span class="dv">0</span>, head[v]
    }; head[v] = cnt++;
}
<span class="kw">inline</span> <span class="dt">bool</span> bfs(<span class="dt">int</span> s, <span class="dt">int</span> t, <span class="dt">int</span> tim)
{
    <span class="dt">int</span> i, u, v;
    <span class="cf">while</span> (!q.empty()) q.pop_front();
    dis[s] = <span class="dv">0</span>; used[s] = tim;
    q.push_back(s);
    <span class="cf">while</span> (!q.empty())
    {
        u = q.front(); q.pop_front();
        <span class="cf">for</span> (i = head[u]; i != <span class="dv">-1</span>; i = e[i].nx)
        {
            v = e[i].to;
            <span class="cf">if</span> (used[v] != tim &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
            {
                used[v] = tim;
                dis[v] = dis[u] + <span class="dv">1</span>;
                q.push_back(v);
            }
        }
    }
    <span class="cf">return</span> (used[t] == tim);
}
<span class="dt">int</span> dfs(<span class="dt">int</span> u, <span class="dt">int</span> t, <span class="dt">int</span> flow)
{
    <span class="dt">int</span> i, v, d, k;
    <span class="cf">if</span> (u == t) <span class="cf">return</span> flow;
    <span class="cf">for</span> (d = flow, i = cur[u]; i != <span class="dv">-1</span>; i = e[i].nx)
    {
        v = e[i].to;
        <span class="cf">if</span> (dis[v] == dis[u] + <span class="dv">1</span> &amp;&amp; e[i].fl &gt; <span class="dv">0</span>)
        {
            k = dfs(v, t, min(d, e[i].fl));
            e[i].fl -= k; e[i ^ <span class="dv">1</span>].fl += k;
            d -= k;
            <span class="cf">if</span> (d == <span class="dv">0</span>) <span class="cf">break</span>;
        }
    }
    <span class="cf">return</span> flow - d;
}
<span class="kw">inline</span> <span class="dt">bool</span> dinic(<span class="dt">int</span> s, <span class="dt">int</span> t, <span class="dt">int</span> lim)
{
    <span class="dt">int</span> i, ans = <span class="dv">0</span>;
    <span class="cf">for</span> (i = <span class="dv">0</span>; i &lt; cnt; i++) e[i].fl = (e[i].cp == <span class="dv">-1</span>) ? lim : e[i].cp;
    <span class="cf">while</span> (bfs(s, t, ++num))
    {
        memcpy(cur, head, <span class="kw">sizeof</span>(head));
        ans += dfs(s, t, inf);
    }
    <span class="cf">return</span> (ans == lim * n);
}
<span class="dt">int</span> main()
{
    cnt = num = <span class="dv">0</span>;
    memset(head, <span class="dv">-1</span>, <span class="kw">sizeof</span>(head));
    scanf(<span class="st">&quot;</span><span class="sc">%d%d</span><span class="st">&quot;</span>, &amp;n, &amp;k);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++) ins(<span class="dv">0</span>, i, <span class="dv">0</span>, <span class="dv">-1</span>);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++) ins(<span class="dv">3</span> * n + i, <span class="dv">4</span> * n + <span class="dv">1</span>, <span class="dv">0</span>, <span class="dv">-1</span>);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++) ins(i, n + i, k, k), ins(n * <span class="dv">2</span> + i, n * <span class="dv">3</span> + i, k, k);
    <span class="cf">for</span> (i = <span class="dv">1</span>; i &lt;= n; i++)
    {
        scanf(<span class="st">&quot;</span><span class="sc">%s</span><span class="st">&quot;</span>, ch + <span class="dv">1</span>);
        <span class="cf">for</span> (j = <span class="dv">1</span>; j &lt;= n; j++)
        {
            <span class="cf">if</span> (ch[j] == <span class="st">&#39;Y&#39;</span>) ins(i, <span class="dv">3</span> * n + j, <span class="dv">1</span>, <span class="dv">1</span>);
            <span class="cf">else</span> ins(n + i, <span class="dv">2</span> * n + j, <span class="dv">1</span>, <span class="dv">1</span>);
        }
    }
    l = <span class="dv">0</span>; r = n;
    <span class="cf">while</span> (l &lt;= r)
    {
        mid = (l + r) &gt;&gt; <span class="dv">1</span>;
        <span class="cf">if</span> (dinic(<span class="dv">0</span>, <span class="dv">4</span> * n + <span class="dv">1</span>, mid)) l = mid + <span class="dv">1</span> ;
        <span class="cf">else</span> r = mid - <span class="dv">1</span>;
    }
    printf(<span class="st">&quot;</span><span class="sc">%d\n</span><span class="st">&quot;</span>, l - <span class="dv">1</span>);
    <span class="cf">return</span> <span class="dv">0</span>;
}</code></pre></div>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;描述-description&quot;&gt;描述 Description&lt;/h2&gt;
&lt;p&gt;发生了火警，所有人员需要紧急疏散！假设每个房间是一个 N M 的矩形区域。每个格子如果是’.‘，那么表示这是一块空地；如果是’X’，那么表示这是一面墙，如果是’D’，那么表示这是一扇门，人们可以从这儿撤出房间。已知门一定在房间的边界上，并且边界上不会有空地。最初，每块空地上都有一个人，在疏散的时候，每一秒钟每个人都可以向上下左右四个方向移动一格，当然他也可以站着不动。疏散开始后，每块空地上就没有人数限制了（也就是说每块空地可以同时站无数个人）。但是，由于门很窄，每一秒钟只能有一个人移动到门的位置，一旦移动到门的位置，就表示他已经安全撤离了。现在的问题是：如果希望所有的人安全撤离，最短需要多少时间？或者告知根本不可能。&lt;/p&gt;
    
    </summary>
    
      <category term="竞赛题解" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
      <category term="图论" scheme="https://haizs.com/categories/%E7%AB%9E%E8%B5%9B%E9%A2%98%E8%A7%A3/%E5%9B%BE%E8%AE%BA/"/>
    
    
      <category term="BZOJ" scheme="https://haizs.com/tags/BZOJ/"/>
    
      <category term="网络流" scheme="https://haizs.com/tags/%E7%BD%91%E7%BB%9C%E6%B5%81/"/>
    
      <category term="CQOI" scheme="https://haizs.com/tags/CQOI/"/>
    
  </entry>
  
</feed>
