<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beyond the Void &#187; 动态规划</title>
	<atom:link href="http://www.byvoid.com/blog/tag/%e5%8a%a8%e6%80%81%e8%a7%84%e5%88%92/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.byvoid.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 29 Jun 2010 08:44:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>NOI 2009 二叉查找树</title>
		<link>http://www.byvoid.com/blog/noi-2009-treapmod/</link>
		<comments>http://www.byvoid.com/blog/noi-2009-treapmod/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 12:38:55 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[NOI]]></category>
		<category><![CDATA[NOI2009]]></category>
		<category><![CDATA[Treap]]></category>
		<category><![CDATA[二叉查找树]]></category>
		<category><![CDATA[动态规划]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1763</guid>
		<description><![CDATA[问题简述 有一棵Treap，每个节点有一个互不相同的数据值和权值，以及一个访问频度。一个节点的访问代价为它的访问频度乘以它在树中的深度，整棵树的访问代价定义为所有节点的访问代价... ]]></description>
			<content:encoded><![CDATA[<h3><a name="_Toc241572393">问题简述</a></h3>
<p>有一棵Treap，每个节点有一个互不相同的数据值和权值，以及一个访问频度。一个节点的访问代价为它的访问频度乘以它在树中的深度，整棵树的访问代价定义为所有节点的访问代价之和。节点的权值可以修改为任意实数，每修改一个节点的权值的代价为K。任务是修改一些节点的权值，使得整棵树的访问代价与修改代价之和最小。<span id="more-1763"></span></p>
<h3><a name="_Toc241572394"></a><a name="_Toc241035976">问题建模</a></h3>
<p>首先离散化所有节点的权值，对所有节点按照数据值排序后线性存储。定义S[i,j]为(排序后)第i个节点到第j个节点的访问频度之和。</p>
<h4><a name="_Toc241572395"></a><a name="_Toc241035977">解法</a> 动态规划</h4>
<h5><a name="_Toc241572396"></a><a name="_Toc241035978">算法描述</a></h5>
<p>定义Weight[i]为状态转移方程为第i个节点离散化后的权值，F[i,j,w]表示从第i个节点到第j个节点组成一棵子树的最小代价，子树根节点的权值≥w。状态转移方程为</p>
<p><img style="display: inline; border: 0px;" title="clip_image002" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image002.gif" border="0" alt="clip_image002" width="528" height="55" /></p>
<p>边界条件为<img style="display: inline; border: 0px;" title="clip_image004" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image004.gif" border="0" alt="clip_image004" width="114" height="37" />，目标函数为<img style="display: inline; border: 0px;" title="clip_image006" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0062.gif" border="0" alt="clip_image006" width="145" height="37" />。</p>
<h5><a name="_Toc241572397">算法分析</a></h5>
<p>对于一个状态F[i,j,w]，我们要枚举从节点[i..j]组成的这棵子树的根节点k，其左子树为[i..k-1]，右子树为[k+1..j]。</p>
<p>如果根节点k的权值Weight[k]≥w，那么节点k的权值无需修改即可直接作为该子树的根节点。总代价为左子树的代价F[i,k-1, Weight[k]]，加上右子树的代价F[k+1,j, Weight[k]]，以及整个子树的访问频度之和。</p>
<p>另外一种情况，修改节点k的权值，使之不小于w。由于我们已经离散化了权值，修改后的权值不应是整数，以免和已有重复。假设节点k修改后的权值为w加上一个很小的小数，其左右子树根节点的权值都不应小于节点k修改后的权值。我们约定如果根和子节点都必须大于w的话，则子节点的权值比根节点略大，且大于w。于是这种情况的总代价为左子树的代价F[i,k-1, w]，加上右子树的代价F[k+1,j, w]，加上修改权值的代价K，以及整个子树的访问频度之和。</p>
<h5><a name="_Toc241572398"></a><a name="_Toc241035980">复杂度分析</a></h5>
<p>状态数为O(N<sup>3</sup>)，每次转移需要以O(N)的时间枚举k，所以时间复杂度为O(N<sup>4</sup>)。在实际测试中通过了所以测试点，得到100分。</p>
<h5><a name="_Toc241572399"></a><a name="_Toc241035981">参考程序</a></h5>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1763code2'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p17632"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
</pre></td><td class="code" id="p1763code2"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI2009 treapmod
 * Author: Guo Jiabao
 * Time: 2009.9.24 14:50
 * State: Solved
 * Memo: 动态规划
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span> big<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN <span style="color: #000080;">=</span> <span style="color: #0000dd;">72</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> big INF <span style="color: #000080;">=</span> ~0ULL<span style="color: #000080;">&gt;&gt;</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> node
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> val,wei,freq<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>P<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> N,K<span style="color: #008080;">;</span>
big sf<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,F<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,Ans<span style="color: #000080;">=</span>INF<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;treapmod.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;treapmod.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d&quot;</span>,<span style="color: #000040;">&amp;</span>N,<span style="color: #000040;">&amp;</span>K<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">val</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">wei</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">freq</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>F,<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">int</span> cmp1<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>a,<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>b<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>node <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> wei <span style="color: #000040;">-</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>node <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> wei<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">int</span> cmp2<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>a,<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>b<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>node <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> val <span style="color: #000040;">-</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>node <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> val<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> big sum<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i,<span style="color: #0000ff;">int</span> j<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> sf<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> sf<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
big dp<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i,<span style="color: #0000ff;">int</span> j,<span style="color: #0000ff;">int</span> w<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">&gt;</span>j<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>w<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> a<span style="color: #008080;">;</span>
		big t,rs<span style="color: #000080;">=</span>INF<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>a<span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>a<span style="color: #000080;">&lt;=</span>j<span style="color: #008080;">;</span>a<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			t <span style="color: #000080;">=</span> dp<span style="color: #008000;">&#40;</span>i,a<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>,w<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> dp<span style="color: #008000;">&#40;</span>a<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,j,w<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> sum<span style="color: #008000;">&#40;</span>i,j<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> K<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>t <span style="color: #000080;">&lt;</span> rs<span style="color: #008000;">&#41;</span>
				rs <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>P<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">wei</span> <span style="color: #000080;">&gt;=</span> w<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				t <span style="color: #000080;">=</span> dp<span style="color: #008000;">&#40;</span>i,a<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>,P<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">wei</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> dp<span style="color: #008000;">&#40;</span>a<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,j,P<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">wei</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> sum<span style="color: #008000;">&#40;</span>i,j<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>t <span style="color: #000080;">&lt;</span> rs<span style="color: #008000;">&#41;</span>
					rs <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>w<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> rs<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>w<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">qsort</span><span style="color: #008000;">&#40;</span>P<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,N,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>P<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>,cmp1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">wei</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">qsort</span><span style="color: #008000;">&#40;</span>P<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,N,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>P<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>,cmp2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">val</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		sf<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> sf<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">freq</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		big t <span style="color: #000080;">=</span> dp<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,N,i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>t <span style="color: #000080;">&lt;</span> Ans<span style="color: #008000;">&#41;</span>
			Ans <span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> Ans <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/noi-2009-poet/" title="NOI 2009 诗人小G">NOI 2009 诗人小G</a></li><li><a href="http://www.byvoid.com/blog/noi-2001-solution/" title="NOI 2001 解题报告">NOI 2001 解题报告</a></li><li><a href="http://www.byvoid.com/blog/noi-2009-solution/" title="NOI 2009 解题报告">NOI 2009 解题报告</a></li><li><a href="http://www.byvoid.com/blog/noi-2009-path/" title="NOI 2009 描边">NOI 2009 描边</a></li><li><a href="http://www.byvoid.com/blog/noi-2009-ball/" title="NOI 2009 管道取珠">NOI 2009 管道取珠</a></li><li><a href="http://www.byvoid.com/blog/noi-2009-pvz/" title="NOI 2009 植物大战僵尸">NOI 2009 植物大战僵尸</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/noi-2009-treapmod/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>NOI 2009 诗人小G</title>
		<link>http://www.byvoid.com/blog/noi-2009-poet/</link>
		<comments>http://www.byvoid.com/blog/noi-2009-poet/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 09:58:21 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[NOI]]></category>
		<category><![CDATA[NOI2009]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[决策单调性]]></category>
		<category><![CDATA[凸包]]></category>
		<category><![CDATA[动态规划]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1757</guid>
		<description><![CDATA[问题简述 有N个诗句需要被排版为若干行，顺序不能改变。一行内可以有若干个诗句，相邻诗句之间有一个空格。定义行标准长度L，每行的不协调度为&#124;实际长度-L&#124;P，整首诗的不协调度... ]]></description>
			<content:encoded><![CDATA[<h3>问题简述</h3>
<p>有N个诗句需要被排版为若干行，顺序不能改变。一行内可以有若干个诗句，相邻诗句之间有一个空格。定义行标准长度L，每行的不协调度为|实际长度-L|<sup>P</sup>，整首诗的不协调度就是每行不协调度之和。任务是安排一种排版方案，使得整首诗的不协调度最小。<span id="more-1757"></span></p>
<h3>问题建模</h3>
<p>这是一个最优化问题，抽象成动态规划模型。设第i个诗句的长度为Len[i]，前i个诗句的总长度为SumL[i]，<img style="display: inline; border-width: 0px;" title="clip_image002[4]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0024.gif" border="0" alt="clip_image002[4]" width="130" height="37" />。F[i]为对前i个诗句排版的最小不协调度。</p>
<h4>解法1 朴素的动态规划</h4>
<h5>算法描述</h5>
<p>显然每个F[i]可以被分解为F[j]和第j+1…i个句子组成一行的状态，所以状态转移方程为</p>
<p><img style="display: inline; border-width: 0px;" title="clip_image004[4]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0044.gif" border="0" alt="clip_image004[4]" width="326" height="76" /></p>
<p>简化后，可以书写成</p>
<p><img style="display: inline; border-width: 0px;" title="clip_image006" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image006.gif" border="0" alt="clip_image006" width="357" height="37" /></p>
<p>在具体实现时，应记录每个状态的决策，以便于输出合法方案。考虑到“最小的不协调度超过10<sup>18</sup>输出&#8221;Too hard to arrange&#8221;”，为防止64位整型运算溢出，可以先用浮点数类型计算，然后再用整型算出具体值。</p>
<h5>复杂度分析</h5>
<p>状态数为O(N)，每次转移需要以O(N)的时间枚举j，所以时间复杂度为O(N<sup>2</sup>)。在实际测试中通过了测试点1，2，3，得到30分。</p>
<h5>参考程序</h5>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1757code7'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p17577"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
</pre></td><td class="code" id="p1757code7"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI2009 poet
 * Author: Guo Jiabao
 * Time: 2009.9.22 13:30
 * State: Solved
 * Memo: 朴素动态规划
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span> big<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">100001</span>,SMAXL<span style="color: #000080;">=</span><span style="color: #0000dd;">32</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> big INF<span style="color: #000080;">=</span>~0ULL<span style="color: #000080;">&gt;&gt;</span><span style="color: #0000dd;">1</span>,LIMIT<span style="color: #000080;">=</span>1000000000000000000LL<span style="color: #008080;">;</span>
&nbsp;
big F<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,sumL<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N,L,P<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Len<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,deci<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,sel<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> sent<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>SMAXL<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,<span style="color: #000040;">&amp;</span>N,<span style="color: #000040;">&amp;</span>L,<span style="color: #000040;">&amp;</span>P<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">gets</span><span style="color: #008000;">&#40;</span>sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Len<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> sumL<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> Len<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
big power<span style="color: #008000;">&#40;</span>big a<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	big t<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">double</span> dt<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		a <span style="color: #000080;">=</span> <span style="color: #000040;">-</span>a<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>P<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		dt <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dt <span style="color: #000080;">&gt;</span> LIMIT<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">return</span> INF<span style="color: #008080;">;</span>
		t <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k<span style="color: #008080;">;</span>
	big minv,t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		minv <span style="color: #000080;">=</span> INF<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span><span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			t <span style="color: #000080;">=</span> power<span style="color: #008000;">&#40;</span>sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> sumL<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> i<span style="color: #000040;">-</span>j<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">-</span> L<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;=</span> LIMIT <span style="color: #000040;">&amp;&amp;</span> t <span style="color: #000040;">+</span> F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> minv<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				minv <span style="color: #000080;">=</span> t <span style="color: #000040;">+</span> F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
				k <span style="color: #000080;">=</span> j<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> minv<span style="color: #008080;">;</span>
		deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> k<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;=</span> LIMIT<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> i,j<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>N,j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #008080;">;</span>i<span style="color: #000080;">=</span>deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			sel<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j<span style="color: #008080;">;</span>j<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>i<span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> sel<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
				<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s &quot;</span>,sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Too hard to arrange<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;--------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,T<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;poet.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;poet.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>T<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h4>解法2 贪心的动态规划</h4>
<h5>算法描述</h5>
<p>观察测试点4，5的N值较大，而L值较小，因此可以限制每行长度，以优化状态转移。</p>
<p><img style="display: inline; border: 0px;" title="clip_image008" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image008_thumb.gif" border="0" alt="clip_image008" width="455" height="55" /></p>
<p>实现时应让j从i-1到0枚举，当j&lt;i-1时一旦发现行长度超过2L，即停止枚举j，因为j继续减少会让行长度继续增加。</p>
<h5>算法证明</h5>
<p>一个空行的不协调度为L<sup>P</sup>，若一行内包含多余一个句子，且行长度L’&gt;2L，则行不协调度(L’-L)<sup>P</sup>&gt;L<sup>P</sup>。把该行拆分为两行后，设长度分别为L1和L2，L1+L2=L’-1，拆分后的两行不协调度之和为(L1-L)P+(L2-L)P&lt;(L’-L)<sup>P</sup>，所以拆分为两行后比合在一行好。因此应保证当一行包含多于一个句子时，行长度&lt;=2L。</p>
<h5>复杂度分析</h5>
<p>状态数为O(N)，每次转移需要O(Min{N,L})的时间，所以时间复杂度为O(Min{N<sup>2</sup>,NL})。在实际测试中通过了前5个测试点，得到50分。</p>
<h5>参考程序</h5>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1757code8'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p17578"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
</pre></td><td class="code" id="p1757code8"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI2009 poet
 * Author: Guo Jiabao
 * Time: 2009.9.22 13:51
 * State: Solved
 * Memo: 朴素动态规划 剪枝
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span> big<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">100001</span>,SMAXL<span style="color: #000080;">=</span><span style="color: #0000dd;">32</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> big INF<span style="color: #000080;">=</span>~0ULL<span style="color: #000080;">&gt;&gt;</span><span style="color: #0000dd;">1</span>,LIMIT<span style="color: #000080;">=</span>1000000000000000000LL<span style="color: #008080;">;</span>
&nbsp;
big F<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,sumL<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N,L,P<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Len<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,deci<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,sel<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> sent<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>SMAXL<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,<span style="color: #000040;">&amp;</span>N,<span style="color: #000040;">&amp;</span>L,<span style="color: #000040;">&amp;</span>P<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">gets</span><span style="color: #008000;">&#40;</span>sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Len<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> sumL<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> Len<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
big power<span style="color: #008000;">&#40;</span>big a<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	big t<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">double</span> dt<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		a <span style="color: #000080;">=</span> <span style="color: #000040;">-</span>a<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>P<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		dt <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dt <span style="color: #000080;">&gt;</span> LIMIT<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">return</span> INF<span style="color: #008080;">;</span>
		t <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k<span style="color: #008080;">;</span>
	big minv,t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		minv <span style="color: #000080;">=</span> INF<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&gt;=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span><span style="color: #000040;">--</span>j<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			t <span style="color: #000080;">=</span> sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> sumL<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> i<span style="color: #000040;">-</span>j<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">-</span> L<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>j <span style="color: #000080;">&lt;</span> i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">&amp;&amp;</span> t <span style="color: #000080;">&gt;</span> L <span style="color: #000040;">+</span> L<span style="color: #008000;">&#41;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			t <span style="color: #000080;">=</span> power<span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;=</span> LIMIT <span style="color: #000040;">&amp;&amp;</span> t <span style="color: #000040;">+</span> F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> minv<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				minv <span style="color: #000080;">=</span> t <span style="color: #000040;">+</span> F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
				k <span style="color: #000080;">=</span> j<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> minv<span style="color: #008080;">;</span>
		deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> k<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;=</span> LIMIT<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> i,j<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>N,j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #008080;">;</span>i<span style="color: #000080;">=</span>deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			sel<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j<span style="color: #008080;">;</span>j<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>i<span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> sel<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
				<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s &quot;</span>,sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Too hard to arrange<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;--------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,T<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;poet.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;poet.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>T<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h4>解法3 凸壳优化动态规划</h4>
<h5>算法描述</h5>
<p>观察发现测试点6，7的N和L都很大，而P值为2。经分析发现可以使用单调队列维护凸壳。</p>
<h5>算法分析与证明</h5>
<p>当P=2时，观察状态转移方程</p>
<p><img style="display: inline; border: 0px;" title="clip_image010" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image010_thumb.gif" border="0" alt="clip_image010" width="359" height="37" /></p>
<p>设对于F[i]的最优决策为k，那么对于所有的j≠k，均满足</p>
<p><img style="display: inline; border: 0px;" title="clip_image012" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image012_thumb.gif" border="0" alt="clip_image012" width="568" height="37" /></p>
<p>设<img style="display: inline; border-width: 0px;" title="clip_image014" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image014_thumb.gif" border="0" alt="clip_image014" width="157" height="37" />，<img style="display: inline; border-width: 0px;" title="clip_image016" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image016_thumb.gif" border="0" alt="clip_image016" width="109" height="37" />，则有</p>
<p><img style="display: inline; border: 0px;" title="clip_image018" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image018_thumb.gif" border="0" alt="clip_image018" width="261" height="37" /></p>
<p><img style="display: inline; border: 0px;" title="clip_image020" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image020_thumb.gif" border="0" alt="clip_image020" width="438" height="37" /></p>
<p><img style="display: inline; border: 0px;" title="clip_image022" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image022_thumb.gif" border="0" alt="clip_image022" width="327" height="37" /></p>
<p>因为SumL为单调增函数，所以A，B均为增函数。当B[j]&gt;B[k] ⇒j&gt;k，有</p>
<p><img style="display: inline; border: 0px;" title="clip_image024" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image024_thumb.gif" border="0" alt="clip_image024" width="251" height="55" /></p>
<p>相对的，当j&lt;k时有</p>
<p><img style="display: inline; border: 0px;" title="clip_image026" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image026_thumb.gif" border="0" alt="clip_image026" width="252" height="55" /></p>
<p>如果把(B[i],F[i]+B[i]<sup>2</sup>)看作是二维平面上的一个点，那么<img style="display: inline; border-width: 0px;" title="clip_image028" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image028_thumb.gif" border="0" alt="clip_image028" width="137" height="55" />恰为斜率公式。因此对于最优决策k，应保证在对应点右边任意一个决策j的对应点，满足直线kj斜率大于2A[i]；在对应点左边任意一个决策j的对应点，满足直线kj斜率小于2A[i]。</p>
<p><img style="display: inline; border: 0px;" title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/image3.png" border="0" alt="image" width="295" height="287" /></p>
<p>因此所有最优决策在平面上的对应点连线就是一个斜率递增的凸壳。</p>
<p><img style="display: inline; border: 0px;" title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/image4.png" border="0" alt="image" width="295" height="295" /></p>
<p>具体实现时，用单调队列维护每个点(B[i],F[i]+B[i]<sup>2</sup>)，每在队尾加入一个新的点，判断斜率是否递增，如果不是则不断删除队尾元素。求F[i]的最优决策只需不断在队首删除点，直到队首两点组成的直线斜率刚好大于2A[i]，最优决策就是左端点的对应决策。</p>
<h5>复杂度分析</h5>
<p>用单调队列每次维护凸壳的时间复杂度为均摊O(1)，所以时间复杂度为O(N)。经测试可以通过测试点6，7，配合解法2，一共可以得到70分。</p>
<h5>参考程序</h5>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1757code9'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p17579"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
</pre></td><td class="code" id="p1757code9"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI2009 poet
 * Author: Guo Jiabao
 * Time: 2009.9.22 14:30
 * State: Solved
 * Memo: 朴素动态规划 剪枝 凸壳优化
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span> big<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">100001</span>,SMAXL<span style="color: #000080;">=</span><span style="color: #0000dd;">32</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> big INF<span style="color: #000080;">=</span>~0ULL<span style="color: #000080;">&gt;&gt;</span><span style="color: #0000dd;">1</span>,LIMIT<span style="color: #000080;">=</span>1000000000000000000LL<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> MonoQueue
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">struct</span> point
	<span style="color: #008000;">&#123;</span>
		big x,y<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> id<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>P<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">int</span> head,tail<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">void</span> initialize<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		head <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		tail <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">void</span> insert<span style="color: #008000;">&#40;</span>big x,big y,<span style="color: #0000ff;">int</span> id<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		point p<span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span>x,y,id<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #008080;">;</span>head <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;=</span> tail<span style="color: #008080;">;</span><span style="color: #000040;">--</span>tail<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">double</span> k1,k2<span style="color: #008080;">;</span>
			k1 <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>p.<span style="color: #007788;">y</span> <span style="color: #000040;">-</span> P<span style="color: #008000;">&#91;</span>tail<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">y</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>p.<span style="color: #007788;">x</span> <span style="color: #000040;">-</span> P<span style="color: #008000;">&#91;</span>tail<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">x</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			k2 <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>P<span style="color: #008000;">&#91;</span>tail<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">y</span> <span style="color: #000040;">-</span> P<span style="color: #008000;">&#91;</span>tail<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">y</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>P<span style="color: #008000;">&#91;</span>tail<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">x</span> <span style="color: #000040;">-</span> P<span style="color: #008000;">&#91;</span>tail<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">x</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>k1 <span style="color: #000080;">&gt;</span> k2<span style="color: #008000;">&#41;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		P<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>tail<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> p<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">int</span> getmin<span style="color: #008000;">&#40;</span>big v<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #008080;">;</span>head <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;=</span> tail<span style="color: #008080;">;</span><span style="color: #000040;">++</span>head<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">double</span> k <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>P<span style="color: #008000;">&#91;</span>head<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">y</span> <span style="color: #000040;">-</span> P<span style="color: #008000;">&#91;</span>head<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">y</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>P<span style="color: #008000;">&#91;</span>head<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">x</span> <span style="color: #000040;">-</span> P<span style="color: #008000;">&#91;</span>head<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">x</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>k <span style="color: #000080;">&gt;</span> v<span style="color: #008000;">&#41;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">return</span> P<span style="color: #008000;">&#91;</span>head<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">id</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>MQ<span style="color: #008080;">;</span>
&nbsp;
big F<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,sumL<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,A<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,B<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N,L,P<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Len<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,deci<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,sel<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> sent<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>SMAXL<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,<span style="color: #000040;">&amp;</span>N,<span style="color: #000040;">&amp;</span>L,<span style="color: #000040;">&amp;</span>P<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">gets</span><span style="color: #008000;">&#40;</span>sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Len<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> sumL<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> Len<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
big power<span style="color: #008000;">&#40;</span>big a<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	big t<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">double</span> dt<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		a <span style="color: #000080;">=</span> <span style="color: #000040;">-</span>a<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>P<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		dt <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dt <span style="color: #000080;">&gt;</span> LIMIT<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">return</span> INF<span style="color: #008080;">;</span>
		t <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> tq<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j<span style="color: #008080;">;</span>
	big t<span style="color: #008080;">;</span>
	MQ.<span style="color: #007788;">initialize</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	MQ.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> i<span style="color: #008080;">;</span>
		A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span> <span style="color: #000040;">-</span> L<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		j <span style="color: #000080;">=</span> MQ.<span style="color: #007788;">getmin</span><span style="color: #008000;">&#40;</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		t <span style="color: #000080;">=</span> power<span style="color: #008000;">&#40;</span>sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> sumL<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> i<span style="color: #000040;">-</span>j<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">-</span> L<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;=</span> LIMIT <span style="color: #008000;">&#41;</span>
			F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> t<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">else</span>
			F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> INF<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;=</span> LIMIT<span style="color: #008000;">&#41;</span>
			t <span style="color: #000080;">=</span> F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">else</span>
			t <span style="color: #000080;">=</span> INF<span style="color: #008080;">;</span>
		MQ.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,t,i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> j<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> simple<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k<span style="color: #008080;">;</span>
	big minv,t<span style="color: #008080;">;</span>
	k <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		minv <span style="color: #000080;">=</span> INF<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&gt;=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span><span style="color: #000040;">--</span>j<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			t <span style="color: #000080;">=</span> sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> sumL<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> i<span style="color: #000040;">-</span>j<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">-</span> L<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>t <span style="color: #000080;">&gt;</span> L <span style="color: #000040;">+</span> L<span style="color: #008000;">&#41;</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
			t <span style="color: #000080;">=</span> power<span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;=</span> LIMIT <span style="color: #000040;">&amp;&amp;</span> t <span style="color: #000040;">+</span> F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span> minv<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				minv <span style="color: #000080;">=</span> F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> t<span style="color: #008080;">;</span>
				k <span style="color: #000080;">=</span> j<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> minv<span style="color: #008080;">;</span>
		deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> k<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>P <span style="color: #000080;">==</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span>
		tq<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
		simple<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;=</span> LIMIT<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> i,j<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>N,j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #008080;">;</span>i<span style="color: #000080;">=</span>deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			sel<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j<span style="color: #008080;">;</span>j<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>i<span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> sel<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
				<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s &quot;</span>,sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Too hard to arrange<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;--------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,T<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;poet.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;poet.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>T<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h4>解法4 决策单调性优化动态规划</h4>
<h5>算法描述</h5>
<p>可以观察到或证明出，该状态转移方程满足决策单调性。因此我们可以使用双端队列维护每个决策区间，对于每个新决策使用二分查找确定位置并更新决策队列。</p>
<h5>算法证明</h5>
<p>再次观察状态转移方程</p>
<p><img style="display: inline; border: 0px;" title="clip_image034" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image034_thumb.gif" border="0" alt="clip_image034" width="371" height="37" /><strong> </strong></p>
<p>设<img style="display: inline; border: 0px;" title="clip_image036" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image036_thumb.gif" border="0" alt="clip_image036" width="282" height="37" />，状态转移方程可以化为1D/1D标准形式</p>
<p><img style="display: inline; border-width: 0px;" title="clip_image038" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image038_thumb.gif" border="0" alt="clip_image038" width="164" height="37" /></p>
<p>要证明上述状态转移方程具有决策单调性，k(i)表示F[i]的最优决策，即</p>
<p><img style="display: inline; border-width: 0px;" title="clip_image040" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image040_thumb.gif" border="0" alt="clip_image040" width="104" height="37" /></p>
<p>当且仅当满足四边形不等式</p>
<p><img style="display: inline; border: 0px;" title="clip_image042" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image042_thumb.gif" border="0" alt="clip_image042" width="359" height="37" /></p>
<p>设<img style="display: inline; border-width: 0px;" title="clip_image044" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image044_thumb.gif" border="0" alt="clip_image044" width="107" height="37" />，<img style="display: inline; border-width: 0px;" title="clip_image046" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image046_thumb.gif" border="0" alt="clip_image046" width="101" height="37" />，<img style="display: inline; border-width: 0px;" title="clip_image048" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image048_thumb.gif" border="0" alt="clip_image048" width="58" height="37" />。其中<img style="display: inline; border-width: 0px;" title="clip_image050" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image050_thumb.gif" border="0" alt="clip_image050" width="148" height="37" />。</p>
<p>于是<img style="display: inline; border-width: 0px;" title="clip_image052" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image052_thumb.gif" border="0" alt="clip_image052" width="152" height="37" />。要证明①，只需证明</p>
<p><img style="display: inline; border: 0px;" title="clip_image054" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image054_thumb.gif" border="0" alt="clip_image054" width="570" height="37" /></p>
<p>设<img style="display: inline; border-width: 0px;" title="clip_image056" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image056_thumb.gif" border="0" alt="clip_image056" width="107" height="37" />，<img style="display: inline; border-width: 0px;" title="clip_image058" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image058_thumb.gif" border="0" alt="clip_image058" width="133" height="37" />，则②等价于</p>
<p><img style="display: inline; border: 0px;" title="clip_image060" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image060_thumb.gif" border="0" alt="clip_image060" width="273" height="37" /></p>
<p><img style="display: inline; border: 0px;" title="clip_image062" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image062_thumb.gif" border="0" alt="clip_image062" width="301" height="37" /></p>
<p>因为<img style="display: inline; border-width: 0px;" title="clip_image064" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image064_thumb.gif" border="0" alt="clip_image064" width="98" height="37" />，且D[i+1]恒为正数，所以S&lt;T。于是要证明③，只需证明下列函数在整数域内(非严格)单调递增</p>
<p><img style="display: inline; border: 0px;" title="clip_image066" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image066_thumb.gif" border="0" alt="clip_image066" width="249" height="37" /><strong></strong></p>
<h6>(1)若P为偶数</h6>
<p><img style="display: inline; border-width: 0px;" title="clip_image068" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image068_thumb.gif" border="0" alt="clip_image068" width="120" height="37" />，求导得<img style="display: inline; border-width: 0px;" title="clip_image070" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image070_thumb.gif" border="0" alt="clip_image070" width="169" height="37" />。</p>
<p>因为<img style="display: inline; border-width: 0px;" title="clip_image072" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image072_thumb.gif" border="0" alt="clip_image072" width="56" height="37" />，P-1为奇数，所以<img style="display: inline; border-width: 0px;" title="clip_image074" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image074_thumb.gif" border="0" alt="clip_image074" width="131" height="37" />，<img style="display: inline; border-width: 0px;" title="clip_image076" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image076_thumb.gif" border="0" alt="clip_image076" width="54" height="37" />恒成立，f(x)在实数域内单调递增。</p>
<h6>(2)若P为奇数</h6>
<h6>(a)当X-C&gt;=0</h6>
<p><img style="display: inline; border-width: 0px;" title="clip_image068[1]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0681_thumb.gif" border="0" alt="clip_image068[1]" width="120" height="37" />，求导得<img style="display: inline; border-width: 0px;" title="clip_image070[1]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0701_thumb.gif" border="0" alt="clip_image070[1]" width="169" height="37" />。</p>
<p>因为<img style="display: inline; border-width: 0px;" title="clip_image080" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image080_thumb.gif" border="0" alt="clip_image080" width="82" height="37" />，P-1为偶数，所以<img style="display: inline; border-width: 0px;" title="clip_image074[1]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0741_thumb.gif" border="0" alt="clip_image074[1]" width="131" height="37" />，<img style="display: inline; border-width: 0px;" title="clip_image076[1]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0761_thumb.gif" border="0" alt="clip_image076[1]" width="54" height="37" />恒成立，f(x)在实数域内单调递增。</p>
<h6>(b)当X&lt;=0</h6>
<p><img style="display: inline; border-width: 0px;" title="clip_image084" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image084_thumb.gif" border="0" alt="clip_image084" width="142" height="37" />，求导得<img style="display: inline; border-width: 0px;" title="clip_image086" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image086_thumb.gif" border="0" alt="clip_image086" width="172" height="37" />。因为P-1为偶数，<img style="display: inline; border-width: 0px;" title="clip_image076[2]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0762_thumb.gif" border="0" alt="clip_image076[2]" width="54" height="37" />恒成立，f(x)在实数域内单调递增。</p>
<h6>(c)当0&lt;X&lt;C</h6>
<p><img style="display: inline; border-width: 0px;" title="clip_image090" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image090_thumb.gif" border="0" alt="clip_image090" width="120" height="37" />，求导得<img style="display: inline; border-width: 0px;" title="clip_image086[1]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0861_thumb.gif" border="0" alt="clip_image086[1]" width="172" height="37" />。因为P-1为偶数，<img style="display: inline; border-width: 0px;" title="clip_image076[3]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0763_thumb.gif" border="0" alt="clip_image076[3]" width="54" height="37" />恒成立，f(x)在实数域内单调递增。</p>
<p>综上所述，f(x)在实数域内单调递增，即在正数域内单调递增，因而③②①依次得证。</p>
<p>因此状态转移方程<img style="display: inline; border: 0px;" title="clip_image006[1]" src="http://www.byvoid.com/blog/wp-content/uploads/2010/01/clip_image0061_thumb.gif" border="0" alt="clip_image006[1]" width="357" height="37" />具有决策单调性。</p>
<h5>复杂度分析</h5>
<p>状态数为O(N)，每次维护决策队列的时间为O(logN)，所以时间复杂度为O(NlogN)。在测试中通过了全部测试点，拿到了100分。</p>
<h5>参考程序</h5>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1757code10'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p175710"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
</pre></td><td class="code" id="p1757code10"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI2009 poet
 * Author: Guo Jiabao
 * Time: 2009.9.22 16:30
 * State: Solved
 * Memo: 动态规划 决策单调性
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span> big<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">100001</span>,SMAXL<span style="color: #000080;">=</span><span style="color: #0000dd;">32</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> big LIMIT<span style="color: #000080;">=</span>1000000000000000000LL<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> interval
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> s,t,deci<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>di<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">double</span> F<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N,L,P,Stop<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Len<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,deci<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,sel<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> sent<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>SMAXL<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
big G<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,sumL<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,<span style="color: #000040;">&amp;</span>N,<span style="color: #000040;">&amp;</span>L,<span style="color: #000040;">&amp;</span>P<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">gets</span><span style="color: #008000;">&#40;</span>sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Len<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> sumL<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> Len<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">double</span> dpower<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> a<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">double</span> t<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		a <span style="color: #000080;">=</span> <span style="color: #000040;">-</span>a<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>P<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		t <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">double</span> getF<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i,<span style="color: #0000ff;">int</span> j<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">double</span> t <span style="color: #000080;">=</span> dpower<span style="color: #008000;">&#40;</span>sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> sumL<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> i<span style="color: #000040;">-</span>j<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">-</span> L<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
big power<span style="color: #008000;">&#40;</span>big a<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	big t<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">double</span> dt<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		a <span style="color: #000080;">=</span> <span style="color: #000040;">-</span>a<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>P<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		dt <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dt <span style="color: #000080;">&gt;</span> LIMIT<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">return</span> LIMIT<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		t <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
big getG<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i,<span style="color: #0000ff;">int</span> j<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	big t <span style="color: #000080;">=</span> power<span style="color: #008000;">&#40;</span>sumL<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> sumL<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> i<span style="color: #000040;">-</span>j<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">-</span> L<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> t <span style="color: #000080;">&lt;=</span> LIMIT<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> G<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000ff;">return</span> LIMIT <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> update<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span> <span style="color: #000080;">&gt;</span> i <span style="color: #000040;">&amp;&amp;</span> getF<span style="color: #008000;">&#40;</span>di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span>,i<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> getF<span style="color: #008000;">&#40;</span>di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span>,di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">deci</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		di<span style="color: #008000;">&#91;</span>Stop<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span> <span style="color: #000080;">=</span> di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span><span style="color: #008080;">;</span>
		Stop <span style="color: #000040;">--</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> a<span style="color: #000080;">=</span>di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span>,b<span style="color: #000080;">=</span>di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span>,m<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000080;">&lt;</span> i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
		a <span style="color: #000080;">=</span> i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>a<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&lt;</span>b<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		m <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>a <span style="color: #000040;">+</span> b<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> getF<span style="color: #008000;">&#40;</span>m,di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">deci</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> getF<span style="color: #008000;">&#40;</span>m,i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span>
			a <span style="color: #000080;">=</span> m<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">else</span>
			b <span style="color: #000080;">=</span> m<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> a <span style="color: #000080;">&lt;</span> b <span style="color: #000040;">&amp;&amp;</span> getF<span style="color: #008000;">&#40;</span>b,di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">deci</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> getF<span style="color: #008000;">&#40;</span>b,i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span>
		a <span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;=</span> di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		di<span style="color: #008000;">&#91;</span>Stop <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span> <span style="color: #000080;">=</span> a<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		di<span style="color: #008000;">&#91;</span>Stop <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span> <span style="color: #000080;">=</span> di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span><span style="color: #008080;">;</span>
		di<span style="color: #008000;">&#91;</span>Stop <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">deci</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span> <span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
		<span style="color: #000040;">++</span>Stop<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j<span style="color: #008080;">;</span>
	di<span style="color: #008000;">&#91;</span>Stop<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	di<span style="color: #008000;">&#91;</span>Stop<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span> <span style="color: #000080;">=</span> N<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&gt;</span> di<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span><span style="color: #008000;">&#41;</span>
			<span style="color: #000040;">++</span>j<span style="color: #008080;">;</span>
		deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> di<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">deci</span><span style="color: #008080;">;</span>
		F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> getF<span style="color: #008000;">&#40;</span>i,deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		update<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		G<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> getG<span style="color: #008000;">&#40;</span>i,deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>G<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;=</span> LIMIT<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> G<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> i,j<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>N,j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #008080;">;</span>i<span style="color: #000080;">=</span>deci<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			sel<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j<span style="color: #008080;">;</span>j<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>i<span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> sel<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
				<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s &quot;</span>,sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,sent<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Too hard to arrange<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;--------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,T<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;poet.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;poet.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>T<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/noi-2009-treapmod/" title="NOI 2009 二叉查找树">NOI 2009 二叉查找树</a></li><li><a href="http://www.byvoid.com/blog/noi-2008-design/" title="NOI 2008 设计路线 design">NOI 2008 设计路线 design</a></li><li><a href="http://www.byvoid.com/blog/noi-1997-solution/" title="NOI 1997 解题报告">NOI 1997 解题报告</a></li><li><a href="http://www.byvoid.com/blog/usaco-531-milk-measuring/" title="USACO 5.3.1 Milk Measuring 量取牛奶 milk4">USACO 5.3.1 Milk Measuring 量取牛奶 milk4</a></li><li><a href="http://www.byvoid.com/blog/wc2010-efield/" title="WC2010 能量场">WC2010 能量场</a></li><li><a href="http://www.byvoid.com/blog/noi-2009-solution/" title="NOI 2009 解题报告">NOI 2009 解题报告</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/noi-2009-poet/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>NOI 2006 网络收费</title>
		<link>http://www.byvoid.com/blog/noi-2006-network/</link>
		<comments>http://www.byvoid.com/blog/noi-2006-network/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 13:27:26 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[NOI]]></category>
		<category><![CDATA[NOI2006]]></category>
		<category><![CDATA[动态规划]]></category>
		<category><![CDATA[最近公共祖先]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1369</guid>
		<description><![CDATA[对于我来说，这道题不易想到是动态规划，即使想到了，实现也是不容易的。 首先仔细观察表格可以发现一个等价的转化。假设一对付费节点i,j的最近公共祖先为p，如果p的nA&#60;nB，称p为A付费... ]]></description>
			<content:encoded><![CDATA[<p>对于我来说，这道题不易想到是动态规划，即使想到了，实现也是不容易的。</p>
<p>首先仔细观察表格可以发现一个等价的转化。假设一对付费节点i,j的最近公共祖先为p，如果p的nA&lt;nB，称p为A付费节点，否则 为B付费节点。对于i和p，如果i和p的节点性质相同，则需要一倍的付费，j也相同。这时候，i,j的付费可以独立考虑了。这种付费方式与原题描述是等价 的。这一步是动态规划的必要前提条件。</p>
<p>经过这一步的转化，问题就明了多了。问题可以被描述为，安排每个叶节点的付费方案，使每个节点到其所有祖先需要付费之和最小。考虑一个叶 节点i到每个祖先p需要付费多少，取决于i相对于p的另一棵子树中所有节点j与i的流量F[i,j]之和。定义Cost[i,k]为叶节点i到其第k个祖 先需要的付费，我们可以求出每两个叶节点i,j的最近公共祖先p，并令Cost[i,p]和Cost[j,p]的值增加F[i,j]。</p>
<p>定义状态DP[i,j,k]为以第i个节点为根的子树中分配j个A节点，从根节点到i的每个祖先的状态集合为k的最小费用。k可以用二进制位表示，如果一个节点nA&lt;nB，则标记该节点状态为A付费节点。状态转移方程为</p>
<p>F[i,j,k] = Min{ F[i.left,a,k+this] + F[i.right,j-a,k+this] }</p>
<p>其中 k+this表示加上当前节点状态</p>
<p>对于边界状态，就是i为叶节点，计算方法就是i的所有父节点中与i状态相同的节点k的Cost[i,k]之和，如果i与原先付费方式不同，还要加上C[i]。</p>
<p>观察发现F[i,j,k]的取值范围都是0..2^N，如果直接这样写，对于2^10会超空间的，只能拿到80%的分，直观难以发现如何减 少状态数，实际上后两维是有浪费的。假设叶节点为第0层，根节点为第N层，那么对于第k层的节点，它能控制的叶节点的个数最多为2^k，于是j的取值范围 就是0..2^k，一共有2^k + 1种可能。它的祖先一共有N-k个，每个祖先个状态可能有两种，于是k的取值一共有2^(N-k)种可能。因此，j,k的取值一共有(2^k + 1) * (2^(N-k)) = 2^N + 2^(N-k) &lt;=2^(N+1)个，于是我们就可以把后两维状态数压缩到2^(N+1)，这样就不会超过空间限制了。两维的具体压缩方法可以看成是两个二进制数 连接到一起。</p>
<p><span id="more-1369"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1369code12'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p136912"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
</pre></td><td class="code" id="p1369code12"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI2006 network
 * Author: Guo Jiabao
 * Time: 2009.6.3 16:34
 * State: Solved
 * Memo: 树形动态规划
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">11</span>,MAXM<span style="color: #000080;">=</span><span style="color: #0000dd;">1025</span>,MAXP<span style="color: #000080;">=</span>MAXM<span style="color: #000040;">*</span><span style="color: #0000dd;">2</span>,INF<span style="color: #000080;">=</span><span style="color: #208080;">0x7FFFFFFF</span> <span style="color: #000040;">/</span> <span style="color: #0000dd;">4</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> Rec
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> r<span style="color: #008000;">&#91;</span>MAXP<span style="color: #008000;">&#93;</span>,lim<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> get<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> c<span style="color: #000080;">=</span>a<span style="color: #000040;">*</span>lim <span style="color: #000040;">+</span> b<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> r<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">void</span> set<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b,<span style="color: #0000ff;">int</span> v<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> c<span style="color: #000080;">=</span>a<span style="color: #000040;">*</span>lim <span style="color: #000040;">+</span> b<span style="color: #008080;">;</span>
		r<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>v<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>Record<span style="color: #008000;">&#91;</span>MAXP<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N,M,Ac,Ans,NewAns<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Ancestor<span style="color: #008000;">&#91;</span>MAXM<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,Cost<span style="color: #008000;">&#91;</span>MAXM<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,Flow<span style="color: #008000;">&#91;</span>MAXM<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXM<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Convert<span style="color: #008000;">&#91;</span>MAXM<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> Type<span style="color: #008000;">&#91;</span>MAXM<span style="color: #008000;">&#93;</span>,mark<span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,a<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;network.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;network.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	M<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;&lt;</span> N<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Type<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> a<span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>Convert<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			Flow<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>Flow<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>a<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	Ans <span style="color: #000080;">=</span> INF<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> Brink<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> na,<span style="color: #0000ff;">int</span> S<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,Ca<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span>,Cb<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span>,S<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>S<span style="color: #000080;">&gt;&gt;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>S <span style="color: #000040;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
			Ca <span style="color: #000040;">+</span><span style="color: #000080;">=</span> Cost<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">else</span>
			Cb <span style="color: #000040;">+</span><span style="color: #000080;">=</span> Cost<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>na<span style="color: #000080;">==</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> Ca <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>Type<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008080;">?</span><span style="color: #0000dd;">0</span><span style="color: #008080;">:</span>Convert<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000ff;">return</span> Cb <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>Type<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008080;">?</span>Convert<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008080;">:</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> DP<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i,<span style="color: #0000ff;">int</span> j,<span style="color: #0000ff;">int</span> k,<span style="color: #0000ff;">int</span> height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> rs<span style="color: #000080;">=</span>Record<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">get</span><span style="color: #008000;">&#40;</span>j,k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>rs<span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>height<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			rs<span style="color: #000080;">=</span>INF<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">int</span> newrs,a,ls,tk<span style="color: #008080;">;</span>
			mark<span style="color: #000080;">=</span>j <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;&lt;</span> height<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> j<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			tk<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>k <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> mark<span style="color: #008080;">;</span>
			ls<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #008000;">&#40;</span>height<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>a<span style="color: #000080;">=</span>j<span style="color: #000040;">-</span>ls<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> a<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #008080;">;</span>a<span style="color: #000080;">&lt;=</span>j <span style="color: #000040;">&amp;&amp;</span> a<span style="color: #000080;">&lt;=</span>ls<span style="color: #008080;">;</span>a<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				newrs  <span style="color: #000080;">=</span> DP<span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">1</span>,a,tk,height<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				newrs <span style="color: #000040;">+</span><span style="color: #000080;">=</span> DP<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>,j<span style="color: #000040;">-</span>a,tk,height <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>newrs <span style="color: #000080;">&lt;</span> rs<span style="color: #008000;">&#41;</span>
					rs <span style="color: #000080;">=</span> newrs<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			rs <span style="color: #000080;">=</span> Brink<span style="color: #008000;">&#40;</span>i<span style="color: #000040;">-</span>M<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,j,k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Record<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">set</span><span style="color: #008000;">&#40;</span>j,k,rs<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> rs<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k,l,p,a,b,NewAns<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		k<span style="color: #000080;">=</span>i<span style="color: #000040;">+</span>M<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			k<span style="color: #000080;">=</span>k <span style="color: #000080;">&gt;&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
			Ancestor<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>k<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;=</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		a<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		b<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;&lt;</span> k<span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		l<span style="color: #000080;">=</span>N<span style="color: #000040;">-</span>k<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">=</span>a<span style="color: #008080;">;</span>p<span style="color: #000080;">&lt;=</span>b<span style="color: #008080;">;</span>p<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			Record<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">lim</span><span style="color: #000080;">=</span><span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>N<span style="color: #000040;">-</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>Record<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">r</span>,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>Record<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">r</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Ancestor<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> Ancestor<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					Cost<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> Flow<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
					Cost<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> Flow<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		NewAns <span style="color: #000080;">=</span> DP<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,i,<span style="color: #0000dd;">0</span>,N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>NewAns <span style="color: #000080;">&lt;</span> Ans<span style="color: #008000;">&#41;</span>
			Ans <span style="color: #000080;">=</span> NewAns<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%dn&quot;</span>,Ans<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote><p>【问题描述】</p>
<p>网络已经成为当今世界不可或缺的一部分。每天都有数以亿计的人使用网络进行学习、科研、娱乐等活动。然而，不可忽视的一点就是网络本身有着 庞大的运行费用。所以，向使用网络的人进行适当的收费是必须的，也是合理的。 MY 市NS 中学就有着这样一个教育网络。网络中的用户一共有2N 个，编号依次为1, 2, 3, …, 2^N。这些用户之间是用路由点和网线组成的。用户、路由点与网线共同构成一个满二叉树结构。树中的每一个叶子结点都是一个用户，每一个非叶子结点（灰 色）都是一个路由点，而每一条边都是一条网线（见下图，用户结点中的数字为其编号）。</p>
<p><a class="image" title="Image:Networkcost1.png" href="http://www.ruvtex.cn/wiki/Image:Networkcost1.png"><img longdesc="/wiki/Image:Networkcost1.png" src="http://www.ruvtex.cn/mw/images/4/47/Networkcost1.png" alt="Image:Networkcost1.png" width="533" height="304" /></a></p>
<p>MY 网络公司的网络收费方式比较奇特，称为“ 配对收费 ”。即对于每两个用户i, j (1≤i &lt; j ≤2^N ) 进行收费。由于用户可以自行选择两种付费方式A、B中的一种，所以网络公司向学校收取的费用与每一位用户的付费方式有关。该费用等于每两位不同用户配对产 生费用之和。</p>
<p>为了描述方便，首先定义这棵网络树上的一些概念：</p>
<ul>
<li>祖先：根结点没有祖先，非根结点的祖先包括它的父亲以及它的父亲的祖先；</li>
<li>管辖叶结点：叶结点本身不管辖任何叶结点，非叶结点管辖它的左儿子所管辖的叶结点与它的右儿子所管辖的叶结点；</li>
<li>距离：在树上连接两个点之间的用边最少的路径所含的边数。</li>
</ul>
<p>对于任两个用户i, j (1≤i&lt;j≤2^N )，首先在树上找到与它们距离最近的公共祖先：路由点P，然后观察P 所管辖的叶结点（即用户）中选择付费方式A 与B的人数，分别记为nA 与nB，接着按照网络管理条例第X 章第Y 条第Z 款进行收费（如下表），其中Fi, j 为i 和j 之间的流量，且为已知量。</p>
<p><a class="image" title="Image:Networkcost2.png" href="http://www.ruvtex.cn/wiki/Image:Networkcost2.png"><img longdesc="/wiki/Image:Networkcost2.png" src="http://www.ruvtex.cn/mw/images/0/02/Networkcost2.png" alt="Image:Networkcost2.png" width="628" height="237" /></a></p>
<p>由于最终所付费用与付费方式有关，所以NS 中学的用户希望能够自行改变自己的付费方式以减少总付费。然而，由于网络公司已经将每个用户注册时所选择的付费方式记录在案，所以对于用户i，如果他/她 想改变付费方式（由A 改为B 或由B 改为A），就必须支付Ci 元给网络公司以修改档案（修改付费方式记录）。</p>
<p>现在的问题是，给定每个用户注册时所选择的付费方式以及Ci，试求这些用户应该如何选择自己的付费方式以使得NS 中学支付给网络公司的总费用最少（更改付费方式费用+配对收费的费用）。</p>
<p>【输入文件】</p>
<p>输入文件中第一行有一个正整数N。</p>
<p>第二行有2N 个整数，依次表示1 号，2 号，…，2^N 号用户注册时的付费方式，每一个数字若为0，则表示对应用户的初始付费方式为A，否则该数字为1，表示付费方式为B。</p>
<p>第三行有2N 个整数，表示每一个用户修改付费方式需要支付的费用，依次为C1, C2, …,CM 。( M=2^N ) 以下2^N-1 行描述给定的两两用户之间的流量表F，总第(i + 3)行第j 列的整数为Fi, j+i 。（1≤i&lt;2^N，1≤j≤2^N – i） 所有变量的含义可以参见题目描述。</p>
<p>【输出文件】</p>
<p>你的程序只需要向输出文件输出一个整数，表示NS 中学支付给网络公司的最小总费用。（单位：元）</p>
<p>【样例输入】</p>
<pre>2
1 0 1 0
2 2 10 9
10 1 2
2 1
3</pre>
<p>【样例输出】</p>
<pre>8</pre>
<p>【样例说明】</p>
<p>将1 号用户的付费方式由B 改为A，NS 中学支付给网络公司的费用达到最小。</p>
<p>【评分方法】</p>
<p>本题没有部分分，你的程序的输出只有和我们的答案完全一致才能获得满分，否则不得分。</p>
<p>【数据规模和约定】</p>
<ul>
<li>40%的数据中N≤4；</li>
<li>80%的数据中N≤7；</li>
<li>100%的数据中N≤10，0≤Fi, j≤500，0≤Ci≤500 000。</li>
</ul>
</blockquote>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/noi-2009-treapmod/" title="NOI 2009 二叉查找树">NOI 2009 二叉查找树</a></li><li><a href="http://www.byvoid.com/blog/noi-2009-poet/" title="NOI 2009 诗人小G">NOI 2009 诗人小G</a></li><li><a href="http://www.byvoid.com/blog/noi-2006-profit/" title="NOI 2006 最大获利">NOI 2006 最大获利</a></li><li><a href="http://www.byvoid.com/blog/noi-2005-cchkk/" title="NOI 2005 聪聪与可可">NOI 2005 聪聪与可可</a></li><li><a href="http://www.byvoid.com/blog/noi-2005-adv1900/" title="NOI 2005 瑰丽华尔兹">NOI 2005 瑰丽华尔兹</a></li><li><a href="http://www.byvoid.com/blog/noi-2004-manhattan/" title="NOI 2004 曼哈顿">NOI 2004 曼哈顿</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/noi-2006-network/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>NOI 2005 聪聪与可可</title>
		<link>http://www.byvoid.com/blog/noi-2005-cchkk/</link>
		<comments>http://www.byvoid.com/blog/noi-2005-cchkk/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 12:06:38 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[NOI]]></category>
		<category><![CDATA[NOI2005]]></category>
		<category><![CDATA[动态规划]]></category>
		<category><![CDATA[数学期望]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1358</guid>
		<description><![CDATA[首先要求出每对点之间的最短路径(All Pairs Shortest Path,APSP)，需要记录的是path[i][j]，表示在i点时，通向j的最短路径上比i更接近j的一个点。 然后动态规划，状态 F[i][j] 表示猫在i，老鼠在j时，猫... ]]></description>
			<content:encoded><![CDATA[<p>首先要求出每对点之间的最短路径(All Pairs Shortest Path,APSP)，需要记录的是path[i][j]，表示在i点时，通向j的最短路径上比i更接近j的一个点。</p>
<p>然后动态规划，状态 F[i][j] 表示猫在i，老鼠在j时，猫追上老鼠的步数的数学期望。Degree(i)为点i的度。</p>
<p>状态转移方程</p>
<p>F[i][j]=sigma{ F[i'][j'] / ( Degree(j) + 1 ) } + 1</p>
<p>最终结果</p>
<p>F[C][M]<br />
<span id="more-1358"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1358code14'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p135814"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
</pre></td><td class="code" id="p1358code14"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI2005 cchkk
 * Author: Guo Jiabao
 * Time: 2009.6.1 17:30
 * State: Solved
 * Memo: 动态规划 期望计算
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">1001</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> edge
<span style="color: #008000;">&#123;</span>
	edge <span style="color: #000040;">*</span>next<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #000040;">*</span>V<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,ES<span style="color: #008000;">&#91;</span>MAXN<span style="color: #000040;">*</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N,M,X,Y,EC<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> dist<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,path<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,deg<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,Q<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span> F<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> flag<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">void</span> addedge<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	ES<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>EC<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">next</span> <span style="color: #000080;">=</span> V<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	V<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ES<span style="color: #000040;">+</span>EC<span style="color: #008080;">;</span> V<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #000080;">=</span>b<span style="color: #008080;">;</span>
	deg<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,a,b<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cchkk.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cchkk.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d%d%d&quot;</span>,<span style="color: #000040;">&amp;</span>N,<span style="color: #000040;">&amp;</span>M,<span style="color: #000040;">&amp;</span>X,<span style="color: #000040;">&amp;</span>Y<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d&quot;</span>,<span style="color: #000040;">&amp;</span>a,<span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		addedge<span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		addedge<span style="color: #008000;">&#40;</span>b,a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> APSP<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k,head,tail<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>dist,<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dist<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		dist<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		path<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>k<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>Q<span style="color: #008000;">&#91;</span>head<span style="color: #000080;">=</span>tail<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>k<span style="color: #008080;">;</span>head<span style="color: #000080;">&lt;=</span>tail<span style="color: #008080;">;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			i<span style="color: #000080;">=</span>Q<span style="color: #008000;">&#91;</span>head<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>edge <span style="color: #000040;">*</span>e<span style="color: #000080;">=</span>V<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>e <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span>e<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>e<span style="color: #000080;">=</span>e<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dist<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					dist<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> dist<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
					path<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
					Q<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>tail<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>j<span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
				<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dist<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> dist<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span> <span style="color: #000040;">&amp;&amp;</span> i <span style="color: #000080;">&lt;</span> path<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
					path<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">double</span> dp<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i,<span style="color: #0000ff;">int</span> j<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">double</span> rs<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> path<span style="color: #008000;">&#91;</span> path<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		rs <span style="color: #000080;">=</span> dp<span style="color: #008000;">&#40;</span>x,j<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x<span style="color: #000040;">!</span><span style="color: #000080;">=</span>j<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>edge <span style="color: #000040;">*</span>e<span style="color: #000080;">=</span>V<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>e<span style="color: #008080;">;</span>e<span style="color: #000080;">=</span>e<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
				rs <span style="color: #000040;">+</span><span style="color: #000080;">=</span> dp<span style="color: #008000;">&#40;</span>x,e<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
			rs <span style="color: #000040;">/</span><span style="color: #000080;">=</span> deg<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>rs<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	APSP<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%.3lfn&quot;</span>,dp<span style="color: #008000;">&#40;</span>X,Y<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote>
<h2><span class="mw-headline">聪聪与可可 </span></h2>
<p>【问题描述】</p>
<p>在一个魔法森林里，住着一只聪明的小猫聪聪和一只可爱的小老鼠可可。虽然灰姑娘非常喜欢她们俩，但是，聪聪终究是一只猫，而可可终究是一只老鼠，同样不变的是，聪聪成天想着要吃掉可可。</p>
<p>一天，聪聪意外得到了一台非常有用的机器，据说是叫GPS，对可可能准确的定位。有了这台机器，聪聪要吃可可就易如反掌了。于是，聪聪准备 马上出发，去找可可。而可怜的可可还不知道大难即将临头，仍在森林里无忧无虑的玩耍。小兔子乖乖听到这件事，马上向灰姑娘报告。灰姑娘决定尽快阻止聪聪， 拯救可可，可她不知道还有没有足够的时间。</p>
<p>整个森林可以认为是一个无向图，图中有N个美丽的景点，景点从1至N编号。小动物们都只在景点休息、玩耍。在景点之间有一些路连接。</p>
<p>当聪聪得到GPS时，可可正在景点M(M≤N)处。以后的每个时间单位，可可都会选择去相邻的景点(可能有多个)中的一个或停留在原景点不 动。而去这些地方所发生的概率是相等的。假设有P个景点与景点M相邻，它们分别是景点R、景点S，……景点Q，在时刻T可可处在景点M，则在(T＋1)时 刻，可可有1/(P+1)的可能在景点R，有1/(P+1)的可能在景点S，……，有1/(P+1)的可能在景点Q，还有1/(P+1)的可能停在景点 M。</p>
<p>我们知道，聪聪是很聪明的，所以，当她在景点C时，她会选一个更靠近可可的景点，如果这样的景点有多个，她会选一个标号最小的景点。由于聪聪太想吃掉可可了，如果走完第一步以后仍然没吃到可可，她还可以在本段时间内再向可可走近一步。</p>
<p>在每个时间单位，假设聪聪先走，可可后走。在某一时刻，若聪聪和可可位于同一个景点，则可怜的可可就被吃掉了。灰姑娘想知道，平均情况下，聪聪几步就可能吃到可可。而你需要帮助灰姑娘尽快的找到答案。</p>
<p>【输入文件】</p>
<ul>
<li>从文件中读入数据。</li>
<li>数据的第1行为两个整数N和E，以空格分隔，分别表示森林中的景点数和连接相邻景点的路的条数。</li>
<li>第2行包含两个整数C和M，以空格分隔，分别表示初始时聪聪和可可所在的景点的编号。</li>
<li>接下来E行，每行两个整数，第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路。</li>
<li>所有的路都是无向的，即：如果能从A走到B，就可以从B走到A。</li>
<li>输入保证任何两个景点之间不会有多于一条路直接相连，且聪聪和可可之间必有路直接或间接的相连。</li>
</ul>
<p>【输出文件】</p>
<ul>
<li>输出到文件中。</li>
<li>输出1个实数，四舍五入保留三位小数，表示平均多少个时间单位后聪聪会把可可吃掉。</li>
</ul>
<p>【样例输入1】</p>
<pre>4 3
1 4
1 2
2 3
3 4</pre>
<p>【样例输出1】</p>
<pre>1.500</pre>
<p>【样例说明1】</p>
<p>开始时，聪聪和可可分别在景点1和景点4。</p>
<p>第一个时刻，聪聪先走，她向更靠近可可(景点4)的景点走动，走到景点2，然后走到景点3；假定忽略走路所花时间。</p>
<p>可可后走，有两种可能：</p>
<p>第一种是走到景点3，这样聪聪和可可到达同一个景点，可可被吃掉，步数为1，概率为 0.5。 第二种是停在景点4，不被吃掉。概率为 0.5。</p>
<p>到第二个时刻，聪聪向更靠近可可(景点4)的景点走动，只需要走一步即和可可在同一景点。因此这种情况下聪聪会在两步吃掉可可。</p>
<p>所以平均的步数是1* 0.5+2* 0.5=1.5步。</p>
<p>【样例输入2】</p>
<pre>9 9
9 3
1 2
2 3
3 4
4 5
3 6
4 6
4 7
7 8
8 9</pre>
<p>【样例输出2】</p>
<pre>2.167</pre>
<p>【样例说明2】</p>
<p>森林如下图所示：</p>
<p><a class="image" title="Image:Cchkk.gif" href="http://www.ruvtex.cn/wiki/Image:Cchkk.gif"><img longdesc="/wiki/Image:Cchkk.gif" src="http://www.ruvtex.cn/mw/images/7/71/Cchkk.gif" alt="Image:Cchkk.gif" width="325" height="195" /></a></p>
<p>【数据范围】</p>
<ul>
<li>对于所有的数据，1≤N,E≤1000。</li>
<li>对于50%的数据，1≤N≤50。</li>
</ul>
</blockquote>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/noi-2005-adv1900/" title="NOI 2005 瑰丽华尔兹">NOI 2005 瑰丽华尔兹</a></li><li><a href="http://www.byvoid.com/blog/noi-2009-treapmod/" title="NOI 2009 二叉查找树">NOI 2009 二叉查找树</a></li><li><a href="http://www.byvoid.com/blog/noi-2009-poet/" title="NOI 2009 诗人小G">NOI 2009 诗人小G</a></li><li><a href="http://www.byvoid.com/blog/noi-2006-network/" title="NOI 2006 网络收费">NOI 2006 网络收费</a></li><li><a href="http://www.byvoid.com/blog/noi-2005-sequence/" title="NOI 2005 维护数列">NOI 2005 维护数列</a></li><li><a href="http://www.byvoid.com/blog/sequence-mad/" title="维护序列快疯了">维护序列快疯了</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/noi-2005-cchkk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
