-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
565 lines (327 loc) · 307 KB
/
atom.xml
File metadata and controls
565 lines (327 loc) · 307 KB
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>SillyPuppy</title>
<subtitle>做人要做一个蹦蹦跳跳的人</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://wmpeng.github.io/"/>
<updated>2018-01-16T11:10:23.996Z</updated>
<id>http://wmpeng.github.io/</id>
<author>
<name>Peng</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>hexo的使用笔记</title>
<link href="http://wmpeng.github.io/2018/01/16/hexo%E7%9A%84%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0/"/>
<id>http://wmpeng.github.io/2018/01/16/hexo的使用笔记/</id>
<published>2018-01-16T10:29:43.000Z</published>
<updated>2018-01-16T11:10:23.996Z</updated>
<content type="html"><![CDATA[<p>记录一下今天又重新配置了一下博客的过程,方便之后用的时候再查。主要是安装、初始化hexo,及配置主题。</p><a id="more"></a><h1 id="预备工作"><a href="#预备工作" class="headerlink" title="预备工作"></a>预备工作</h1><p>先安装node.js和git。</p><h1 id="hexo"><a href="#hexo" class="headerlink" title="hexo"></a>hexo</h1><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>我也不知道是不是必须这样,反正这样做可行。<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br><span class="line">npm install -g hexo</span><br></pre></td></tr></table></figure></p><h2 id="初始化博客文件夹"><a href="#初始化博客文件夹" class="headerlink" title="初始化博客文件夹"></a>初始化博客文件夹</h2><p>首先新建一个文件夹,然后再文件夹输入:<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo init</span><br></pre></td></tr></table></figure></p><p>之后打开文件夹就可以看到有了很多文件。<br>想新建文章:<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new "page name"</span><br></pre></td></tr></table></figure></p><h1 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h1><p>我这次使用的是next主题,使用以下命令<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/iissnan/hexo-theme-next.git themes/next</span><br></pre></td></tr></table></figure></p><p>然后将根目录下的_config.yml配置文件中的theme属性设置为<code>next</code>。</p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>主题的配置方法,在<a href="http://theme-next.iissnan.com/" target="_blank" rel="noopener">http://theme-next.iissnan.com/</a>。</p><p><strong>语言配置方法:</strong><br>在根目录的_config.yml文件夹中修改或创建<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">language: zh-Hans</span><br></pre></td></tr></table></figure></p><p>打开\themes\next\languages\zh-Hans.yml,这是简体中文的配置文件。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">menu:</span><br><span class="line"> home: 首页</span><br><span class="line"> archives: 归档</span><br><span class="line"> categories: 分类</span><br><span class="line"> tags: 标签</span><br><span class="line"> about: 关于</span><br><span class="line"> search: 搜索</span><br><span class="line"> commonweal: 公益404</span><br><span class="line"> android: Android</span><br><span class="line"> python: Python</span><br><span class="line"> api: API</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p>记录一下今天又重新配置了一下博客的过程,方便之后用的时候再查。主要是安装、初始化hexo,及配置主题。</p>
</summary>
<category term="dd" scheme="http://wmpeng.github.io/categories/dd/"/>
<category term="hexo" scheme="http://wmpeng.github.io/tags/hexo/"/>
</entry>
<entry>
<title>NKACM Training 2017 #3 Solution</title>
<link href="http://wmpeng.github.io/2017/09/13/%E7%AE%97%E6%B3%95/Training/NKACM/NKACM-Training-2017-3-Solution/"/>
<id>http://wmpeng.github.io/2017/09/13/算法/Training/NKACM/NKACM-Training-2017-3-Solution/</id>
<published>2017-09-13T10:19:02.000Z</published>
<updated>2017-09-13T10:39:30.170Z</updated>
<content type="html"><![CDATA[<p> 2017/9/13 nkoj训练赛题解。</p><a id="more"></a><h1 id="A-数的划分"><a href="#A-数的划分" class="headerlink" title="A 数的划分"></a>A 数的划分</h1><p> 对于一个给定的正整数N,如何将其拆分成若干个正整数的和,使得这若干个数的乘积最大。<br> 比较简单,直接说做法了,就是尽可能拆成更多的3。当剩下为1,2,3,4时,就不再拆分了,因为他们没法拆成乘积更大。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><bits/stdc++.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t;</span><br><span class="line"><span class="built_in">cin</span>>>t;</span><br><span class="line"><span class="keyword">while</span>(t--)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> n;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&n);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span>(n><span class="number">4</span>)</span><br><span class="line">{</span><br><span class="line">ans*=<span class="number">3</span>;</span><br><span class="line">ans%=<span class="number">1000000007</span>;</span><br><span class="line">n-=<span class="number">3</span>;</span><br><span class="line">}</span><br><span class="line">ans*=n;</span><br><span class="line">ans%=<span class="number">1000000007</span>;</span><br><span class="line"><span class="built_in">cout</span><<ans<<<span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="B-奇怪的班级"><a href="#B-奇怪的班级" class="headerlink" title="B 奇怪的班级"></a>B 奇怪的班级</h1><p> 题意:给出班级中的恋爱关系,找其中是不是一定存在同性恋。<br> 解法:其实就是判断是不是二分图,这里的做法是dfs判断二分图。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> n, m;</span><br><span class="line"><span class="keyword">int</span> flag[<span class="number">200005</span>];</span><br><span class="line"><span class="built_in">map</span><<span class="built_in">string</span>, <span class="keyword">int</span>> name;</span><br><span class="line"><span class="built_in">vector</span><<span class="keyword">int</span>> lover[<span class="number">200005</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="built_in">memset</span>(flag, <span class="number">0</span>, <span class="keyword">sizeof</span>(flag));</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">200005</span>; i++)</span><br><span class="line">lover[i].clear();</span><br><span class="line">name.clear();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> p, <span class="keyword">int</span> k)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">flag[p] = k;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<lover[p].size(); i++)</span><br><span class="line"><span class="keyword">if</span> (flag[lover[p][i]] == k)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">cout</span> << <span class="string">"YES"</span> << <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (flag[lover[p][i]] == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">if</span> (dfs(lover[p][i], <span class="number">3</span> - k))</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= name.size(); i++)</span><br><span class="line"><span class="keyword">if</span> (flag[i] == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">if</span> (dfs(i, <span class="number">1</span>))</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"><span class="built_in">cout</span> << <span class="string">"NO"</span> << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t;</span><br><span class="line"><span class="built_in">cin</span> >> t;</span><br><span class="line"><span class="keyword">while</span> (t--)</span><br><span class="line">{</span><br><span class="line">init();</span><br><span class="line"><span class="built_in">cin</span> >> n >> m;</span><br><span class="line"><span class="built_in">string</span> str1, str2;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= m; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">cin</span> >> str1 >> str2;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (name[str1] == <span class="number">0</span>)</span><br><span class="line">name[str1] = name.size();</span><br><span class="line"><span class="keyword">if</span> (name[str2] == <span class="number">0</span>)</span><br><span class="line">name[str2] = name.size();</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> n1 = name[str1], n2 = name[str2];</span><br><span class="line">lover[n1].push_back(n2);</span><br><span class="line">lover[n2].push_back(n1);</span><br><span class="line">}</span><br><span class="line">peng();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="C-兵团整合"><a href="#C-兵团整合" class="headerlink" title="C 兵团整合"></a>C 兵团整合</h1><p> 题意比较麻烦,自己看吧:<a href="http://acm.nankai.edu.cn/new/p2320.html" target="_blank" rel="noopener">http://acm.nankai.edu.cn/new/p2320.html</a><br> 首先,讨论一个贪心的策略就是,</p><p>A</p>]]></content>
<summary type="html">
<p> 2017/9/13 nkoj训练赛题解。</p>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="Training" scheme="http://wmpeng.github.io/categories/Alogrithm/Training/"/>
<category term="dfs" scheme="http://wmpeng.github.io/tags/dfs/"/>
<category term="STL" scheme="http://wmpeng.github.io/tags/STL/"/>
</entry>
<entry>
<title>Hello World</title>
<link href="http://wmpeng.github.io/2017/08/05/hello-world/"/>
<id>http://wmpeng.github.io/2017/08/05/hello-world/</id>
<published>2017-08-05T10:03:15.000Z</published>
<updated>2017-08-05T11:21:30.812Z</updated>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><a id="more"></a><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p><h2 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h2><h3 id="初始化"><a href="#初始化" class="headerlink" title="初始化"></a>初始化</h3><p>把一个空文件夹变成一个空hexo</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo init</span><br></pre></td></tr></table></figure><h3 id="清理"><a href="#清理" class="headerlink" title="清理"></a>清理</h3><p>把之前生成的东西清理,重新生成</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean</span><br></pre></td></tr></table></figure><h3 id="生成并发布-运行本地服务"><a href="#生成并发布-运行本地服务" class="headerlink" title="生成并发布/运行本地服务"></a>生成并发布/运行本地服务</h3><p>生成并运行本地服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo s -g</span><br></pre></td></tr></table></figure><p>生成并发布</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo d -g</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p>
</summary>
<category term="科技改变生活" scheme="http://wmpeng.github.io/categories/%E7%A7%91%E6%8A%80%E6%94%B9%E5%8F%98%E7%94%9F%E6%B4%BB/"/>
<category term="hexo" scheme="http://wmpeng.github.io/tags/hexo/"/>
</entry>
<entry>
<title>Training 2017 #1</title>
<link href="http://wmpeng.github.io/2017/05/20/%E7%AE%97%E6%B3%95/Training/NKACM/Training-2017-1/"/>
<id>http://wmpeng.github.io/2017/05/20/算法/Training/NKACM/Training-2017-1/</id>
<published>2017-05-20T06:48:40.000Z</published>
<updated>2017-08-05T11:23:49.191Z</updated>
<content type="html"><![CDATA[<p> 2017/05/14第一次训练题解DP专题,链接<a href="https://vjudge.net/contest/163873" target="_blank" rel="noopener">https://vjudge.net/contest/163873</a>。</p><a id="more"></a><h1 id="A-poj-1159-Palindrome"><a href="#A-poj-1159-Palindrome" class="headerlink" title="A poj 1159 Palindrome"></a>A poj 1159 Palindrome</h1><p> 经典又巧妙的dp, dp[i][j] 表示 i~j构成回文串最少需要添加多少字,O(n^2)。状态转移方程:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dp[i][j]=dp[i+1][j-1], s[i]==s[j],</span><br><span class="line"> =min{dp[i+1][j],dp[i][j-1]}+1, s[i]!=s[j].</span><br></pre></td></tr></table></figure></p><h1 id="B-poj-1157-LITTLE-SHOP-OF-FLOWERS"><a href="#B-poj-1157-LITTLE-SHOP-OF-FLOWERS" class="headerlink" title="B poj 1157 LITTLE SHOP OF FLOWERS"></a>B poj 1157 LITTLE SHOP OF FLOWERS</h1><p> 题目给出哪个位置放那种花的价值,花需要按顺序放,问最大价值是多少。</p><p> O(f*v),01背包的变形,a[][]是题目中的矩阵,状态转移方程:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dp[i][j]=max{dp[i-1][j-1]+a[i][j],//第j个位置放第i个放花</span><br><span class="line"> dp[i][j-1]}//第j个位置不放花</span><br></pre></td></tr></table></figure></p><p> 注意初始化<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">for i=1:f</span><br><span class="line"> dp[i][i]=dp[i-1][i-1]+a[i][i]</span><br></pre></td></tr></table></figure></p><h1 id="C-poj-2479-Maximum-sum"><a href="#C-poj-2479-Maximum-sum" class="headerlink" title="C poj 2479 Maximum sum"></a>C poj 2479 Maximum sum</h1><p> 求将序列分成两部分之后,两个部分分别的的最大连续子序列的和的最大值。O(n),dp1[i]表示以i结尾的连续子序列的和最大值,状态转移方程:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dp1[i]=max{a[i],dp1[i-1]}</span><br></pre></td></tr></table></figure></p><p> 同理可以用dp2[i]表示以i开始的的连续子序列的和最大值。然后只需要循环分界点<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">for m=2:n //m表示第2个序列从几开始</span><br><span class="line"> max{max{dp1[1:m-1]},max{dp2[m:n]}}</span><br></pre></td></tr></table></figure></p><p> 其中max{dp1[1:]}和max{dp2[:n]}可以预处理。</p><h1 id="D-poj-2385-Apple-Catching"><a href="#D-poj-2385-Apple-Catching" class="headerlink" title="D poj 2385 Apple Catching"></a>D poj 2385 Apple Catching</h1><p> 给出时间T,走的最多步数W,和每分钟在哪棵树会掉下苹果,求最多能拿到的苹果数。</p><p> O(T*W).dp[i][j]表示前i分钟,移动恰好j次,最多能获得多少苹果,庄毅方程:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">dp[i][j]=max{dp[i-1][j],//不移动</span><br><span class="line"> dp[i-1][j-1]}//移动</span><br><span class="line"> +((j % 2 + 1) == a[i]).//((j % 2 + 1)是移动j次之后在的位置</span><br></pre></td></tr></table></figure></p><h1 id="E-hdu-1003-Max-Sum"><a href="#E-hdu-1003-Max-Sum" class="headerlink" title="E hdu 1003 Max Sum"></a>E hdu 1003 Max Sum</h1><p> C题的简化版本,注意多个结果要取最靠前的一个,并且找的过程中记录一下位置。</p><h1 id="F-hdu-1421-搬寝室"><a href="#F-hdu-1421-搬寝室" class="headerlink" title="F hdu 1421 搬寝室"></a>F hdu 1421 搬寝室</h1><p> 这道题稍微难一点。给出n个数,选出k组没有元素重合的数对,求这些数对的差的平方的和最小。即对于k个数对(pi,qi),i=1~k<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">min{sum{(pi-qi)^2},i=1:k}</span><br></pre></td></tr></table></figure></p><p> 先将物品的重量排序,那么所有数对都是取相邻的元素一定是最优的(可能有其他相同优的),下面给出简单的推导。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">对于(aw,az),(ax,ay),w<x<y<z,</span><br><span class="line"> (aw-az)^2+(ax-ay)^2=aw^2+ax^2+ay^2+az^2-(aw*az+ax*ay) (1)</span><br><span class="line"> (aw-ax)^2+(ay-az)^2=aw^2+ax^2+ay^2+az^2-(aw*ax+ay*az) (2)</span><br><span class="line"> (1)-(2)=(aw*ax+ay*az)-(aw*az+ax*ay)=(ay-aw)*(az-ax)>=0</span><br><span class="line"> (aw,ax),(ay,az)不差于(aw,az),(ax,ay)</span><br><span class="line">同理 (aw,ax),(ay,az)不差于(aw,ay),(ax,az)</span><br><span class="line">对于(ax,az),x<z-1,则对于所有y,x<y<z,有(ax,ay)和(ay,az)都不差于于(ax,az)。</span><br><span class="line">都取相邻元素一定是最优的</span><br></pre></td></tr></table></figure></p><p> 所以可以得到这样的转移方程,dp[i][j]表示 前i件物品 取2*j件 能获得的最小的疲劳度。O(nk).<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dp[i][j] = min{dp[i - 2][j - 1] + (a[i]-a[i-1])^2, //取第i个,即取第i和第i-1个</span><br><span class="line"> dp[i - 1][j]}//不取第i个</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 2017/05/14第一次训练题解DP专题,链接<a href="https://vjudge.net/contest/163873" target="_blank" rel="noopener">https://vjudge.net/contest/163873</a>。</p>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="Training" scheme="http://wmpeng.github.io/categories/Alogrithm/Training/"/>
<category term="DP" scheme="http://wmpeng.github.io/tags/DP/"/>
</entry>
<entry>
<title>poj 1265 Area</title>
<link href="http://wmpeng.github.io/2017/02/11/%E7%AE%97%E6%B3%95/OnlieJudge/poj/poj-1265-Area/"/>
<id>http://wmpeng.github.io/2017/02/11/算法/OnlieJudge/poj/poj-1265-Area/</id>
<published>2017-02-11T10:03:15.000Z</published>
<updated>2017-08-05T11:15:30.661Z</updated>
<content type="html"><![CDATA[<p> 题意:给出一个多边形,求它内部整点的个数、边上整点的个数和多边形的面积。比较好的方法是运用皮克定理。皮克定理:(来自百度)一个计算点阵中顶点在格点上的多边形面积公式:S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。<br> <br><a id="more"></a></p><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a></p><p> 利用皮克定理,先求出面积和边上的整点个数,利用皮克定理,反求出内部点的个数。其中面积用叉积求比较方便,用海伦公式误差比较大;边上的整点即Δx和Δy的gcd。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">* 计算几何,皮克定理,叉积计算面积</span></span><br><span class="line"><span class="comment">* 皮克定理(多边形定点都为整点): S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。</span></span><br><span class="line"><span class="comment">* 叉积计算多边形面积,凸凹均可</span></span><br><span class="line"><span class="comment">* author: wmpeng</span></span><br><span class="line"><span class="comment">* time: 2017-02-11 18:00:05</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><math.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="keyword">int</span> x, y;</span><br><span class="line">}point[<span class="number">105</span>];</span><br><span class="line"><span class="keyword">int</span> m;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">abs</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">return</span> (x < <span class="number">0</span>) ? (-x) : x;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*计算多边形面积,m为顶点个数,point[]为顶点坐标,下标从1开始*/</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">calDoubleA</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">3</span>; i <= m; i++)</span><br><span class="line">ans += (point[i].x - point[<span class="number">1</span>].x)*(point[i - <span class="number">1</span>].y - point[<span class="number">1</span>].y) - (point[i - <span class="number">1</span>].x - point[<span class="number">1</span>].x)*(point[i].y - point[<span class="number">1</span>].y); <span class="comment">//x1y2-x2y1 </span></span><br><span class="line"><span class="keyword">if</span> (ans<<span class="number">0</span>)</span><br><span class="line">ans = -ans;</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">gcd</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> y)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">if</span> (y == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">return</span> x;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> gcd(y, x%y);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*计算多边形外边有经过多少整点,m为顶点个数,point[]为顶点坐标,下标从1开始*/</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">calE</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> ret = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= m; i++)</span><br><span class="line">ret += gcd(<span class="built_in">abs</span>(point[i%m + <span class="number">1</span>].x - point[i].x), <span class="built_in">abs</span>(point[i%m + <span class="number">1</span>].y - point[i].y));</span><br><span class="line"><span class="keyword">return</span> ret;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">calI</span><span class="params">(<span class="keyword">int</span> da,<span class="keyword">int</span> e)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">return</span> (da - e + <span class="number">2</span>) / <span class="number">2</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> I=<span class="number">1</span>;I<=t;I++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> x = <span class="number">0</span>, y = <span class="number">0</span>, xx, yy;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &m);</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= m; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &xx, &yy);</span><br><span class="line">x += xx;</span><br><span class="line">y += yy;</span><br><span class="line">point[i].x = x;</span><br><span class="line">point[i].y = y;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> da = calDoubleA();</span><br><span class="line"><span class="keyword">int</span> e = calE();</span><br><span class="line"><span class="keyword">int</span> i = calI(da, e);</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Scenario #%d:\n"</span>, I);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d %d %.1f\n\n"</span>, i, e, da / <span class="number">2.0</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p> 题意:给出一个多边形,求它内部整点的个数、边上整点的个数和多边形的面积。比较好的方法是运用皮克定理。皮克定理:(来自百度)一个计算点阵中顶点在格点上的多边形面积公式:S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。<br> <br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="poj" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/poj/"/>
<category term="皮克定理" scheme="http://wmpeng.github.io/tags/%E7%9A%AE%E5%85%8B%E5%AE%9A%E7%90%86/"/>
<category term="快速幂" scheme="http://wmpeng.github.io/tags/%E5%BF%AB%E9%80%9F%E5%B9%82/"/>
</entry>
<entry>
<title>hdu 3498 whosyourdaddy</title>
<link href="http://wmpeng.github.io/2017/02/01/%E7%AE%97%E6%B3%95/OnlieJudge/hdu/hdu%203498-whosyourdaddy/"/>
<id>http://wmpeng.github.io/2017/02/01/算法/OnlieJudge/hdu/hdu 3498-whosyourdaddy/</id>
<published>2017-02-01T02:11:41.000Z</published>
<updated>2018-01-16T11:26:33.090Z</updated>
<content type="html"><![CDATA[<p> 题意:n个敌人,m对敌人是朋友,之后m行给出u与v是朋友,当攻击某个敌人时,他的朋友也可以被打死,问最少攻击几次可以将所有的敌人消灭。</p><a id="more"></a><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a></p><p> 比较裸的一道舞蹈链题目,重复覆盖问题,需要进行剪枝。</p><p> <img src="./links.jpg" alt="links"></p><p> 对于这道题,舞蹈链中的节点的意义是,如第9个点表示 2&8 是朋友,第10个点表示2&5是朋友。</p><p> 对于第一组样例输入:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">5 4</span><br><span class="line">1 2</span><br><span class="line">1 3</span><br><span class="line">2 4</span><br><span class="line">4 5</span><br></pre></td></tr></table></figure></p><p> 首先,在预处理中把每个点设为自己的朋友。对于每组关系,表示为互为朋友。另外,id=0~n的点为辅助元素,因此有如下的交叉十字循环双向链:</p><p> <img src="./links1.png" alt="links1"></p><p> 每次都找包括元素最少的一列,如这里的第3列。因为每个敌人都要背打到,即点都需要被覆盖到,所以想要把第3个敌人打到就是要把第3个点覆盖到,就要选第8或第12个点,它们对应的行为1和3,代表想要覆盖第3个敌人,可以通过直接打击第1或者第3个敌人(这就是为什么要把每个人先设置为自己的敌人)。</p><p> 先尝试选第8个点,即打第1个敌人,那么第6,7,8点都会被覆盖到,而这些点所在的列(包括这个列上的点)都需要被删除。</p><p> 实现过程为通过8,找8所在行的每一个节点,调用remove()函数,删除这个点所在的列上的所有点(没有包括这个点,因为删不删没有区别,这个点在后面不会有任何影响)。过程如下图所示</p><p> <img src="./links2.png" alt="links2"> <img src="/links4.png" alt="links4"></p><p> 递归过程中记得剪枝,不然会超时。<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">* hdu 3498 whosyourdaddy</span></span><br><span class="line"><span class="comment">* 舞蹈链(dancing links),估值,剪枝</span></span><br><span class="line"><span class="comment">* 题意:有n个单位的敌人,给出谁和谁相邻,对某个敌人进行攻击时该敌人以及与其直接相邻的敌人都会被消灭。</span></span><br><span class="line"><span class="comment">* 是一个比较明显的重复覆盖问题</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 60</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> L[MAXN*MAXN], R[MAXN*MAXN], U[MAXN*MAXN], D[MAXN*MAXN];<span class="comment">//四个方向链表</span></span><br><span class="line"><span class="keyword">int</span> C[MAXN*MAXN];<span class="comment">//记录每个节点属于哪一列</span></span><br><span class="line"><span class="keyword">int</span> H[MAXN];<span class="comment">//用来记录这一行的其中一个节点</span></span><br><span class="line"><span class="keyword">int</span> cnt[MAXN], vis[MAXN];<span class="comment">//cnt列链表中的元素个数</span></span><br><span class="line"><span class="built_in">vector</span><<span class="keyword">int</span>> E[MAXN];</span><br><span class="line"><span class="keyword">int</span> n, m, id, fans;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*初始化*/</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i <= n; i++)</span><br><span class="line">{</span><br><span class="line">E[i].clear();</span><br><span class="line">E[i].push_back(i);</span><br><span class="line">cnt[i] = <span class="number">0</span>;</span><br><span class="line">U[i] = D[i] = i;</span><br><span class="line">L[i + <span class="number">1</span>] = i;</span><br><span class="line">R[i] = i + <span class="number">1</span>;</span><br><span class="line">}</span><br><span class="line">R[n] = <span class="number">0</span>;</span><br><span class="line">id = n + <span class="number">1</span>;</span><br><span class="line"><span class="built_in">memset</span>(H, <span class="number">-1</span>, <span class="keyword">sizeof</span>(H));<span class="comment">//head填充-1</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*把r,c加入到十字链中*/</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">link</span><span class="params">(<span class="keyword">int</span> r, <span class="keyword">int</span> c)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">cnt[c]++;</span><br><span class="line">C[id] = c;</span><br><span class="line">U[id] = U[c];</span><br><span class="line">D[U[c]] = id;</span><br><span class="line">D[id] = c;</span><br><span class="line">U[c] = id;</span><br><span class="line"><span class="keyword">if</span> (H[r] == <span class="number">-1</span>)</span><br><span class="line">H[r] = L[id] = R[id] = id;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line">L[id] = L[H[r]];</span><br><span class="line">R[L[H[r]]] = id;</span><br><span class="line">R[id] = H[r];</span><br><span class="line">L[H[r]] = id;</span><br><span class="line">}</span><br><span class="line">id++;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*删除列*/</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">remove</span><span class="params">(<span class="keyword">int</span> size)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = D[size]; j != size; j = D[j])</span><br><span class="line">{</span><br><span class="line">L[R[j]] = L[j];</span><br><span class="line">R[L[j]] = R[j];</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*恢复列*/</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">resume</span><span class="params">(<span class="keyword">int</span> size)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = D[size]; j != size; j = D[j])</span><br><span class="line">L[R[j]] = R[L[j]] = j;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*估值函数 返回最少需要多少次才能结束*/</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">h</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> sum = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">memset</span>(vis, <span class="number">0</span>, <span class="keyword">sizeof</span>(vis));</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = R[<span class="number">0</span>]; i != <span class="number">0</span>; i = R[i])</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (vis[i])</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line">sum++;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = D[i]; j != i; j = D[j])</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> k = R[j]; k != j; k = R[k])</span><br><span class="line">vis[C[k]] = <span class="number">1</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> sum;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">dance</span><span class="params">(<span class="keyword">int</span> k)</span><span class="comment">//已经走了k步,继续往下搜索</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> mm = MAXN, pos;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*剪枝</span></span><br><span class="line"><span class="comment">*已经走的加上至少需要走的已经超过现在找到的最优解,那么继续找下去也不可能是最优解*/</span></span><br><span class="line"><span class="keyword">if</span> (k + h() >= fans)</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//cout << "R[0]="<<R[0] << endl;</span></span><br><span class="line"><span class="keyword">if</span> (R[<span class="number">0</span>] == <span class="number">0</span>)<span class="comment">//已经是一个解</span></span><br><span class="line">{</span><br><span class="line"><span class="comment">//cout << "!"<< endl;</span></span><br><span class="line"><span class="keyword">if</span> (k < fans)</span><br><span class="line">fans = k;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//选最少的一列</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = R[<span class="number">0</span>]; i != <span class="number">0</span>; i = R[i])</span><br><span class="line"><span class="keyword">if</span> (mm > cnt[i])</span><br><span class="line">{</span><br><span class="line">mm = cnt[i];</span><br><span class="line">pos = i;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//尝试这一列的每一个点,找最优解</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = D[pos]; i != pos; i = D[i])</span><br><span class="line">{</span><br><span class="line">remove(i);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = R[i]; j != i; j = R[j])</span><br><span class="line"> remove(j);</span><br><span class="line">dance(k + <span class="number">1</span>);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = R[i]; j != i; j = R[j])</span><br><span class="line">resume(j);</span><br><span class="line">resume(i);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> u, v;</span><br><span class="line"><span class="keyword">while</span> (<span class="built_in">scanf</span>(<span class="string">"%d %d"</span>, &n, &m) != <span class="number">-1</span>)</span><br><span class="line">{</span><br><span class="line">init();</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < m; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d %d"</span>, &u, &v);</span><br><span class="line">E[u].push_back(v);</span><br><span class="line">E[v].push_back(u);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">vector</span><<span class="keyword">int</span>>::iterator it = E[i].begin(); it != E[i].end(); it++)</span><br><span class="line">link(i, *it);</span><br><span class="line">fans = n;<span class="comment">//最差解</span></span><br><span class="line">dance(<span class="number">0</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>, fans);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 题意:n个敌人,m对敌人是朋友,之后m行给出u与v是朋友,当攻击某个敌人时,他的朋友也可以被打死,问最少攻击几次可以将所有的敌人消灭。</p>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="poj" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/poj/"/>
<category term="dancing links" scheme="http://wmpeng.github.io/tags/dancing-links/"/>
<category term="剪枝" scheme="http://wmpeng.github.io/tags/%E5%89%AA%E6%9E%9D/"/>
</entry>
<entry>
<title>hdu 4828 Girds</title>
<link href="http://wmpeng.github.io/2017/02/01/%E7%AE%97%E6%B3%95/OnlieJudge/hdu/hdu%204828-Girds/"/>
<id>http://wmpeng.github.io/2017/02/01/算法/OnlieJudge/hdu/hdu 4828-Girds/</id>
<published>2017-02-01T01:59:42.000Z</published>
<updated>2017-02-01T02:05:57.350Z</updated>
<content type="html"><![CDATA[<p> 题意明确,对于N,求第N个卡特兰数。直接求比较复杂,使用递推公式 Catalan(n+1) = Catalan(n)<em>(4</em>n+2)/(n+2),结果需要MOD而其中又有除法,所以利用逆元,转换为 Catalan(n+1) = Catalan(n)<em>(4</em>n+2) * Niyuan(n+2) % MOD。需要计算逆元k,利用扩展欧几里得求得。</p><a id="more"></a><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a></p><p> 注意:使用long long,过程中注意不要溢出。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">* hdu 4828 Girds</span></span><br><span class="line"><span class="comment">* 卡特兰数,逆元</span></span><br><span class="line"><span class="comment">* 描述:利用递推公式求卡特兰数 Catalan(n+1) = Catalan(n)*(4*n+2)/(n+2),因为结果需要MOD而其中又有除法,</span></span><br><span class="line"><span class="comment">*所以利用逆元,转换为 Catalan(n+1) = Catalan(n)*(4*n+2) * Niyuan(n+2) % MOD,</span></span><br><span class="line"><span class="comment">*由于MOD很大,所以利用了扩展欧几里得算法求逆元。</span></span><br><span class="line"><span class="comment">* 注意:使用long long,过程中及时mod防止溢出</span></span><br><span class="line"><span class="comment">* author: wmpeng</span></span><br><span class="line"><span class="comment">* time: 2017-01-31 22:06:26</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><math.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MOD 1000000007ll</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> catalan[<span class="number">1000005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> x, y;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">* 利用 (a / b) MOD p == a MOD (p * b) / b</span></span><br><span class="line"><span class="comment">* !不对 因为MOD应该在最后取余</span></span><br><span class="line"><span class="comment">**/</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init1</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">catalan[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">catalan[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> i = <span class="number">1</span>; i <= <span class="number">1000000</span>; i++)</span><br><span class="line">{</span><br><span class="line">catalan[i + <span class="number">1</span>] = ( (catalan[i] * (<span class="number">4</span> * i + <span class="number">2</span>)) % (MOD*(i + <span class="number">2</span>)) ) / (i + <span class="number">2</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= <span class="number">100</span>; i++)</span><br><span class="line"><span class="built_in">cout</span> <<i<<<span class="string">":"</span><< catalan[i]%MOD << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*扩展欧几里得算法*/</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">gcd</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> a, <span class="keyword">long</span> <span class="keyword">long</span> b)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">if</span> (b == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">x = <span class="number">1</span>;</span><br><span class="line">y = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">//cout << a << " " << b << endl;</span></span><br><span class="line">gcd(b, a%b);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> tmp;</span><br><span class="line">tmp = x;</span><br><span class="line">x = y;</span><br><span class="line">y = tmp - a / b * y;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*利用扩展欧几里得算法求逆元x</span></span><br><span class="line"><span class="comment">*ax+py=1,x为b关于p的逆元,y为p关于b的逆元*/</span></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">niyuan</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> n)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">gcd(n, MOD);</span><br><span class="line"><span class="keyword">return</span> (x%MOD + MOD) % MOD;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/*利用 (a / b) MOD p == (a * k) MOD p ,其中k为b关于p的逆元*/</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init2</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">catalan[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= <span class="number">1000000</span>; i++)</span><br><span class="line">catalan[i + <span class="number">1</span>] = (catalan[i] * (<span class="number">4</span> * i + <span class="number">2</span>) % MOD * niyuan(i+<span class="number">2</span>)) % MOD;<span class="comment">//注意溢出</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">init2();</span><br><span class="line"><span class="keyword">int</span> t, n;</span><br><span class="line"><span class="built_in">cin</span> >> t;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= t; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &n);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d:\n%lld\n"</span>,i, catalan[n]);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p> 题意明确,对于N,求第N个卡特兰数。直接求比较复杂,使用递推公式 Catalan(n+1) = Catalan(n)<em>(4</em>n+2)/(n+2),结果需要MOD而其中又有除法,所以利用逆元,转换为 Catalan(n+1) = Catalan(n)<em>(4</em>n+2) * Niyuan(n+2) % MOD。需要计算逆元k,利用扩展欧几里得求得。</p>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="poj" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/poj/"/>
<category term="逆元" scheme="http://wmpeng.github.io/tags/%E9%80%86%E5%85%83/"/>
<category term="卡特兰数" scheme="http://wmpeng.github.io/tags/%E5%8D%A1%E7%89%B9%E5%85%B0%E6%95%B0/"/>
</entry>
<entry>
<title>poj 1845 Sumdiv</title>
<link href="http://wmpeng.github.io/2017/02/01/%E7%AE%97%E6%B3%95/OnlieJudge/poj/poj-1845-Sumdiv/"/>
<id>http://wmpeng.github.io/2017/02/01/算法/OnlieJudge/poj/poj-1845-Sumdiv/</id>
<published>2017-02-01T01:42:11.000Z</published>
<updated>2017-02-01T01:57:16.683Z</updated>
<content type="html"><![CDATA[<p> 题意是 输入A,B,求(A^B)的所有因子的和之后再mod 9901的值。<br><a id="more"></a></p><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a></p><p> 需要用到逆元的知识,只是很简单的知识,并不需要计算逆元。<br> A^B=(a1^n1)<em>(a2^n2)</em>(a3^n3)…(am^nm),其中ni=pi<em>B.所以ans= (1+a1+a1^2+…a1^n1)</em>(1+a2+a2^2+…a2^n2)<em>(1+a3+a3^2+…a3^n2)</em>…(1+am+am^2+…am^nm) mod 9901=Π( (ai^(ni+1)-1)/(ai-1) mod 9901 ).用到逆元的知识:【a/b mod c = (a mod (b<em>c))/ b】<br> ans=Π(a1^(n1+1)-1) mod ( 9901</em>(a1-1)) / (a1-1)。对于前面的a1^(n1+1),快速幂。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">*poj 1845</span></span><br><span class="line"><span class="comment">*模的逆元</span></span><br><span class="line"><span class="comment">*注意:矩阵快速幂时会超过long long,注意手动mod</span></span><br><span class="line"><span class="comment">*author: wmpeng</span></span><br><span class="line"><span class="comment">*time: 2017-01-31 19:46:27</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><math.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MOD 9901ll</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> a, b;</span><br><span class="line"><span class="built_in">map</span><<span class="keyword">long</span> <span class="keyword">long</span>,<span class="keyword">long</span> <span class="keyword">long</span>> factor;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">resolution</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> sq = <span class="built_in">sqrt</span>(<span class="keyword">double</span>(a));</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> aa = a;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> i = <span class="number">2</span>; i <= sq && aa!=<span class="number">1</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (aa%i == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">factor[i]++;</span><br><span class="line">aa /= i;</span><br><span class="line">i--;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (aa > <span class="number">1</span>)</span><br><span class="line">factor[aa]++;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">calMi</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> mi1,<span class="keyword">long</span> <span class="keyword">long</span> mi2,<span class="keyword">long</span> <span class="keyword">long</span> mod)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ret = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">60</span>; i >= <span class="number">0</span>; i--)</span><br><span class="line">{</span><br><span class="line">ret *= <span class="number">2</span>;</span><br><span class="line">ret +=mi1 * (mi2 / (<span class="number">1l</span>l << i));</span><br><span class="line">ret %= mod;</span><br><span class="line">mi2 %= (<span class="number">1l</span>l << i);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> ret;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">cal</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> pi, <span class="keyword">long</span> <span class="keyword">long</span> ai)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> mi[<span class="number">1000</span>] = {<span class="number">1</span>,pi};</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> mod = MOD*(pi - <span class="number">1</span>);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> kk = ai*b + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ret = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> i = <span class="number">2</span>; i <= <span class="number">999</span>; i++)</span><br><span class="line">{</span><br><span class="line">mi[i] = calMi(mi[i - <span class="number">1</span>], mi[i - <span class="number">1</span>], mod);<span class="comment">//注意可能超long long</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">long</span> <span class="keyword">long</span> i=<span class="number">1</span>;kk != <span class="number">0</span>;i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span>(kk % <span class="number">2</span>==<span class="number">1</span>)</span><br><span class="line">ret *= mi[i];</span><br><span class="line">ret %= mod;</span><br><span class="line">kk /= <span class="number">2</span>;</span><br><span class="line">}</span><br><span class="line">ret = (ret + mod - <span class="number">1</span>) % mod;</span><br><span class="line">ret /= (pi - <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> ret;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (<span class="built_in">cin</span> >> a >> b)</span><br><span class="line">{</span><br><span class="line">factor.clear();</span><br><span class="line">ans = <span class="number">1</span>;</span><br><span class="line">resolution();</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">map</span><<span class="keyword">long</span> <span class="keyword">long</span>, <span class="keyword">long</span> <span class="keyword">long</span>>::iterator it = factor.begin(); it != factor.end(); it++)</span><br><span class="line">{</span><br><span class="line">ans *= cal(it->first, it->second);</span><br><span class="line">ans %= MOD;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">cout</span> << ans << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p> 题意是 输入A,B,求(A^B)的所有因子的和之后再mod 9901的值。<br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="poj" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/poj/"/>
<category term="逆元" scheme="http://wmpeng.github.io/tags/%E9%80%86%E5%85%83/"/>
<category term="快速幂" scheme="http://wmpeng.github.io/tags/%E5%BF%AB%E9%80%9F%E5%B9%82/"/>
</entry>
<entry>
<title>poj 1077 Eight</title>
<link href="http://wmpeng.github.io/2016/12/01/%E7%AE%97%E6%B3%95/OnlieJudge/poj/poj%201077%20Eight/"/>
<id>http://wmpeng.github.io/2016/12/01/算法/OnlieJudge/poj/poj 1077 Eight/</id>
<published>2016-12-01T04:45:53.000Z</published>
<updated>2017-02-01T02:05:42.468Z</updated>
<content type="html"><![CDATA[<p> 经典的八数码问题,A*启发搜索和IDA*都可以解决。其实八数码问题只有 9!=3.6*10^5 种情况,好像可以打表?并且双向dfs应该也是可以过的。比较好的做法是A*和IDA*。</p><a id="more"></a><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a></p><p> A*就是有一个对于每一种情况有一个评估f=g+h,f为评估的值,g是走到现在的情况走了多少步,h是从当前的情况走到答案所需要的步数。h是一个估值函数,函数的设计对求解的效率起到至关重要的作用,选取的不好甚至会差于普通的搜索。对于每种情况有了f,那么每次搜索都从已经找的情况中f最小的开始搜索。实现方法就是把初始情况先push进优先队列,然后每次取top,把top能演变出的四个情况在push进队列。中间注意不要重复入列,队列为空时代表没有结果。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> <span class="built_in">list</span>[<span class="number">9</span>];</span><br><span class="line"><span class="keyword">int</span> jc[<span class="number">9</span>] = { <span class="number">1</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">6</span>,<span class="number">24</span>,<span class="number">120</span>,<span class="number">720</span>,<span class="number">5040</span>,<span class="number">40320</span> };</span><br><span class="line"><span class="keyword">int</span> ansid = <span class="number">322560</span>;</span><br><span class="line"><span class="keyword">bool</span> v[<span class="number">400000</span>];</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">rec</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="keyword">int</span> id;</span><br><span class="line"><span class="keyword">int</span> <span class="built_in">list</span>[<span class="number">9</span>];</span><br><span class="line"><span class="keyword">int</span> g;</span><br><span class="line"><span class="keyword">int</span> h;</span><br><span class="line"><span class="built_in">string</span> ans;</span><br><span class="line">rec <span class="keyword">operator</span>=(rec _r)</span><br><span class="line">{</span><br><span class="line">id = _r.id;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="built_in">list</span>[i] = _r.<span class="built_in">list</span>[i];</span><br><span class="line">g = _r.g;</span><br><span class="line">h = _r.h;</span><br><span class="line">ans = _r.ans;</span><br><span class="line"><span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">}</span><br><span class="line">rec() {}</span><br><span class="line">rec(<span class="keyword">int</span> _id, <span class="keyword">int</span>* _list, <span class="keyword">int</span> _g, <span class="keyword">int</span> _h, <span class="built_in">string</span> _ans)</span><br><span class="line">{</span><br><span class="line">id = _id;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="built_in">list</span>[i] = _list[i];</span><br><span class="line">g = _g;</span><br><span class="line">h = _h;</span><br><span class="line">ans = _ans;</span><br><span class="line">}</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">T</span>> <span class="title">T</span> <span class="title">abs</span>(<span class="title">T</span> <span class="title">x</span>)</span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="keyword">return</span> (x < <span class="number">0</span> ? -x : x);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">bool</span> <span class="keyword">operator</span><(rec r1, rec r2)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">return</span> r1.h + r1.g > r2.h + r2.g;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">hash_</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[], <span class="keyword">int</span> len = <span class="number">9</span>)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < len; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> cnt = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < i; j++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">list</span>[i] < <span class="built_in">list</span>[j])</span><br><span class="line">cnt++;</span><br><span class="line">ans += cnt * jc[i];</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">eval_</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">list</span>[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">int</span> h1, l1, h2, l2;</span><br><span class="line">h1 = i / <span class="number">3</span>;</span><br><span class="line">l1 = i % <span class="number">3</span>;</span><br><span class="line">h2 = <span class="number">2</span>;</span><br><span class="line">l2 = <span class="number">2</span>;</span><br><span class="line">ans += <span class="built_in">abs</span>(h1 - h2) + <span class="built_in">abs</span>(l1 - l2);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> h1, l1, h2, l2;</span><br><span class="line">h1 = i / <span class="number">3</span>;</span><br><span class="line">l1 = i % <span class="number">3</span>;</span><br><span class="line">h2 = (<span class="built_in">list</span>[i] - <span class="number">1</span>) / <span class="number">3</span>;</span><br><span class="line">l2 = (<span class="built_in">list</span>[i] - <span class="number">1</span>) % <span class="number">3</span>;</span><br><span class="line">ans += <span class="built_in">abs</span>(h1 - h2) + <span class="built_in">abs</span>(l1 - l2);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function">rec <span class="title">up</span><span class="params">(rec curr)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (curr.<span class="built_in">list</span>[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (i / <span class="number">3</span> != <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">curr.<span class="built_in">list</span>[i] ^= curr.<span class="built_in">list</span>[i - <span class="number">3</span>] ^= curr.<span class="built_in">list</span>[i] ^= curr.<span class="built_in">list</span>[i - <span class="number">3</span>];</span><br><span class="line"><span class="keyword">return</span> rec(hash_(curr.<span class="built_in">list</span>), curr.<span class="built_in">list</span>, curr.g + <span class="number">1</span>, eval_(curr.<span class="built_in">list</span>), curr.ans + <span class="string">'u'</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> curr;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function">rec <span class="title">dn</span><span class="params">(rec curr)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (curr.<span class="built_in">list</span>[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (i / <span class="number">3</span> != <span class="number">2</span>)</span><br><span class="line">{</span><br><span class="line">curr.<span class="built_in">list</span>[i] ^= curr.<span class="built_in">list</span>[i + <span class="number">3</span>] ^= curr.<span class="built_in">list</span>[i] ^= curr.<span class="built_in">list</span>[i + <span class="number">3</span>];</span><br><span class="line"><span class="keyword">return</span> rec(hash_(curr.<span class="built_in">list</span>), curr.<span class="built_in">list</span>, curr.g + <span class="number">1</span>, eval_(curr.<span class="built_in">list</span>), curr.ans + <span class="string">'d'</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> curr;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function">rec <span class="title">lft</span><span class="params">(rec curr)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (curr.<span class="built_in">list</span>[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (i % <span class="number">3</span> != <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">curr.<span class="built_in">list</span>[i] ^= curr.<span class="built_in">list</span>[i - <span class="number">1</span>] ^= curr.<span class="built_in">list</span>[i] ^= curr.<span class="built_in">list</span>[i - <span class="number">1</span>];</span><br><span class="line"><span class="keyword">return</span> rec(hash_(curr.<span class="built_in">list</span>), curr.<span class="built_in">list</span>, curr.g + <span class="number">1</span>, eval_(curr.<span class="built_in">list</span>), curr.ans + <span class="string">'l'</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> curr;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function">rec <span class="title">rt</span><span class="params">(rec curr)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (curr.<span class="built_in">list</span>[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (i % <span class="number">3</span> != <span class="number">2</span>)</span><br><span class="line">{</span><br><span class="line">curr.<span class="built_in">list</span>[i] ^= curr.<span class="built_in">list</span>[i + <span class="number">1</span>] ^= curr.<span class="built_in">list</span>[i] ^= curr.<span class="built_in">list</span>[i + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">return</span> rec(hash_(curr.<span class="built_in">list</span>), curr.<span class="built_in">list</span>, curr.g + <span class="number">1</span>, eval_(curr.<span class="built_in">list</span>), curr.ans + <span class="string">'r'</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> curr;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">prt</span><span class="params">(rec r)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < r.ans.length(); i++)</span><br><span class="line"><span class="built_in">cout</span> << r.ans[i];</span><br><span class="line"><span class="built_in">cout</span> << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">prtmat</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i <= <span class="number">8</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">cout</span> << <span class="built_in">list</span>[i];</span><br><span class="line"><span class="keyword">if</span> ((i + <span class="number">1</span>) % <span class="number">3</span> == <span class="number">0</span>)</span><br><span class="line"><span class="built_in">cout</span> << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"><span class="built_in">cout</span> << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">bh</span><span class="params">(<span class="keyword">char</span> c)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">list</span>[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (c == <span class="string">'d'</span>)</span><br><span class="line"><span class="built_in">list</span>[i] ^= <span class="built_in">list</span>[i + <span class="number">3</span>] ^= <span class="built_in">list</span>[i] ^= <span class="built_in">list</span>[i + <span class="number">3</span>];</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (c == <span class="string">'u'</span>)</span><br><span class="line"><span class="built_in">list</span>[i] ^= <span class="built_in">list</span>[i - <span class="number">3</span>] ^= <span class="built_in">list</span>[i] ^= <span class="built_in">list</span>[i - <span class="number">3</span>];</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (c == <span class="string">'r'</span>)</span><br><span class="line"><span class="built_in">list</span>[i] ^= <span class="built_in">list</span>[i + <span class="number">1</span>] ^= <span class="built_in">list</span>[i] ^= <span class="built_in">list</span>[i + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (c == <span class="string">'l'</span>)</span><br><span class="line"><span class="built_in">list</span>[i] ^= <span class="built_in">list</span>[i - <span class="number">1</span>] ^= <span class="built_in">list</span>[i] ^= <span class="built_in">list</span>[i - <span class="number">1</span>];</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> cnt = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line"><span class="keyword">char</span> c;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">cin</span> >> c;</span><br><span class="line"><span class="keyword">if</span> (c == <span class="string">'x'</span>)</span><br><span class="line"><span class="built_in">list</span>[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">list</span>[i] = c - <span class="string">'0'</span>;</span><br><span class="line">}</span><br><span class="line">priority_queue<rec> que;</span><br><span class="line">que.push(rec(hash_(<span class="built_in">list</span>), <span class="built_in">list</span>, <span class="number">0</span>, eval_(<span class="built_in">list</span>), <span class="string">""</span>));</span><br><span class="line">v[hash_(<span class="built_in">list</span>)] = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">while</span> (!que.empty())</span><br><span class="line">{</span><br><span class="line">rec curr = que.top();</span><br><span class="line">que.pop();</span><br><span class="line"><span class="keyword">if</span> (curr.id == ansid)</span><br><span class="line">{</span><br><span class="line">prt(curr);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">rec temp;</span><br><span class="line">temp = up(curr);</span><br><span class="line"><span class="keyword">if</span> (!v[temp.id])</span><br><span class="line">{</span><br><span class="line">v[temp.id] = <span class="literal">true</span>;</span><br><span class="line">que.push(temp);</span><br><span class="line">cnt++;</span><br><span class="line">}</span><br><span class="line">temp = dn(curr);</span><br><span class="line"><span class="keyword">if</span> (!v[temp.id])</span><br><span class="line">{</span><br><span class="line">v[temp.id] = <span class="literal">true</span>;</span><br><span class="line">que.push(temp);</span><br><span class="line">cnt++;</span><br><span class="line">}</span><br><span class="line">temp = lft(curr);</span><br><span class="line"><span class="keyword">if</span> (!v[temp.id])</span><br><span class="line">{</span><br><span class="line">v[temp.id] = <span class="literal">true</span>;</span><br><span class="line">que.push(temp);</span><br><span class="line">cnt++;</span><br><span class="line">}</span><br><span class="line">temp = rt(curr);</span><br><span class="line"><span class="keyword">if</span> (!v[temp.id])</span><br><span class="line">{</span><br><span class="line">v[temp.id] = <span class="literal">true</span>;</span><br><span class="line">que.push(temp);</span><br><span class="line">cnt++;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="built_in">cout</span> << <span class="built_in">endl</span> << cnt << <span class="built_in">endl</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p> IDA*算法就是一个限制搜索深度的dfs,在突破一定条件时时候就不要继续搜索了,如果没有找到答案就放宽限制条件。代码实现上IDA*更加简单,就是dfs加上一个限制,不需要像A*一样记录找过的情况。<br>注意h函数的设计,不能越接近实际效率更高,但是注意h不能大于实际的情况,因为如果h大于实际可能会导致搜索不到结果。</p><p> 这道题我的方法:限制条件时g+h的和不大于某个数,然后不断方法这个限制直到搜索到结果。注意不要来回走的剪枝。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> <span class="built_in">list</span>[<span class="number">9</span>];</span><br><span class="line"><span class="keyword">int</span> step[<span class="number">128</span>];</span><br><span class="line"><span class="keyword">int</span> deep = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">int</span> jc[<span class="number">9</span>] = { <span class="number">1</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">6</span>,<span class="number">24</span>,<span class="number">120</span>,<span class="number">720</span>,<span class="number">5040</span>,<span class="number">40320</span> };</span><br><span class="line"><span class="keyword">int</span> mi;</span><br><span class="line"><span class="keyword">char</span> ans[<span class="number">100</span>];</span><br><span class="line"><span class="keyword">int</span> cnt=<span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">T</span>> <span class="title">T</span> <span class="title">abs</span>(<span class="title">T</span> <span class="title">x</span>)</span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="keyword">return</span> (x < <span class="number">0</span> ? -x : x);</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">hash_</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> cnt = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < i; j++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">list</span>[i] < <span class="built_in">list</span>[j])</span><br><span class="line">cnt++;</span><br><span class="line">ans += cnt * jc[i];</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">eval_</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">list</span>[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">int</span> h1, l1, h2, l2;</span><br><span class="line">h1 = i / <span class="number">3</span>;</span><br><span class="line">l1 = i % <span class="number">3</span>;</span><br><span class="line">h2 = <span class="number">2</span>;</span><br><span class="line">l2 = <span class="number">2</span>;</span><br><span class="line">ans += <span class="built_in">abs</span>(h1 - h2) + <span class="built_in">abs</span>(l1 - l2);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> h1, l1, h2, l2;</span><br><span class="line">h1 = i / <span class="number">3</span>;</span><br><span class="line">l1 = i % <span class="number">3</span>;</span><br><span class="line">h2 = (<span class="built_in">list</span>[i] - <span class="number">1</span>) / <span class="number">3</span>;</span><br><span class="line">l2 = (<span class="built_in">list</span>[i] - <span class="number">1</span>) % <span class="number">3</span>;</span><br><span class="line">ans += <span class="built_in">abs</span>(h1 - h2) + <span class="built_in">abs</span>(l1 - l2);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">up</span><span class="params">(<span class="keyword">int</span>* <span class="built_in">list</span>,<span class="keyword">int</span>* temp)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">temp[i] = <span class="built_in">list</span>[i];</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (temp[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (i / <span class="number">3</span> != <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">temp[i] ^= temp[i - <span class="number">3</span>] ^= temp[i] ^= temp[i - <span class="number">3</span>];</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">dn</span><span class="params">(<span class="keyword">int</span>* <span class="built_in">list</span>, <span class="keyword">int</span>* temp)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">temp[i] = <span class="built_in">list</span>[i];</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (temp[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (i / <span class="number">3</span> != <span class="number">2</span>)</span><br><span class="line">{</span><br><span class="line">temp[i] ^= temp[i + <span class="number">3</span>] ^= temp[i] ^= temp[i + <span class="number">3</span>];</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">lft</span><span class="params">(<span class="keyword">int</span>* <span class="built_in">list</span>, <span class="keyword">int</span>* temp)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">temp[i] = <span class="built_in">list</span>[i];</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (temp[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (i % <span class="number">3</span> != <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">temp[i] ^= temp[i - <span class="number">1</span>] ^= temp[i] ^= temp[i - <span class="number">1</span>];</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">rt</span><span class="params">(<span class="keyword">int</span>* <span class="built_in">list</span>, <span class="keyword">int</span>* temp)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">temp[i] = <span class="built_in">list</span>[i];</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (temp[i] == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (i % <span class="number">3</span> != <span class="number">2</span>)</span><br><span class="line">{</span><br><span class="line">temp[i] ^= temp[i + <span class="number">1</span>] ^= temp[i] ^= temp[i + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">finish</span><span class="params">(<span class="keyword">int</span> <span class="built_in">list</span>[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">8</span>; i++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">list</span>[i] != i + <span class="number">1</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">list</span>[<span class="number">8</span>] != <span class="number">0</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">prt</span><span class="params">(<span class="keyword">char</span> *ans)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; ans[i] != <span class="number">0</span>;i++)</span><br><span class="line"><span class="built_in">cout</span> << ans[i];</span><br><span class="line"><span class="built_in">cout</span> << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> *_list, <span class="keyword">int</span> currDp, <span class="keyword">int</span> pre)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">if</span> (finish(_list))</span><br><span class="line">{</span><br><span class="line">prt(ans);</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">int</span> h = eval_(_list);</span><br><span class="line"><span class="keyword">if</span> (h < mi)</span><br><span class="line">mi = h;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (currDp+ h> deep)</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">int</span> <span class="built_in">list</span>[<span class="number">9</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (step[<span class="string">'u'</span>] + pre != <span class="number">0</span> && up(_list, <span class="built_in">list</span>))<span class="comment">//如果前一步和后一步相反就不要走了</span></span><br><span class="line">{</span><br><span class="line">ans[currDp] = <span class="string">'u'</span>;</span><br><span class="line"><span class="keyword">if</span> (dfs(<span class="built_in">list</span>, currDp + <span class="number">1</span>, step[<span class="string">'u'</span>]))</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (step[<span class="string">'d'</span>] + pre != <span class="number">0</span> && dn(_list, <span class="built_in">list</span>))</span><br><span class="line">{</span><br><span class="line">ans[currDp] = <span class="string">'d'</span>;</span><br><span class="line"><span class="keyword">if</span> (dfs(<span class="built_in">list</span>, currDp + <span class="number">1</span>, step[<span class="string">'d'</span>]))</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (step[<span class="string">'l'</span>] + pre != <span class="number">0</span> && lft(_list, <span class="built_in">list</span>))</span><br><span class="line">{</span><br><span class="line">ans[currDp] = <span class="string">'l'</span>;</span><br><span class="line"><span class="keyword">if</span> (dfs(<span class="built_in">list</span>, currDp + <span class="number">1</span>, step[<span class="string">'l'</span>]))</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (step[<span class="string">'r'</span>] + pre != <span class="number">0</span> && rt(_list, <span class="built_in">list</span>))</span><br><span class="line">{</span><br><span class="line">ans[currDp] = <span class="string">'r'</span>;</span><br><span class="line"><span class="keyword">if</span> (dfs(<span class="built_in">list</span>, currDp + <span class="number">1</span>, step[<span class="string">'r'</span>]))</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">init</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">step[<span class="string">'u'</span>] = <span class="number">1</span>;</span><br><span class="line">step[<span class="string">'d'</span>] = <span class="number">-1</span>;</span><br><span class="line">step[<span class="string">'l'</span>] = <span class="number">2</span>;</span><br><span class="line">step[<span class="string">'r'</span>] = <span class="number">-2</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">init();</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line"><span class="keyword">char</span> c;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i < <span class="number">9</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">cin</span> >> c;</span><br><span class="line"><span class="keyword">if</span> (c == <span class="string">'x'</span>)</span><br><span class="line"><span class="built_in">list</span>[i] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">list</span>[i] = c - <span class="string">'0'</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line">mi = <span class="number">0x7fffffff</span>;</span><br><span class="line"><span class="built_in">memset</span>(ans, <span class="number">0</span>, <span class="keyword">sizeof</span>(ans));</span><br><span class="line"><span class="keyword">if</span> (dfs(<span class="built_in">list</span>, <span class="number">0</span>, <span class="number">0</span>))</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">deep+=mi;</span><br><span class="line"><span class="keyword">if</span> (deep >= <span class="number">50</span>)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">cout</span> << <span class="string">"unsolvable"</span> << <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p> 经典的八数码问题,A*启发搜索和IDA*都可以解决。其实八数码问题只有 9!=3.6*10^5 种情况,好像可以打表?并且双向dfs应该也是可以过的。比较好的做法是A*和IDA*。</p>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="poj" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/poj/"/>
<category term="dfs" scheme="http://wmpeng.github.io/tags/dfs/"/>
<category term="A*" scheme="http://wmpeng.github.io/tags/A/"/>
<category term="IDA*" scheme="http://wmpeng.github.io/tags/IDA/"/>
<category term="hash" scheme="http://wmpeng.github.io/tags/hash/"/>
<category term="康托展开" scheme="http://wmpeng.github.io/tags/%E5%BA%B7%E6%89%98%E5%B1%95%E5%BC%80/"/>
</entry>
<entry>
<title>hdu 5551 Huatuo's Medicine</title>
<link href="http://wmpeng.github.io/2016/11/29/%E7%AE%97%E6%B3%95/OnlieJudge/hdu/hdu%205551%20Huatuo's%20Medicine/"/>
<id>http://wmpeng.github.io/2016/11/29/算法/OnlieJudge/hdu/hdu 5551 Huatuo's Medicine/</id>
<published>2016-11-29T14:24:11.000Z</published>
<updated>2016-11-29T14:36:28.490Z</updated>
<content type="html"><![CDATA[<p> 水题,只有1种药的时候只需要1个瓶子,再每多1种就多两个瓶子。ans=x*2-1.</p><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a><br><a id="more"></a><br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t, x,i;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= t;i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &x);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: %d\n"</span>, i,x * <span class="number">2</span> - <span class="number">1</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 水题,只有1种药的时候只需要1个瓶子,再每多1种就多两个瓶子。ans=x*2-1.</p>
<p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a><br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="hdu" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/hdu/"/>
<category term="水题" scheme="http://wmpeng.github.io/tags/%E6%B0%B4%E9%A2%98/"/>
</entry>
<entry>
<title>hdu 5547 Sudoku</title>
<link href="http://wmpeng.github.io/2016/11/29/%E7%AE%97%E6%B3%95/OnlieJudge/hdu/hdu%205547%20Sudoku/"/>
<id>http://wmpeng.github.io/2016/11/29/算法/OnlieJudge/hdu/hdu 5547 Sudoku/</id>
<published>2016-11-29T14:24:06.000Z</published>
<updated>2016-11-29T14:36:06.125Z</updated>
<content type="html"><![CDATA[<p> 水题,把一个4*4的数独填完整,数据量很小,怎么搞都能过,枚举比较好写但我写的比较麻烦。</p><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a><br><a id="more"></a><br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> mart[<span class="number">4</span>][<span class="number">4</span>],ans[<span class="number">4</span>][<span class="number">4</span>];</span><br><span class="line"><span class="keyword">int</span> tt;</span><br><span class="line"><span class="keyword">int</span> getans;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">(<span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> x = n / <span class="number">4</span>, y = n % <span class="number">4</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (n == <span class="number">16</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">16</span>; i++)</span><br><span class="line">*(ans[<span class="number">0</span>] + i) = *(mart[<span class="number">0</span>] + i);</span><br><span class="line">getans = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (mart[x][y] != <span class="number">0</span>)</span><br><span class="line">peng(n + <span class="number">1</span>);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= <span class="number">4</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> flag = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < <span class="number">4</span>; j++)</span><br><span class="line"><span class="keyword">if</span> (mart[x][j] == i || mart[j][y] == i)</span><br><span class="line">{</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (x < <span class="number">2</span> && y < <span class="number">2</span> && (mart[<span class="number">0</span>][<span class="number">0</span>] == i || mart[<span class="number">1</span>][<span class="number">0</span>] == i || mart[<span class="number">0</span>][<span class="number">1</span>] == i || mart[<span class="number">1</span>][<span class="number">1</span>] == i))</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (x < <span class="number">2</span> && y >= <span class="number">2</span> && (mart[<span class="number">0</span>][<span class="number">2</span>] == i || mart[<span class="number">1</span>][<span class="number">2</span>] == i || mart[<span class="number">0</span>][<span class="number">3</span>] == i || mart[<span class="number">1</span>][<span class="number">3</span>] == i))</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (x >= <span class="number">2</span> && y < <span class="number">2</span> && (mart[<span class="number">2</span>][<span class="number">0</span>] == i || mart[<span class="number">3</span>][<span class="number">0</span>] == i || mart[<span class="number">2</span>][<span class="number">1</span>] == i || mart[<span class="number">3</span>][<span class="number">1</span>] == i))</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (x >= <span class="number">2</span> && y >= <span class="number">2</span> && (mart[<span class="number">2</span>][<span class="number">2</span>] == i || mart[<span class="number">2</span>][<span class="number">3</span>] == i || mart[<span class="number">3</span>][<span class="number">2</span>] == i || mart[<span class="number">3</span>][<span class="number">3</span>] == i))</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (flag == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">mart[x][y] = i;</span><br><span class="line"><span class="keyword">if</span> (getans == <span class="number">0</span>)</span><br><span class="line">peng(n + <span class="number">1</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">mart[x][y] = <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t, i, j;</span><br><span class="line"><span class="keyword">char</span> s[<span class="number">5</span>];</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span> (tt = <span class="number">1</span>; tt <= t;tt++)</span><br><span class="line">{</span><br><span class="line">getans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i < <span class="number">4</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, s);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j < <span class="number">4</span>; j++)</span><br><span class="line"><span class="keyword">if</span> (s[j] == <span class="string">'*'</span>)</span><br><span class="line">mart[i][j] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">mart[i][j] = s[j] - <span class="string">'0'</span>;</span><br><span class="line">}</span><br><span class="line">peng(<span class="number">0</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d:\n"</span>, tt);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">4</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < <span class="number">4</span>; j++)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d"</span>, ans[i][j]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 水题,把一个4*4的数独填完整,数据量很小,怎么搞都能过,枚举比较好写但我写的比较麻烦。</p>
<p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a><br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="hdu" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/hdu/"/>
<category term="水题" scheme="http://wmpeng.github.io/tags/%E6%B0%B4%E9%A2%98/"/>
</entry>
<entry>
<title>hdu 5545 Battle of Guandu</title>
<link href="http://wmpeng.github.io/2016/11/29/%E7%AE%97%E6%B3%95/OnlieJudge/hdu/hdu%205545%20Battle%20of%20Guandu/"/>
<id>http://wmpeng.github.io/2016/11/29/算法/OnlieJudge/hdu/hdu 5545 Battle of Guandu/</id>
<published>2016-11-29T14:24:02.000Z</published>
<updated>2016-11-29T14:35:44.835Z</updated>
<content type="html"><![CDATA[<p> 题目比较麻烦,直接说想法。一个村庄对应曹操的战场和袁绍的战场,可以转化为一个从曹操的战场到袁绍的战场的边,边的权值为雇佣费用。<br><a id="more"></a></p><p> 重要度为2的点的人至少要多1个人,而每个重要度为2的点多1个人就会导致它指向的点也多一个人,如果这个点重要度为1或2,那么这个人就还要转移出去,如果重要度是0就不用继续转移了。所以这道题的做法就是最短路,每个村庄对应的曹操战场指向袁绍战场为一条有向边,每个重要度为2的点到距离它最近的0重要度的点的最短路长度的和。这个是一个多源最短路,是会TLT的,但是所有重要度为0的点可以捏成一个点,因为它们都是最短路的终点,所以转换为多个点到一个点的最短路。然后可以把边反向,转换成一个点到其他所有点的单源最短路的长度的和。所以其实就是一个单元最短路,但是感觉还是不太好看出来的。</p><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a><br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INF 2100000000000000000ll</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> n, m, x[<span class="number">100005</span>], y[<span class="number">100005</span>], c[<span class="number">100005</span>], w[<span class="number">100005</span>];</span><br><span class="line"><span class="keyword">bool</span> vis[<span class="number">100005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dis[<span class="number">100005</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>, <span class="keyword">int</span>> edge;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>, <span class="keyword">long</span> <span class="keyword">long</span>> node;</span><br><span class="line"><span class="built_in">vector</span><edge> adjList[<span class="number">100005</span>];</span><br><span class="line"><span class="keyword">bool</span> <span class="keyword">operator</span><(node n1, node n2)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">return</span> n1.second < n2.second;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line">priority_queue<node> q;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i <= <span class="number">100004</span>; i++)</span><br><span class="line">{</span><br><span class="line">adjList[i].clear();</span><br><span class="line">dis[i] = INF;</span><br><span class="line">vis[i] = <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (w[y[i]] == <span class="number">0</span>)</span><br><span class="line">adjList[<span class="number">0</span>].push_back(edge(x[i], c[i]));<span class="comment">//把所有为0的点归到一起</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (w[x[i]] == <span class="number">0</span>)</span><br><span class="line">adjList[y[i]].push_back(edge(<span class="number">0</span>, c[i]));</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">adjList[y[i]].push_back(edge(x[i], c[i]));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">q.push(node(<span class="number">0</span> ,<span class="number">0</span>));</span><br><span class="line">dis[<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (!q.empty())</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> curr = (q.top()).first;</span><br><span class="line">q.pop();</span><br><span class="line">vis[curr] = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">vector</span><edge>::iterator it = adjList[curr].begin(); it != adjList[curr].end(); it++)</span><br><span class="line"><span class="keyword">if</span> (dis[curr] + it->second < dis[it->first])</span><br><span class="line">{</span><br><span class="line">dis[it->first] = dis[curr] + it->second;</span><br><span class="line">q.push({ it->first,dis[it->first] });</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= m; i++)</span><br><span class="line"><span class="keyword">if</span> (w[i] == <span class="number">2</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (vis[i] == <span class="literal">false</span>)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">cout</span> << <span class="number">-1</span> << <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">ans += dis[i];</span><br><span class="line">}</span><br><span class="line"><span class="built_in">cout</span> << ans << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, j, t;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= t; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &n, &m);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &x[j]);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &y[j]);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &c[j]);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= m; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &w[j]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: "</span>, i);</span><br><span class="line">peng();</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 题目比较麻烦,直接说想法。一个村庄对应曹操的战场和袁绍的战场,可以转化为一个从曹操的战场到袁绍的战场的边,边的权值为雇佣费用。<br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="hdu" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/hdu/"/>
<category term="最短路" scheme="http://wmpeng.github.io/tags/%E6%9C%80%E7%9F%AD%E8%B7%AF/"/>
</entry>
<entry>
<title>hdu 5543 Pick The Sticks</title>
<link href="http://wmpeng.github.io/2016/11/29/%E7%AE%97%E6%B3%95/OnlieJudge/hdu/hdu%205543%20Pick%20The%20Sticks/"/>
<id>http://wmpeng.github.io/2016/11/29/算法/OnlieJudge/hdu/hdu 5543 Pick The Sticks/</id>
<published>2016-11-29T14:23:58.000Z</published>
<updated>2017-08-05T11:24:47.036Z</updated>
<content type="html"><![CDATA[<p> 背包问题,但是可以有两个物品cost取值为一半。<br><a id="more"></a></p><p> dp,最开始想枚举两个取一半的物品编号,但是会超时。但是又想一下可以再背包问题再加一维表示有几个cost取一半,dp[i][j][k]表示前i个物品,容量为j,有k个取一半。 dp[i][j][k]=min{dp[i-1][j][k],dp[i-1][j-c[i]][k],dp[i-1][j][k-1],dp[i-1][j-c[i]/2][k-1]}</p><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a><br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> n, l;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Stick</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> l;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> v;</span><br><span class="line">}sticks[<span class="number">1005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dp[<span class="number">4005</span>][<span class="number">3</span>];<span class="comment">//最后一个维度代表有几个机会折半</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">memset</span>(dp, <span class="number">0</span>, <span class="keyword">sizeof</span>(dp));</span><br><span class="line"><span class="comment">//考虑只放一个的情况</span></span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"><span class="keyword">if</span> (sticks[j].v > ans)</span><br><span class="line">ans = sticks[j].v;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"><span class="keyword">for</span> (j = l; j >= sticks[i].l/<span class="number">2</span>; j--)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (j - sticks[i].l>=<span class="number">0</span> && dp[j][<span class="number">0</span>] < dp[j - sticks[i].l][<span class="number">0</span>] + sticks[i].v)</span><br><span class="line">dp[j][<span class="number">0</span>] = dp[j - sticks[i].l][<span class="number">0</span>] + sticks[i].v;</span><br><span class="line"><span class="keyword">if</span> (j - sticks[i].l >= <span class="number">0</span> && dp[j][<span class="number">1</span>] < dp[j - sticks[i].l][<span class="number">1</span>] + sticks[i].v)<span class="comment">//每个分两种情况,当前(j)取一半还是不取一半</span></span><br><span class="line">dp[j][<span class="number">1</span>] = dp[j - sticks[i].l][<span class="number">1</span>] + sticks[i].v;</span><br><span class="line"><span class="keyword">if</span> (dp[j][<span class="number">1</span>] < dp[j - sticks[i].l / <span class="number">2</span>][<span class="number">0</span>] + sticks[i].v)</span><br><span class="line">dp[j][<span class="number">1</span>] = dp[j - sticks[i].l / <span class="number">2</span>][<span class="number">0</span>] + sticks[i].v;</span><br><span class="line"><span class="keyword">if</span> (j - sticks[i].l >= <span class="number">0</span> && dp[j][<span class="number">2</span>] < dp[j - sticks[i].l][<span class="number">2</span>] + sticks[i].v)</span><br><span class="line">dp[j][<span class="number">2</span>] = dp[j - sticks[i].l][<span class="number">2</span>] + sticks[i].v;</span><br><span class="line"><span class="keyword">if</span> (dp[j][<span class="number">2</span>] < dp[j - sticks[i].l / <span class="number">2</span>][<span class="number">1</span>] + sticks[i].v)</span><br><span class="line">dp[j][<span class="number">2</span>] = dp[j - sticks[i].l / <span class="number">2</span>][<span class="number">1</span>] + sticks[i].v;</span><br><span class="line">}</span><br><span class="line">ans = (ans>dp[l][<span class="number">2</span>]?ans: dp[l][<span class="number">2</span>]);</span><br><span class="line"><span class="built_in">cout</span> << ans << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t, i, j;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= t; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &n, &l);</span><br><span class="line">l*= <span class="number">2</span>;</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%I64d%I64d"</span>, &sticks[j].l, &sticks[j].v);</span><br><span class="line">sticks[j].l*= <span class="number">2</span>;</span><br><span class="line">}</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: "</span>, i);</span><br><span class="line">peng();</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 背包问题,但是可以有两个物品cost取值为一半。<br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="hdu" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/hdu/"/>
<category term="DP" scheme="http://wmpeng.github.io/tags/DP/"/>
</entry>
<entry>
<title>hdu 5542 The Battle of Chibi</title>
<link href="http://wmpeng.github.io/2016/11/29/%E7%AE%97%E6%B3%95/OnlieJudge/hdu/hdu%205542%20The%20Battle%20of%20Chibi/"/>
<id>http://wmpeng.github.io/2016/11/29/算法/OnlieJudge/hdu/hdu 5542 The Battle of Chibi/</id>
<published>2016-11-29T14:23:53.000Z</published>
<updated>2017-08-05T11:25:02.755Z</updated>
<content type="html"><![CDATA[<p> 求长度等于m的严格上升子序列的个数。<br><a id="more"></a></p><p> 离散化,dp,树状数组。由于每个数字1e9,所以先离散化再dp。dp[i][j],表示以第i个数字结尾,长度为j的上升子序列个数,dp[i][j]=sum{dp[ii][j-1]} | ii<i && a[ii]<a[i],但是这样会超时,求和的过程用树状数组。</p><p> 建立m棵树状数组,第i个树状数组表示长度为i的子序列。每个树状数组维护的是子序列的最大值为k的个数。即add(kk,k,num),表示在第k棵树上的k点加num,这样就转换为dp[i][j]=check(j-1,a[i]-1).</p><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a></p><blockquote><p>注意:树状数组中第i个结点不是说前i个数,而是子序列的最大值,因为离散过所以只是个数刚好一样而已</p></blockquote><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> n,m;</span><br><span class="line"><span class="keyword">int</span> a[<span class="number">1005</span>],b[<span class="number">10005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dp[<span class="number">1005</span>][<span class="number">1005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> sum[<span class="number">1005</span>][<span class="number">1005</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> kk,<span class="keyword">int</span> k, <span class="keyword">int</span> num)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">while</span> (k <= n)</span><br><span class="line">{</span><br><span class="line">sum[kk][k] += num;</span><br><span class="line">k += k&(-k);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">check</span><span class="params">(<span class="keyword">int</span> kk,<span class="keyword">int</span> k)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> s = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (k >= <span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line">s += sum[kk][k];</span><br><span class="line">k -= k&(-k);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> s;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="built_in">memset</span>(dp,<span class="number">0</span>,<span class="keyword">sizeof</span>(dp));</span><br><span class="line"><span class="built_in">memset</span>(sum,<span class="number">0</span>,<span class="keyword">sizeof</span>(sum));</span><br><span class="line"><span class="keyword">int</span> i,j,k,ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">1</span>;i<=n;i++)</span><br><span class="line">dp[i][<span class="number">1</span>]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">1</span>;i<=n;i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span>(k=<span class="number">2</span>;k<=m;k++)</span><br><span class="line">{</span><br><span class="line">dp[i][k]+=check(k<span class="number">-1</span>,a[i]<span class="number">-1</span>);</span><br><span class="line">dp[i][k]%=<span class="number">1000000007</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span>(k=<span class="number">1</span>;k<=m;k++)</span><br><span class="line">{</span><br><span class="line">add(k,a[i],dp[i][k]);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"> <span class="keyword">for</span>(i=<span class="number">1</span>;i<=n;i++)</span><br><span class="line">{</span><br><span class="line">ans+=dp[i][m];</span><br><span class="line">ans%=<span class="number">1000000007</span>;</span><br><span class="line">}</span><br><span class="line"><span class="built_in">cout</span><<ans<<<span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> t;</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&t);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=t;i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&n,&m);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j<=n;j++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&a[j]);</span><br><span class="line">b[j]=a[j];</span><br><span class="line">}</span><br><span class="line">sort(b+<span class="number">1</span>,b+n+<span class="number">1</span>);</span><br><span class="line"><span class="built_in">map</span><<span class="keyword">int</span>,<span class="keyword">int</span>> mmap;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j<=n;j++)</span><br><span class="line">mmap[b[j]]=j;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j<=n;j++)</span><br><span class="line">a[j]=mmap[a[j]];</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: "</span>,i);</span><br><span class="line">peng();</span><br><span class="line">}</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p> 求长度等于m的严格上升子序列的个数。<br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="hdu" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/hdu/"/>
<category term="DP" scheme="http://wmpeng.github.io/tags/DP/"/>
<category term="树状数组" scheme="http://wmpeng.github.io/tags/%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84/"/>
<category term="离散化" scheme="http://wmpeng.github.io/tags/%E7%A6%BB%E6%95%A3%E5%8C%96/"/>
</entry>
<entry>
<title>hdu 5540 Secrete Master Plan</title>
<link href="http://wmpeng.github.io/2016/11/29/%E7%AE%97%E6%B3%95/OnlieJudge/hdu/hdu%205540%20Secrete%20Master%20Plan/"/>
<id>http://wmpeng.github.io/2016/11/29/算法/OnlieJudge/hdu/hdu 5540 Secrete Master Plan/</id>
<published>2016-11-29T14:23:46.000Z</published>
<updated>2016-12-01T04:50:00.337Z</updated>
<content type="html"><![CDATA[<p> 水题,直接看旋转1~3次四个数相不相同。</p><a id="more"></a><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a></p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[<span class="number">2</span>][<span class="number">2</span>], b[<span class="number">2</span>][<span class="number">2</span>];</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">j</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">2</span>; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j<<span class="number">2</span>; j++)</span><br><span class="line"><span class="keyword">if</span> (a[i][j] != b[i][j]) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">zhuan</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> tmp = a[<span class="number">0</span>][<span class="number">0</span>];</span><br><span class="line">a[<span class="number">0</span>][<span class="number">0</span>] = a[<span class="number">1</span>][<span class="number">0</span>];</span><br><span class="line">a[<span class="number">1</span>][<span class="number">0</span>] = a[<span class="number">1</span>][<span class="number">1</span>];</span><br><span class="line">a[<span class="number">1</span>][<span class="number">1</span>] = a[<span class="number">0</span>][<span class="number">1</span>];</span><br><span class="line">a[<span class="number">0</span>][<span class="number">1</span>] = tmp;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t, cnt = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">while</span> (t--)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">2</span>; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j<<span class="number">2</span>; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &a[i][j]);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">2</span>; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j<<span class="number">2</span>; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &b[i][j]);</span><br><span class="line"></span><br><span class="line"><span class="keyword">bool</span> f = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">4</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (j()) f = <span class="literal">true</span>;</span><br><span class="line">zhuan();</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (f)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: POSSIBLE\n"</span>, ++cnt);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: IMPOSSIBLE\n"</span>, ++cnt);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p> 水题,直接看旋转1~3次四个数相不相同。</p>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="hdu" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/hdu/"/>
<category term="水题" scheme="http://wmpeng.github.io/tags/%E6%B0%B4%E9%A2%98/"/>
</entry>
<entry>
<title>2015 CCPC</title>
<link href="http://wmpeng.github.io/2016/11/28/%E7%AE%97%E6%B3%95/Contests/2015%20CCPC/"/>
<id>http://wmpeng.github.io/2016/11/28/算法/Contests/2015 CCPC/</id>
<published>2016-11-28T08:25:35.000Z</published>
<updated>2017-08-05T11:25:14.895Z</updated>
<content type="html"><![CDATA[<p> 2015 CCPC的部分题目题解和代码。题目在 hdu 5540~5551</p><a id="more"></a><p> Github: <a href="https://github.com/wmpeng/Algorithm" target="_blank" rel="noopener">https://github.com/wmpeng/Algorithm</a></p><h1 id="A-Secrete-Master-Plan"><a href="#A-Secrete-Master-Plan" class="headerlink" title="A Secrete Master Plan"></a>A Secrete Master Plan</h1><p> 水题,直接看旋转1~3次四个数相不相同。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[<span class="number">2</span>][<span class="number">2</span>], b[<span class="number">2</span>][<span class="number">2</span>];</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">j</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">2</span>; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j<<span class="number">2</span>; j++)</span><br><span class="line"><span class="keyword">if</span> (a[i][j] != b[i][j]) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">zhuan</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> tmp = a[<span class="number">0</span>][<span class="number">0</span>];</span><br><span class="line">a[<span class="number">0</span>][<span class="number">0</span>] = a[<span class="number">1</span>][<span class="number">0</span>];</span><br><span class="line">a[<span class="number">1</span>][<span class="number">0</span>] = a[<span class="number">1</span>][<span class="number">1</span>];</span><br><span class="line">a[<span class="number">1</span>][<span class="number">1</span>] = a[<span class="number">0</span>][<span class="number">1</span>];</span><br><span class="line">a[<span class="number">0</span>][<span class="number">1</span>] = tmp;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t, cnt = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">while</span> (t--)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">2</span>; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j<<span class="number">2</span>; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &a[i][j]);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">2</span>; i++)</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j<<span class="number">2</span>; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &b[i][j]);</span><br><span class="line"></span><br><span class="line"><span class="keyword">bool</span> f = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i<<span class="number">4</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (j()) f = <span class="literal">true</span>;</span><br><span class="line">zhuan();</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (f)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: POSSIBLE\n"</span>, ++cnt);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: IMPOSSIBLE\n"</span>, ++cnt);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="C-The-Battle-of-Chibi"><a href="#C-The-Battle-of-Chibi" class="headerlink" title="C The Battle of Chibi"></a>C The Battle of Chibi</h1><p> 求长度等于m的严格上升子序列的个数。</p><p> 离散化,dp,树状数组。由于每个数字1e9,所以先离散化再dp。dp[i][j],表示以第i个数字结尾,长度为j的上升子序列个数,dp[i][j]=sum{dp[ii][j-1]} | ii<i && a[ii]<a[i],但是这样会超时,求和的过程用树状数组。</p><p> 建立m棵树状数组,第i个树状数组表示长度为i的子序列。每个树状数组维护的是子序列的最大值为k的个数。即add(kk,k,num),表示在第k棵树上的k点加num,这样就转换为dp[i][j]=check(j-1,a[i]-1).</p><blockquote><p>注意:树状数组中第i个结点不是说前i个数,而是子序列的最大值,因为离散过所以只是个数刚好一样而已</p></blockquote><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><map></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> n,m;</span><br><span class="line"><span class="keyword">int</span> a[<span class="number">1005</span>],b[<span class="number">10005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dp[<span class="number">1005</span>][<span class="number">1005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> sum[<span class="number">1005</span>][<span class="number">1005</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> kk,<span class="keyword">int</span> k, <span class="keyword">int</span> num)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">while</span> (k <= n)</span><br><span class="line">{</span><br><span class="line">sum[kk][k] += num;</span><br><span class="line">k += k&(-k);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">check</span><span class="params">(<span class="keyword">int</span> kk,<span class="keyword">int</span> k)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> s = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (k >= <span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line">s += sum[kk][k];</span><br><span class="line">k -= k&(-k);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> s;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="built_in">memset</span>(dp,<span class="number">0</span>,<span class="keyword">sizeof</span>(dp));</span><br><span class="line"><span class="built_in">memset</span>(sum,<span class="number">0</span>,<span class="keyword">sizeof</span>(sum));</span><br><span class="line"><span class="keyword">int</span> i,j,k,ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">1</span>;i<=n;i++)</span><br><span class="line">dp[i][<span class="number">1</span>]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">1</span>;i<=n;i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span>(k=<span class="number">2</span>;k<=m;k++)</span><br><span class="line">{</span><br><span class="line">dp[i][k]+=check(k<span class="number">-1</span>,a[i]<span class="number">-1</span>);</span><br><span class="line">dp[i][k]%=<span class="number">1000000007</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span>(k=<span class="number">1</span>;k<=m;k++)</span><br><span class="line">{</span><br><span class="line">add(k,a[i],dp[i][k]);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"> <span class="keyword">for</span>(i=<span class="number">1</span>;i<=n;i++)</span><br><span class="line">{</span><br><span class="line">ans+=dp[i][m];</span><br><span class="line">ans%=<span class="number">1000000007</span>;</span><br><span class="line">}</span><br><span class="line"><span class="built_in">cout</span><<ans<<<span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> t;</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&t);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=t;i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&n,&m);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j<=n;j++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&a[j]);</span><br><span class="line">b[j]=a[j];</span><br><span class="line">}</span><br><span class="line">sort(b+<span class="number">1</span>,b+n+<span class="number">1</span>);</span><br><span class="line"><span class="built_in">map</span><<span class="keyword">int</span>,<span class="keyword">int</span>> mmap;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j<=n;j++)</span><br><span class="line">mmap[b[j]]=j;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j<=n;j++)</span><br><span class="line">a[j]=mmap[a[j]];</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: "</span>,i);</span><br><span class="line">peng();</span><br><span class="line">}</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="D-Pick-The-Sticks"><a href="#D-Pick-The-Sticks" class="headerlink" title="D Pick The Sticks"></a>D Pick The Sticks</h1><p> 背包问题,但是可以有两个物品cost取值为一半。</p><p> dp,最开始想枚举两个取一半的物品编号,但是会超时。但是又想一下可以再背包问题再加一维表示有几个cost取一半,dp[i][j][k]表示前i个物品,容量为j,有k个取一半。 dp[i][j][k]=min{dp[i-1][j][k],dp[i-1][j-c[i]][k],dp[i-1][j][k-1],dp[i-1][j-c[i]/2][k-1]}</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><algorithm></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> n, l;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Stick</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> l;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> v;</span><br><span class="line">}sticks[<span class="number">1005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dp[<span class="number">4005</span>][<span class="number">3</span>];<span class="comment">//最后一个维度代表有几个机会折半</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">memset</span>(dp, <span class="number">0</span>, <span class="keyword">sizeof</span>(dp));</span><br><span class="line"><span class="comment">//考虑只放一个的情况</span></span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"><span class="keyword">if</span> (sticks[j].v > ans)</span><br><span class="line">ans = sticks[j].v;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"><span class="keyword">for</span> (j = l; j >= sticks[i].l/<span class="number">2</span>; j--)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (j - sticks[i].l>=<span class="number">0</span> && dp[j][<span class="number">0</span>] < dp[j - sticks[i].l][<span class="number">0</span>] + sticks[i].v)</span><br><span class="line">dp[j][<span class="number">0</span>] = dp[j - sticks[i].l][<span class="number">0</span>] + sticks[i].v;</span><br><span class="line"><span class="keyword">if</span> (j - sticks[i].l >= <span class="number">0</span> && dp[j][<span class="number">1</span>] < dp[j - sticks[i].l][<span class="number">1</span>] + sticks[i].v)<span class="comment">//每个分两种情况,当前(j)取一半还是不取一半</span></span><br><span class="line">dp[j][<span class="number">1</span>] = dp[j - sticks[i].l][<span class="number">1</span>] + sticks[i].v;</span><br><span class="line"><span class="keyword">if</span> (dp[j][<span class="number">1</span>] < dp[j - sticks[i].l / <span class="number">2</span>][<span class="number">0</span>] + sticks[i].v)</span><br><span class="line">dp[j][<span class="number">1</span>] = dp[j - sticks[i].l / <span class="number">2</span>][<span class="number">0</span>] + sticks[i].v;</span><br><span class="line"><span class="keyword">if</span> (j - sticks[i].l >= <span class="number">0</span> && dp[j][<span class="number">2</span>] < dp[j - sticks[i].l][<span class="number">2</span>] + sticks[i].v)</span><br><span class="line">dp[j][<span class="number">2</span>] = dp[j - sticks[i].l][<span class="number">2</span>] + sticks[i].v;</span><br><span class="line"><span class="keyword">if</span> (dp[j][<span class="number">2</span>] < dp[j - sticks[i].l / <span class="number">2</span>][<span class="number">1</span>] + sticks[i].v)</span><br><span class="line">dp[j][<span class="number">2</span>] = dp[j - sticks[i].l / <span class="number">2</span>][<span class="number">1</span>] + sticks[i].v;</span><br><span class="line">}</span><br><span class="line">ans = (ans>dp[l][<span class="number">2</span>]?ans: dp[l][<span class="number">2</span>]);</span><br><span class="line"><span class="built_in">cout</span> << ans << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t, i, j;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= t; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &n, &l);</span><br><span class="line">l*= <span class="number">2</span>;</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%I64d%I64d"</span>, &sticks[j].l, &sticks[j].v);</span><br><span class="line">sticks[j].l*= <span class="number">2</span>;</span><br><span class="line">}</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: "</span>, i);</span><br><span class="line">peng();</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="F-Battle-of-Guandu"><a href="#F-Battle-of-Guandu" class="headerlink" title="F Battle of Guandu"></a>F Battle of Guandu</h1><p> 题目比较麻烦,直接说想法。一个村庄对应曹操的战场和袁绍的战场,可以转化为一个从曹操的战场到袁绍的战场的边,边的权值为雇佣费用。重要度为2的点的人至少要多1个人,而每个重要度为2的点多1个人就会导致它指向的点也多一个人,如果这个点重要度为1或2,那么这个人就还要转移出去,如果重要度是0就不用继续转移了。所以这道题的做法就是最短路,每个村庄对应的曹操战场指向袁绍战场为一条有向边,每个重要度为2的点到距离它最近的0重要度的点的最短路长度的和。这个是一个多源最短路,是会TLT的,但是所有重要度为0的点可以捏成一个点,因为它们都是最短路的终点,所以转换为多个点到一个点的最短路。然后可以把边反向,转换成一个点到其他所有点的单源最短路的长度的和。所以其实就是一个单元最短路,但是感觉还是不太好看出来的。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><queue></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><vector></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INF 2100000000000000000ll</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> n, m, x[<span class="number">100005</span>], y[<span class="number">100005</span>], c[<span class="number">100005</span>], w[<span class="number">100005</span>];</span><br><span class="line"><span class="keyword">bool</span> vis[<span class="number">100005</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dis[<span class="number">100005</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>, <span class="keyword">int</span>> edge;</span><br><span class="line"><span class="keyword">typedef</span> pair<<span class="keyword">int</span>, <span class="keyword">long</span> <span class="keyword">long</span>> node;</span><br><span class="line"><span class="built_in">vector</span><edge> adjList[<span class="number">100005</span>];</span><br><span class="line"><span class="keyword">bool</span> <span class="keyword">operator</span><(node n1, node n2)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">return</span> n1.second < n2.second;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line">priority_queue<node> q;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i <= <span class="number">100004</span>; i++)</span><br><span class="line">{</span><br><span class="line">adjList[i].clear();</span><br><span class="line">dis[i] = INF;</span><br><span class="line">vis[i] = <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (w[y[i]] == <span class="number">0</span>)</span><br><span class="line">adjList[<span class="number">0</span>].push_back(edge(x[i], c[i]));<span class="comment">//把所有为0的点归到一起</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (w[x[i]] == <span class="number">0</span>)</span><br><span class="line">adjList[y[i]].push_back(edge(<span class="number">0</span>, c[i]));</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">adjList[y[i]].push_back(edge(x[i], c[i]));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">q.push(node(<span class="number">0</span> ,<span class="number">0</span>));</span><br><span class="line">dis[<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (!q.empty())</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> curr = (q.top()).first;</span><br><span class="line">q.pop();</span><br><span class="line">vis[curr] = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">vector</span><edge>::iterator it = adjList[curr].begin(); it != adjList[curr].end(); it++)</span><br><span class="line"><span class="keyword">if</span> (dis[curr] + it->second < dis[it->first])</span><br><span class="line">{</span><br><span class="line">dis[it->first] = dis[curr] + it->second;</span><br><span class="line">q.push({ it->first,dis[it->first] });</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= m; i++)</span><br><span class="line"><span class="keyword">if</span> (w[i] == <span class="number">2</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (vis[i] == <span class="literal">false</span>)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">cout</span> << <span class="number">-1</span> << <span class="built_in">endl</span>;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">ans += dis[i];</span><br><span class="line">}</span><br><span class="line"><span class="built_in">cout</span> << ans << <span class="built_in">endl</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, j, t;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= t; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &n, &m);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &x[j]);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &y[j]);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &c[j]);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= m; j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &w[j]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: "</span>, i);</span><br><span class="line">peng();</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="G-Ancient-Go"><a href="#G-Ancient-Go" class="headerlink" title="G Ancient Go"></a>G Ancient Go</h1><p> 枚举即可,看下在每一个地方之后上下左右四个方向能不能吃掉子。</p><h1 id="H-Sudoku"><a href="#H-Sudoku" class="headerlink" title="H Sudoku"></a>H Sudoku</h1><p> 水题,把一个4*4的数独填完整,数据量很小,怎么搞都能过,枚举比较好写但我写的比较麻烦。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> mart[<span class="number">4</span>][<span class="number">4</span>],ans[<span class="number">4</span>][<span class="number">4</span>];</span><br><span class="line"><span class="keyword">int</span> tt;</span><br><span class="line"><span class="keyword">int</span> getans;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">peng</span><span class="params">(<span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> x = n / <span class="number">4</span>, y = n % <span class="number">4</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (n == <span class="number">16</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">16</span>; i++)</span><br><span class="line">*(ans[<span class="number">0</span>] + i) = *(mart[<span class="number">0</span>] + i);</span><br><span class="line">getans = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (mart[x][y] != <span class="number">0</span>)</span><br><span class="line">peng(n + <span class="number">1</span>);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= <span class="number">4</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> flag = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < <span class="number">4</span>; j++)</span><br><span class="line"><span class="keyword">if</span> (mart[x][j] == i || mart[j][y] == i)</span><br><span class="line">{</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (x < <span class="number">2</span> && y < <span class="number">2</span> && (mart[<span class="number">0</span>][<span class="number">0</span>] == i || mart[<span class="number">1</span>][<span class="number">0</span>] == i || mart[<span class="number">0</span>][<span class="number">1</span>] == i || mart[<span class="number">1</span>][<span class="number">1</span>] == i))</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (x < <span class="number">2</span> && y >= <span class="number">2</span> && (mart[<span class="number">0</span>][<span class="number">2</span>] == i || mart[<span class="number">1</span>][<span class="number">2</span>] == i || mart[<span class="number">0</span>][<span class="number">3</span>] == i || mart[<span class="number">1</span>][<span class="number">3</span>] == i))</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (x >= <span class="number">2</span> && y < <span class="number">2</span> && (mart[<span class="number">2</span>][<span class="number">0</span>] == i || mart[<span class="number">3</span>][<span class="number">0</span>] == i || mart[<span class="number">2</span>][<span class="number">1</span>] == i || mart[<span class="number">3</span>][<span class="number">1</span>] == i))</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (x >= <span class="number">2</span> && y >= <span class="number">2</span> && (mart[<span class="number">2</span>][<span class="number">2</span>] == i || mart[<span class="number">2</span>][<span class="number">3</span>] == i || mart[<span class="number">3</span>][<span class="number">2</span>] == i || mart[<span class="number">3</span>][<span class="number">3</span>] == i))</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (flag == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">mart[x][y] = i;</span><br><span class="line"><span class="keyword">if</span> (getans == <span class="number">0</span>)</span><br><span class="line">peng(n + <span class="number">1</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">mart[x][y] = <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t, i, j;</span><br><span class="line"><span class="keyword">char</span> s[<span class="number">5</span>];</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span> (tt = <span class="number">1</span>; tt <= t;tt++)</span><br><span class="line">{</span><br><span class="line">getans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i < <span class="number">4</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, s);</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j < <span class="number">4</span>; j++)</span><br><span class="line"><span class="keyword">if</span> (s[j] == <span class="string">'*'</span>)</span><br><span class="line">mart[i][j] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">mart[i][j] = s[j] - <span class="string">'0'</span>;</span><br><span class="line">}</span><br><span class="line">peng(<span class="number">0</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d:\n"</span>, tt);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">4</span>; i++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < <span class="number">4</span>; j++)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d"</span>, ans[i][j]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="L-Huatuo’s-Medicine"><a href="#L-Huatuo’s-Medicine" class="headerlink" title="L Huatuo’s Medicine"></a>L Huatuo’s Medicine</h1><p> 水题,只有1种药的时候只需要1个瓶子,再每多1种就多两个瓶子。ans=x*2-1.</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t, x,i;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= t;i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &x);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case #%d: %d\n"</span>, i,x * <span class="number">2</span> - <span class="number">1</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p> 2015 CCPC的部分题目题解和代码。题目在 hdu 5540~5551</p>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="Contests" scheme="http://wmpeng.github.io/categories/Alogrithm/Contests/"/>
<category term="水题" scheme="http://wmpeng.github.io/tags/%E6%B0%B4%E9%A2%98/"/>
<category term="模拟" scheme="http://wmpeng.github.io/tags/%E6%A8%A1%E6%8B%9F/"/>
<category term="枚举" scheme="http://wmpeng.github.io/tags/%E6%9E%9A%E4%B8%BE/"/>
<category term="DP" scheme="http://wmpeng.github.io/tags/DP/"/>
<category term="树状数组" scheme="http://wmpeng.github.io/tags/%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84/"/>
<category term="离散化" scheme="http://wmpeng.github.io/tags/%E7%A6%BB%E6%95%A3%E5%8C%96/"/>
<category term="背包" scheme="http://wmpeng.github.io/tags/%E8%83%8C%E5%8C%85/"/>
<category term="最短路" scheme="http://wmpeng.github.io/tags/%E6%9C%80%E7%9F%AD%E8%B7%AF/"/>
</entry>
<entry>
<title>UVa 1103 Ancient Messages</title>
<link href="http://wmpeng.github.io/2016/09/28/%E7%AE%97%E6%B3%95/OnlieJudge/uva/UVa%201103%20Ancient%20Messages/"/>
<id>http://wmpeng.github.io/2016/09/28/算法/OnlieJudge/uva/UVa 1103 Ancient Messages/</id>
<published>2016-09-28T15:26:23.000Z</published>
<updated>2017-08-05T11:13:28.936Z</updated>
<content type="html"><![CDATA[<p> 几个不同的块内部有不同数量的空白,据此,DFS求每个黑色图形内的连通块个数就行。先处理外部的白块。然后扫描,遇到没遍历过的黑块dfs,遇到没遍历过的白块就计数再dfs。<br><a id="more"></a><br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">*Abbott's Revenge, ACM/ICPC World Finals 2011,UVa 1103</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> comment(linker, <span class="meta-string">"/STACK:32000000"</span>)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><string.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iomanip></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> expend_(c1,c2) <span class="meta-keyword">if</span> (map[x +c1][y+c2] == 0 && x+c1<span class="meta-string"><=h && x+c1>=1 && y+c2<=w && y+c2>=1) expend(x+c1, y+c2, val);</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> expendBlack_(c1,c2) <span class="meta-keyword">if</span> (map[x +c1][y+c2] == -1 && x+c1<span class="meta-string"><=h && x+c1>=1 && y+c2<=w && y+c2>=1) cnt+=expendBlack(x+c1, y+c2);</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> expendWhite_(c1,c2) <span class="meta-keyword">if</span> (map[x +c1][y+c2] == 0 && x+c1<span class="meta-string"><=h && x+c1>=1 && y+c2<=w && y+c2>=1) {cnt++;/*cout<<"["<<x+c1<<" "<<y+c2<<"]";*/expend(x+c1, y+c2, 2);/*prtmap();*/}</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> prtans(a,b) for (i = 1; i <= cunt[a]; i++) printf(<span class="meta-string">"%c"</span>,b);</span></span><br><span class="line"><span class="comment">/*0表示初始的白色 -1表示初始的黑色 -2表示不属于任何符号的白色 1表示遍历过的黑色 2表示遍历过的白色*/</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> h, w, w0;</span><br><span class="line"><span class="keyword">char</span> cmap[<span class="number">210</span>][<span class="number">60</span>];</span><br><span class="line"><span class="keyword">int</span> <span class="built_in">map</span>[<span class="number">210</span>][<span class="number">210</span>];</span><br><span class="line"><span class="keyword">int</span> charval[<span class="number">128</span>];</span><br><span class="line"><span class="keyword">int</span> cunt[<span class="number">10</span>] = { <span class="number">0</span> };</span><br><span class="line">FILE *out;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">change</span><span class="params">(<span class="keyword">int</span> *p, <span class="keyword">char</span> c)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">p[<span class="number">0</span>] = -charval[c] / <span class="number">8</span>;</span><br><span class="line">p[<span class="number">1</span>] = -(charval[c] / <span class="number">4</span>) % <span class="number">2</span>;</span><br><span class="line">p[<span class="number">2</span>] = -(charval[c] / <span class="number">2</span>) % <span class="number">2</span>;</span><br><span class="line">p[<span class="number">3</span>] = -charval[c]% <span class="number">2</span>;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">expend</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y, <span class="keyword">int</span> val)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="built_in">map</span>[x][y] = val;</span><br><span class="line">expend_(<span class="number">1</span>, <span class="number">0</span>);</span><br><span class="line">expend_(<span class="number">-1</span>, <span class="number">0</span>);</span><br><span class="line">expend_(<span class="number">0</span>, <span class="number">-1</span>);</span><br><span class="line">expend_(<span class="number">0</span>, <span class="number">1</span>);</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">prtmap</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="comment">//cout << endl;</span></span><br><span class="line"><span class="comment">//int i, j;</span></span><br><span class="line"><span class="comment">//for (i = 1; i <= h; i++)</span></span><br><span class="line"><span class="comment">//{</span></span><br><span class="line"><span class="comment">//for (j = 1; j <= w; j++)</span></span><br><span class="line"><span class="comment">////cout << setw(2) << map[i][j];</span></span><br><span class="line"><span class="comment">//if (map[i][j] == -1)</span></span><br><span class="line"><span class="comment">//cout << "*";</span></span><br><span class="line"><span class="comment">//else if (map[i][j] == -2)</span></span><br><span class="line"><span class="comment">//cout << "-";</span></span><br><span class="line"><span class="comment">//else</span></span><br><span class="line"><span class="comment">//cout << ".";</span></span><br><span class="line"><span class="comment">//cout << endl;</span></span><br><span class="line"><span class="comment">//}</span></span><br><span class="line"><span class="comment">//cout << endl << endl;</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">expendBlack</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> cnt=<span class="number">0</span>;</span><br><span class="line"><span class="built_in">map</span>[x][y] = <span class="number">1</span>;</span><br><span class="line">expendWhite_(<span class="number">0</span>, <span class="number">1</span>);</span><br><span class="line">expendWhite_(<span class="number">0</span>, <span class="number">-1</span>);</span><br><span class="line">expendWhite_(<span class="number">1</span>, <span class="number">0</span>);</span><br><span class="line">expendWhite_(<span class="number">-1</span>, <span class="number">0</span>);</span><br><span class="line">expendBlack_(<span class="number">0</span>, <span class="number">1</span>);</span><br><span class="line">expendBlack_(<span class="number">0</span>, <span class="number">-1</span>);</span><br><span class="line">expendBlack_(<span class="number">1</span>, <span class="number">0</span>);</span><br><span class="line">expendBlack_(<span class="number">-1</span>, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> cnt;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">major</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, j;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= h; i++)</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= w0; j++)</span><br><span class="line">change(&<span class="built_in">map</span>[i][j * <span class="number">4</span> - <span class="number">3</span>], cmap[i][j]);</span><br><span class="line"><span class="comment">//prtmap();</span></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= h;i++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">map</span>[i][<span class="number">1</span>] == <span class="number">0</span>)</span><br><span class="line">expend(i, <span class="number">1</span>, <span class="number">-2</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= h; i++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">map</span>[i][w] == <span class="number">0</span>)</span><br><span class="line">expend(i, w, <span class="number">-2</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= w; i++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">map</span>[<span class="number">1</span>][i] == <span class="number">0</span>)</span><br><span class="line">expend(<span class="number">1</span>, i, <span class="number">-2</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= w; i++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">map</span>[h][i] == <span class="number">0</span>)</span><br><span class="line">expend(h, i, <span class="number">-2</span>);</span><br><span class="line"><span class="comment">//prtmap();</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= h; i++)</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">1</span>; j <= w; j++)</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">map</span>[i][j] == <span class="number">-1</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> cnt = expendBlack(i, j);</span><br><span class="line">cunt[cnt]++;</span><br><span class="line"><span class="comment">//prtmap();</span></span><br><span class="line">}</span><br><span class="line">prtans(<span class="number">1</span>, <span class="string">'A'</span>);</span><br><span class="line">prtans(<span class="number">5</span>, <span class="string">'D'</span>);</span><br><span class="line">prtans(<span class="number">3</span>, <span class="string">'J'</span>);</span><br><span class="line">prtans(<span class="number">2</span>, <span class="string">'K'</span>);</span><br><span class="line">prtans(<span class="number">4</span>, <span class="string">'S'</span>);</span><br><span class="line">prtans(<span class="number">0</span>, <span class="string">'W'</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ini1</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="string">'0'</span>; i <= <span class="string">'9'</span>; i++)</span><br><span class="line">charval[i] = i - <span class="string">'0'</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="string">'a'</span>; i <= <span class="string">'f'</span>; i++)</span><br><span class="line">charval[i] = i - <span class="string">'a'</span> + <span class="number">10</span>;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ini</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="built_in">memset</span>(cunt, <span class="number">0</span>, <span class="keyword">sizeof</span>(cunt));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">out = fopen(<span class="string">"d:/2.txt"</span>, <span class="string">"w"</span>);</span><br><span class="line"><span class="keyword">int</span> i,t=<span class="number">0</span>;</span><br><span class="line">ini1();</span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line">t++;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &h, &w0);</span><br><span class="line"><span class="keyword">if</span> (h == <span class="number">0</span> && w0 == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">w = w0 * <span class="number">4</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= h; i++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, &cmap[i][<span class="number">1</span>]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"Case %d: "</span>,t);</span><br><span class="line">ini();</span><br><span class="line">major();</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 几个不同的块内部有不同数量的空白,据此,DFS求每个黑色图形内的连通块个数就行。先处理外部的白块。然后扫描,遇到没遍历过的黑块dfs,遇到没遍历过的白块就计数再dfs。<br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="OnlieJudge" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/"/>
<category term="UVa" scheme="http://wmpeng.github.io/categories/Alogrithm/OnlieJudge/UVa/"/>
<category term="dfs" scheme="http://wmpeng.github.io/tags/dfs/"/>
<category term="连通块" scheme="http://wmpeng.github.io/tags/%E8%BF%9E%E9%80%9A%E5%9D%97/"/>
</entry>
<entry>
<title>2016 Multi-University Training Contest 10 Problem 1001 Median</title>
<link href="http://wmpeng.github.io/2016/08/23/%E7%AE%97%E6%B3%95/Training/Multi-University%20Training/2016%20Multi-University%20Training%20Contest%2010%20Problem%201001%20Median/"/>
<id>http://wmpeng.github.io/2016/08/23/算法/Training/Multi-University Training/2016 Multi-University Training Contest 10 Problem 1001 Median/</id>
<published>2016-08-23T15:02:22.000Z</published>
<updated>2016-11-29T14:15:22.192Z</updated>
<content type="html"><![CDATA[<p> 水题,直接分情况讨论就ok,复杂度o(1).不过一开始没想清楚,导致写的比较麻烦。/(ㄒoㄒ)/~~<br><a id="more"></a><br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> n, m;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> a[<span class="number">100005</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">mid</span><span class="params">(<span class="keyword">int</span> l,<span class="keyword">int</span> r)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">if</span> ((r - l) % <span class="number">2</span> == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">double</span>(a[(r + l) / <span class="number">2</span>]);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> (a[(r + l) / <span class="number">2</span>] + a[(r + l) / <span class="number">2</span> + <span class="number">1</span>]) / <span class="number">2.0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">mid21</span><span class="params">(<span class="keyword">int</span> l, <span class="keyword">int</span> r2, <span class="keyword">int</span> r1)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> num = (r2 - l + <span class="number">1</span>) * <span class="number">2</span> + r1 - r2;</span><br><span class="line"><span class="keyword">if</span> (num % <span class="number">2</span> == <span class="number">1</span>)<span class="comment">//奇数个</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> mi = num / <span class="number">2</span> + <span class="number">1</span>;<span class="comment">//第mi个</span></span><br><span class="line"><span class="keyword">if</span> ((r2 - l + <span class="number">1</span>) * <span class="number">2</span> >= mi)<span class="comment">//没有超出两个的范围</span></span><br><span class="line"><span class="keyword">return</span> <span class="keyword">double</span>(a[l + (mi - <span class="number">1</span>) / <span class="number">2</span>]);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> left = mi - (r2 - l + <span class="number">1</span>) * <span class="number">2</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">double</span>(a[r2 + left]);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> m1 = num / <span class="number">2</span>, m2 = num / <span class="number">2</span> + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> ((r2 - l + <span class="number">1</span>) * <span class="number">2</span> >= m2)<span class="comment">//都没有超出范围</span></span><br><span class="line"><span class="keyword">return</span> (a[l + (m1 - <span class="number">1</span>) / <span class="number">2</span>] + a[l + (m2 - <span class="number">1</span>) / <span class="number">2</span>]) / <span class="number">2.0</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> ((r2 - l + <span class="number">1</span>) * <span class="number">2</span> < m2 && (r2 - l + <span class="number">1</span>) * <span class="number">2</span> == m1)</span><br><span class="line"><span class="keyword">return</span> (a[r2] + a[r2 + <span class="number">1</span>]) / <span class="number">2.0</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> left1 = m1 - (r2 - l + <span class="number">1</span>) * <span class="number">2</span>,left2= m2 - (r2 - l + <span class="number">1</span>) * <span class="number">2</span>;</span><br><span class="line"><span class="keyword">return</span> (a[r2 + left1]+a[r2+left2])/<span class="number">2.0</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">mid12</span><span class="params">(<span class="keyword">int</span> l1, <span class="keyword">int</span> l2, <span class="keyword">int</span> r)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> num = (r - l2 + <span class="number">1</span>) * <span class="number">2</span> + l2 - l1;</span><br><span class="line"><span class="keyword">if</span> (num % <span class="number">2</span> == <span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> mi = num / <span class="number">2</span> + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (mi > l2 - l1)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> left = mi - (l2 - l1);</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">double</span>(a[l2 + (left - <span class="number">1</span>) / <span class="number">2</span>]);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> <span class="keyword">double</span>(a[l1 - <span class="number">1</span> + mi]);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> m1 = num / <span class="number">2</span>, m2 = num / <span class="number">2</span> + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (m1 > l2 - l1)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">int</span> left1 = m1 - (l2 - l1), left2 = m2 - (l2 - l1);</span><br><span class="line"><span class="keyword">return</span> (a[l2 + (left1 - <span class="number">1</span>) / <span class="number">2</span>]+ a[l2 + (left2 - <span class="number">1</span>) / <span class="number">2</span>])/<span class="number">2.0</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (m2 <= l2 - l1)</span><br><span class="line"><span class="keyword">return</span> (a[l1 - <span class="number">1</span> + m1] + a[l1 - <span class="number">1</span> + m2]) / <span class="number">2.0</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> (a[l2 - <span class="number">1</span>] + a[l2]) / <span class="number">2.0</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">major</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> i, j,l1,l2,r1,r2;</span><br><span class="line"><span class="built_in">scanf</span>( <span class="string">"%d%d"</span>, &n, &m);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld"</span>, &a[i]);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">1</span>; i <= m; i++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d%d%d"</span>, &l1, &r1, &l2, &r2);</span><br><span class="line"><span class="keyword">if</span> (l1 > l2)</span><br><span class="line">{</span><br><span class="line">l2 ^= l1 ^= l2 ^= l1;</span><br><span class="line">r2 ^= r1 ^= r2 ^= r1;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (r1 < l2)<span class="comment">//没有重叠</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (r1 - l1 == r2 - l2)<span class="comment">//</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, (a[r1] + a[l2]) / <span class="number">2.0</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (r1 - l1 < r2 - l2)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, mid(l2, r2 - (r1 - l1 + <span class="number">1</span>)));</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, mid(l1 + (r2 - l2 + <span class="number">1</span>), r1));</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(r2>r1)<span class="comment">//有公共部分</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (l2 - l1 == r2 - r1)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, mid(l2, r1));</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (l2 - l1 < r2 - r1)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, mid21(l2, r1, r2 - (l2 - l1)));</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, mid12(l1 + (r2 - r1), l2, r1));</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (r1 - r2 == l2 - l1)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, mid(l2, r2));</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (r1 - r2 < l2 - l1)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, mid12(l1 + (r1 - r2), l2, r2));</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.1f\n"</span>, mid21(l2, r2, r1 - (l2 - l1)));</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">int</span> t;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &t);</span><br><span class="line"><span class="keyword">while</span> (t--)</span><br><span class="line">{</span><br><span class="line">major();</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 水题,直接分情况讨论就ok,复杂度o(1).不过一开始没想清楚,导致写的比较麻烦。/(ㄒoㄒ)/~~<br>
</summary>
<category term="Alogrithm" scheme="http://wmpeng.github.io/categories/Alogrithm/"/>
<category term="Contests" scheme="http://wmpeng.github.io/categories/Alogrithm/Contests/"/>
<category term="水题" scheme="http://wmpeng.github.io/tags/%E6%B0%B4%E9%A2%98/"/>
</entry>
<entry>
<title>怎么让onedrive同步本地文件夹而不改变位置</title>
<link href="http://wmpeng.github.io/2016/07/05/%E6%80%8E%E4%B9%88%E8%AE%A9onedrive%E5%90%8C%E6%AD%A5%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E5%A4%B9%E8%80%8C%E4%B8%8D%E6%94%B9%E5%8F%98%E4%BD%8D%E7%BD%AE/"/>
<id>http://wmpeng.github.io/2016/07/05/怎么让onedrive同步本地文件夹而不改变位置/</id>
<published>2016-07-05T01:23:12.000Z</published>
<updated>2016-08-19T07:37:10.594Z</updated>
<content type="html"><![CDATA[<p> OneDrive总体上来说还是挺好用的,但是长期以来困扰我的一个问题就是它只能同步位于特定文件夹(通常为C:\Users\用户名\OneDrive)下的内容,这让人很头疼。这里分享一个办法让OneDrive同步其他文件夹而不改变位置。<br><a id="more"></a><br> 其实方法很简单,就是使用mklink命令。<br> 命令行下输入:mklink /d C:\Users\XXX\OneDrive\目标文件夹名 D:\要同步的文件夹路径<br>或者使用mklink /j<br> 有可能需要管理员权限。经过尝试在实际使用的过程中/d和/j并没有什么差别。</p><blockquote><p>/d /j的区别<br> 关于/d和/j的区别,从网上搜索了一阵,找到了这样的结果:<br>/d 创建的是符号链接(Symlink,Softlink),是对文件或目录的引用,实际上符号链接本身是一个“记录着所引用文件或目录的绝对或相对路径”的特殊文件,通过符号链接的操作都会被重定向到目标文件或目录。<br>/j 创建的是交接点(Junction),也称为“再分析点”,是 NTFS 3.0 及以上文件系统(Windows 2000 及以上系统)的特性,它是链接本地目录(可跨卷)的访问点,通过交接点的操作都会被系统映射到实际的目录上。通过建立交接点,可以在保证一个目录实例(目录的一致性)的前提下,允许用户或程序从本地文件系统中的多个位置访问此目录。</p></blockquote>]]></content>
<summary type="html">
<p> OneDrive总体上来说还是挺好用的,但是长期以来困扰我的一个问题就是它只能同步位于特定文件夹(通常为C:\Users\用户名\OneDrive)下的内容,这让人很头疼。这里分享一个办法让OneDrive同步其他文件夹而不改变位置。<br>
</summary>
<category term="科技改变生活" scheme="http://wmpeng.github.io/categories/%E7%A7%91%E6%8A%80%E6%94%B9%E5%8F%98%E7%94%9F%E6%B4%BB/"/>
<category term="OneDrive" scheme="http://wmpeng.github.io/tags/OneDrive/"/>
<category term="mklink" scheme="http://wmpeng.github.io/tags/mklink/"/>
</entry>
<entry>
<title>利用shadowsocks+ipv6科学使用校园网</title>
<link href="http://wmpeng.github.io/2016/06/28/%E5%88%A9%E7%94%A8shadowsocks-ipv6%E7%A7%91%E5%AD%A6%E4%BD%BF%E7%94%A8%E6%A0%A1%E5%9B%AD%E7%BD%91/"/>
<id>http://wmpeng.github.io/2016/06/28/利用shadowsocks-ipv6科学使用校园网/</id>
<published>2016-06-28T13:49:26.000Z</published>
<updated>2018-01-16T11:24:37.717Z</updated>
<content type="html"><![CDATA[<p> 使用过一段时间的校园网之后,我决定想办法突破校园网流量和价格的限制,免费自由上网。既然学校路由给分配了ipv6地址,并且也可以访问一些网站(如<a href="http://bt.byr.cn/" target="_blank" rel="noopener">北邮人</a>之类的网站),也就是说网关只对ipv4流量进行限制,那么是不是可以使用在校外的VPS将ipv4流量转换成ipv6流量,进而实现校内用ipv6连接外网呢?经过一番查找,终于了解了如何实现这个功能。<br><a id="more"></a><br> 其实网上这样的文章还不少,但是很少有针对校园网的,并且大多都说的比较高深并且简略,这里我就详细来说一下具体如何操作。<br> 需要的部分软件在我的<a href="http://pan.baidu.com/s/1c27bLLm" target="_blank" rel="noopener">网盘</a>里,提取码: ijs0</p><h1 id="使用条件"><a href="#使用条件" class="headerlink" title="使用条件"></a>使用条件</h1><p> 这个方法能用的前提条件是你学校给网络可以使用ipv6,验证方法是在连接校园网并且不登录内网网关的情况下可以打开<a href="http://bt.byr.cn/" target="_blank" rel="noopener">北邮人</a> <a href="http://bt.byr.cn/" target="_blank" rel="noopener">http://bt.byr.cn/</a> .如果可以正常访问就可以使用下面的方法实现校园网环境下免费上网。</p><h1 id="租用VPS"><a href="#租用VPS" class="headerlink" title="租用VPS"></a>租用VPS</h1><p> 以前用过VPS的话就直接略过这段就好了。<br> vps的话直接上网搜就有很多,但是要注意不要选择国内的服务商,因为国内都不提供ipv6.这里我推荐几个比价实惠的:</p><blockquote><p>第一个是 HostUS,官网: <a href="https://hostus.us" target="_blank" rel="noopener">https://hostus.us</a><br>比较便宜并且网速也比较好,<a href="https://hostus.us/openvz-vps.html" target="_blank" rel="noopener">https://hostus.us/openvz-vps.html</a> 直接点进去选择最低的配置就够用,同样建议选择洛杉矶机房,$5.65/季度,支持支付宝.并且这个网站<a href="http://www.hostus.cn" target="_blank" rel="noopener">http://www.hostus.cn</a> 经常有便宜的购买链接,但是优惠码不多。<br><img src="./vps.png" alt="vps"></p><p>第二个是 Host1Plus,官网: <a href="http://www.host1plus.com" target="_blank" rel="noopener">http://www.host1plus.com</a><br>可以月付,也很便宜,如果你只想先尝试一个月推荐用这个,最便宜的$2/月,支持支付宝。<a href="http://www.host1plus.com/vps-hosting" target="_blank" rel="noopener">http://www.host1plus.com/vps-hosting</a> 选择最低配就好,同样建议选择洛杉矶机房。另外除了最低配都可以使用优惠码,网上一搜一大堆。</p><p>第三个是 Digital Ocan,官网: <a href="https://www.digitalocean.com" target="_blank" rel="noopener">https://www.digitalocean.com</a><br>三个当中最稳定的,但是价格稍贵,最低$5/月,还是不便宜的,但是新用户注册激活后有$10奖励,而且成功申请到{Github Student pack]<a href="https://education.github.com/pack" target="_blank" rel="noopener">2</a>的话,还可以得到$100。付款方式只有PayPAl和信用卡。</p></blockquote><p> 购买之后,安装镜像,选择ubuntu即可。记住让你输入的或者提供的密码。<br><img src="./os.png" alt="os"></p><h1 id="在VPS上安装启动shadowsocks"><a href="#在VPS上安装启动shadowsocks" class="headerlink" title="在VPS上安装启动shadowsocks"></a>在VPS上安装启动shadowsocks</h1><h2 id="连接到服务器"><a href="#连接到服务器" class="headerlink" title="连接到服务器"></a>连接到服务器</h2><p> 自行百度putty进行下载,并且在host name的地方输入你服务器的ip地址,然后点击open。Login as:后面输入root,然后输入密码,只管输入就行,它并不会显示出来。<br><img src="./putty.png" alt="putty"><br> 使用HostUS需要自己配置ipv6,host1plus和digitalocean不用<br> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ifconfig eth 0 inet6 add IPV6ADDR (IPV6ADDR为提供的服务器的IPV6地址)</span><br></pre></td></tr></table></figure></p><h2 id="安装启动shadowsocks"><a href="#安装启动shadowsocks" class="headerlink" title="安装启动shadowsocks"></a>安装启动shadowsocks</h2><p> 依次输入下列命令:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">apt-get update</span><br><span class="line">apt-get install python-pip</span><br><span class="line">pip install shadowsocks</span><br><span class="line">vi /etc/shadowsocks.json</span><br></pre></td></tr></table></figure></p><p> 这时应该就是在编辑文件,将下面的文字输入(先按一下ins键)<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line"> "server":"::",</span><br><span class="line"> "server_port":8388,</span><br><span class="line"> "local_address": "127.0.0.1",</span><br><span class="line"> "local_port":1080,</span><br><span class="line"> "password":"你设置的密码",</span><br><span class="line"> "timeout":300,</span><br><span class="line"> "method":"aes-256-cfb",</span><br><span class="line"> "fast_open": false</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p> 编辑完之后按 Esc,并且输入 :wq (包括冒号,即保存并退出)。<br> 然后使用下面这个指令启动服务<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssserver -c /etc/shadowsocks.json -d start</span><br></pre></td></tr></table></figure></p><h1 id="安装shadowsocks客户端"><a href="#安装shadowsocks客户端" class="headerlink" title="安装shadowsocks客户端"></a>安装shadowsocks客户端</h1><p> shadowsocks的客户端支持<a href="https://github.com/shadowsocks/shadowsocks/wiki/Ports-and-Clients" target="_blank" rel="noopener">OS X/Windows/Android/iOS</a>等(iOS使用完整功能需要越狱)。<br> 客户端配置一般都很简单,只要配置一下ip地址和之前设置好的密码(加密方式选择 aes-256-cfb)即可。</p><blockquote><p>本博文仅供技术交流,请勿用于其他途径,从事违法违规活动与博主无关</p></blockquote>]]></content>
<summary type="html">
<p> 使用过一段时间的校园网之后,我决定想办法突破校园网流量和价格的限制,免费自由上网。既然学校路由给分配了ipv6地址,并且也可以访问一些网站(如<a href="http://bt.byr.cn/" target="_blank" rel="noopener">北邮人</a>之类的网站),也就是说网关只对ipv4流量进行限制,那么是不是可以使用在校外的VPS将ipv4流量转换成ipv6流量,进而实现校内用ipv6连接外网呢?经过一番查找,终于了解了如何实现这个功能。<br>
</summary>
<category term="科技改变生活" scheme="http://wmpeng.github.io/categories/%E7%A7%91%E6%8A%80%E6%94%B9%E5%8F%98%E7%94%9F%E6%B4%BB/"/>
<category term="shadowsocks" scheme="http://wmpeng.github.io/tags/shadowsocks/"/>
<category term="ipv6" scheme="http://wmpeng.github.io/tags/ipv6/"/>
<category term="免费" scheme="http://wmpeng.github.io/tags/%E5%85%8D%E8%B4%B9/"/>
<category term="校园网" scheme="http://wmpeng.github.io/tags/%E6%A0%A1%E5%9B%AD%E7%BD%91/"/>
<category term="教育网" scheme="http://wmpeng.github.io/tags/%E6%95%99%E8%82%B2%E7%BD%91/"/>
</entry>
</feed>