-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
572 lines (299 loc) · 453 KB
/
atom.xml
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
566
567
568
569
570
571
572
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>序炁的博客</title>
<link href="https://www.ordchaos.com/atom.xml" rel="self"/>
<link href="https://www.ordchaos.com/"/>
<updated>2024-08-30T19:08:49.000Z</updated>
<id>https://www.ordchaos.com/</id>
<author>
<name>序炁</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>别样(咬牙切齿)的16岁生日</title>
<link href="https://www.ordchaos.com/posts/cc4d8334/"/>
<id>https://www.ordchaos.com/posts/cc4d8334/</id>
<published>2024-08-30T19:08:49.000Z</published>
<updated>2024-08-30T19:08:49.000Z</updated>
<content type="html"><![CDATA[<p>无语住了。</p><span id="more"></span><p>前几天都一直好好的,结果23号一整天头都在疼,晚上测体温测得37.8℃,但是以前也有吹空调吹到这个温度结果去医院啥事没有的情况,所以没有在意。</p><p>24号,生日当天起床开始难受,哪哪都难受,包括但不限于头昏、头痛、身上起水泡。</p><p>但原本定下来要去外公外婆家里过生日的,所以还是先去了。</p><p><img src="https://img.ordchaos.com/img/2024/08/effb65e61222e94c00259795d7cce521.jpeg" alt="蛋糕还是好吃的" /></p><p>下午去了医院,你猜怎么着,得水痘了哈哈(</p><p>立马住院,家都没有回(悲)</p><p>分到了77床,感觉不是很吉利<span class="heimu" title="你知道的太多了">数字命理学还在发力!!!还在发力!!!</span></p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2024/08/a9ac3001844f10ca8fb2ed9bdf8651c6.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2024/08/e196dab23b0adfbaad264689661378c0.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2024/08/e4567ba19b2474e3bf7cbbfb34a7fc50.jpg" alt="" /></div></div></div><p>每日生活都是吃饭、吊水、照光、湿敷。</p><p>今天出院啦(喜)</p><p>但是要在家隔离七天才可以去学校(</p><p>有点无语了。</p>]]></content>
<summary type="html"><p>无语住了。</p></summary>
<category term="个人" scheme="https://www.ordchaos.com/categories/%E4%B8%AA%E4%BA%BA/"/>
<category term="个人" scheme="https://www.ordchaos.com/tags/%E4%B8%AA%E4%BA%BA/"/>
<category term="日常" scheme="https://www.ordchaos.com/tags/%E6%97%A5%E5%B8%B8/"/>
<category term="生日" scheme="https://www.ordchaos.com/tags/%E7%94%9F%E6%97%A5/"/>
</entry>
<entry>
<title>无服务器AI摘要后端——OrdChaosGPT</title>
<link href="https://www.ordchaos.com/posts/fd9dafa1/"/>
<id>https://www.ordchaos.com/posts/fd9dafa1/</id>
<published>2024-08-14T17:08:50.000Z</published>
<updated>2024-08-14T17:08:50.000Z</updated>
<content type="html"><![CDATA[<p>时隔一年,终于抽出来时间完全重写了AI摘要的后端。</p><span id="more"></span><h2 id="起因"><a class="markdownIt-Anchor" href="#起因"></a> 起因</h2><p>TianliGPT的文章摘要很好用,但是本来会能够根据content保证摘要不重复生成,现在不行了,不知道为什么。(我知道现在改为用url鉴别了,但是我的js最开始我就自己改过了,没有更新)</p><p>于是每刷新一次摘要就重新生成一次,token余额哗哗掉。</p><p>想着与其重新改一遍js,不如全权改为自己的版本,于是就有了这个项目。</p><p>现在本文(以及其它文章)开头的摘要就是来自OrdChaosGPT的了。</p><h2 id="介绍"><a class="markdownIt-Anchor" href="#介绍"></a> 介绍</h2><p>大概是TianliGPT的下位代替品</p><p>使用阿里云通义千问(qwen-long)作为摘要生成引擎,Vercel部署,MySQL数据库持久化数据储存</p><p>优势是无服务器(?真的是优势吗)</p><p>缺点是稳定性(至少我不提供SLA保证)与速度(依据文章长度与网速,获取到摘要的时间平均约10秒)</p><p>仓库地址:<a href="https://github.com/OrdChaos/ordchaosgpt-cloud-function">ordchaosgpt-cloud-function</a></p><h2 id="经历"><a class="markdownIt-Anchor" href="#经历"></a> 经历</h2><p>最开始还是想着用rust写一个服务端跑在docker上。</p><p>服务端倒是好写:</p><figure class="highlight rust"><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></pre></td><td class="code"><pre><code class="hljs rust"><span class="hljs-keyword">use</span> actix_web::{post, web, App, HttpServer, Responder, HttpResponse, HttpRequest};<br><span class="hljs-keyword">use</span> serde::{Deserialize, Serialize};<br><span class="hljs-keyword">use</span> std::path::Path;<br><span class="hljs-keyword">use</span> std::fs;<br><span class="hljs-keyword">use</span> reqwest::Client;<br><span class="hljs-keyword">use</span> serde_json::json;<br><br><span class="hljs-meta">#[derive(Serialize, Deserialize)]</span><br><span class="hljs-keyword">struct</span> <span class="hljs-title class_">SummaryRequest</span> {<br> content: <span class="hljs-type">String</span>,<br> url: <span class="hljs-type">String</span>,<br>}<br><br><span class="hljs-meta">#[derive(Serialize, Deserialize)]</span><br><span class="hljs-keyword">struct</span> <span class="hljs-title class_">SummaryResponse</span> {<br> url: <span class="hljs-type">String</span>,<br> summary: <span class="hljs-type">String</span>,<br>}<br><br><span class="hljs-keyword">struct</span> <span class="hljs-title class_">AppState</span> {<br> auth_token: <span class="hljs-type">String</span>,<br>}<br><br><span class="hljs-keyword">const</span> SUMMARY_DIR: &<span class="hljs-type">str</span> = <span class="hljs-string">"summaries"</span>;<br><br><span class="hljs-keyword">fn</span> <span class="hljs-title function_">is_valid_referer</span>(referer: <span class="hljs-type">Option</span><&<span class="hljs-type">str</span>>) <span class="hljs-punctuation">-></span> <span class="hljs-type">bool</span> {<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Some</span>(ref_url) = referer {<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">valid_domains</span> = <span class="hljs-built_in">vec!</span>[<br> <span class="hljs-string">".ordchaos.com"</span>,<br> <span class="hljs-string">".ordchaos.top"</span>,<br> <span class="hljs-string">".ordchaos.eu.org"</span>,<br> ];<br> <span class="hljs-keyword">return</span> valid_domains.<span class="hljs-title function_ invoke__">iter</span>().<span class="hljs-title function_ invoke__">any</span>(|domain| ref_url.<span class="hljs-title function_ invoke__">ends_with</span>(domain));<br> }<br> <span class="hljs-literal">false</span><br>}<br><br><span class="hljs-keyword">async</span> <span class="hljs-keyword">fn</span> <span class="hljs-title function_">generate_summary</span>(content: &<span class="hljs-type">str</span>) <span class="hljs-punctuation">-></span> <span class="hljs-type">Result</span><<span class="hljs-type">String</span>, <span class="hljs-type">Box</span><<span class="hljs-keyword">dyn</span> std::error::Error>> {<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">api_key</span> = <span class="hljs-string">"*******************************"</span>;<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">api_url</span> = <span class="hljs-string">"https://dashscope.aliyuncs.com/compatible-mode/v1"</span>;<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">client</span> = Client::<span class="hljs-title function_ invoke__">new</span>();<br><br> <span class="hljs-keyword">let</span> <span class="hljs-variable">request_body</span> = json!({<br> <span class="hljs-string">"model"</span>: <span class="hljs-string">"qwen-long"</span>,<br> <span class="hljs-string">"messages"</span>: [<br> {<span class="hljs-string">"role"</span>: <span class="hljs-string">"system"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-string">"You are a helpful summary generator."</span>},<br> {<span class="hljs-string">"role"</span>: <span class="hljs-string">"user"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-built_in">format!</span>(<span class="hljs-string">"请为以下内容用中文生成长度为150汉字左右的摘要,摘要只有一个自然段,且只给出摘要即可,不要说其他任何话: {}"</span>, content)}<br> ],<br> <span class="hljs-string">"temperature"</span>: <span class="hljs-number">0.8</span>,<br> <span class="hljs-string">"top_p"</span>: <span class="hljs-number">0.8</span><br> });<br><br> <span class="hljs-keyword">let</span> <span class="hljs-variable">response</span> = client<br> .<span class="hljs-title function_ invoke__">post</span>(<span class="hljs-built_in">format!</span>(<span class="hljs-string">"{}/chat/completions"</span>, api_url))<br> .<span class="hljs-title function_ invoke__">header</span>(<span class="hljs-string">"Authorization"</span>, <span class="hljs-built_in">format!</span>(<span class="hljs-string">"Bearer {}"</span>, api_key))<br> .<span class="hljs-title function_ invoke__">json</span>(&request_body)<br> .<span class="hljs-title function_ invoke__">send</span>()<br> .<span class="hljs-keyword">await</span>?;<br><br> <span class="hljs-keyword">let</span> <span class="hljs-variable">response_json</span>: serde_json::Value = response.<span class="hljs-title function_ invoke__">json</span>().<span class="hljs-keyword">await</span>?;<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">summary</span> = response_json[<span class="hljs-string">"choices"</span>][<span class="hljs-number">0</span>][<span class="hljs-string">"message"</span>][<span class="hljs-string">"content"</span>]<br> .<span class="hljs-title function_ invoke__">as_str</span>()<br> .<span class="hljs-title function_ invoke__">unwrap_or</span>(<span class="hljs-string">"摘要生成失败:返回格式不正确"</span>)<br> .<span class="hljs-title function_ invoke__">to_string</span>();<br><br> <span class="hljs-title function_ invoke__">Ok</span>(summary.<span class="hljs-title function_ invoke__">trim</span>().<span class="hljs-title function_ invoke__">to_string</span>())<br>}<br><br><span class="hljs-keyword">fn</span> <span class="hljs-title function_">save_summary</span>(abbrlink: &<span class="hljs-type">str</span>, summary_data: &SummaryResponse) <span class="hljs-punctuation">-></span> std::io::<span class="hljs-type">Result</span><()> {<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">summary_path</span> = <span class="hljs-built_in">format!</span>(<span class="hljs-string">"{}/{}.json"</span>, SUMMARY_DIR, abbrlink);<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">json_data</span> = serde_json::<span class="hljs-title function_ invoke__">to_string</span>(summary_data)?;<br> fs::<span class="hljs-title function_ invoke__">write</span>(&summary_path, &json_data)?;<br> <span class="hljs-title function_ invoke__">Ok</span>(())<br>}<br><br><span class="hljs-keyword">fn</span> <span class="hljs-title function_">load_summary</span>(abbrlink: &<span class="hljs-type">str</span>) <span class="hljs-punctuation">-></span> <span class="hljs-type">Option</span><SummaryResponse> {<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">summary_path</span> = <span class="hljs-built_in">format!</span>(<span class="hljs-string">"{}/{}.json"</span>, SUMMARY_DIR, abbrlink);<br> <span class="hljs-keyword">if</span> Path::<span class="hljs-title function_ invoke__">new</span>(&summary_path).<span class="hljs-title function_ invoke__">exists</span>() {<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Ok</span>(json_data) = fs::<span class="hljs-title function_ invoke__">read_to_string</span>(&summary_path) {<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Ok</span>(summary) = serde_json::<span class="hljs-title function_ invoke__">from_str</span>(&json_data) {<br> <span class="hljs-keyword">return</span> <span class="hljs-title function_ invoke__">Some</span>(summary);<br> }<br> }<br> }<br> <span class="hljs-literal">None</span><br>}<br><br><span class="hljs-meta">#[post(<span class="hljs-string">"/generate-summary"</span>)]</span><br><span class="hljs-keyword">async</span> <span class="hljs-keyword">fn</span> <span class="hljs-title function_">generate_summary_handler</span>(<br> data: web::Data<AppState>,<br> req: HttpRequest,<br> summary_request: web::Json<SummaryRequest><br>) <span class="hljs-punctuation">-></span> <span class="hljs-keyword">impl</span> <span class="hljs-title class_">Responder</span> {<br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Some</span>(auth_header) = req.<span class="hljs-title function_ invoke__">headers</span>().<span class="hljs-title function_ invoke__">get</span>(<span class="hljs-string">"Authorization"</span>) {<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">token</span> = auth_header.<span class="hljs-title function_ invoke__">to_str</span>().<span class="hljs-title function_ invoke__">unwrap_or</span>(<span class="hljs-string">""</span>).<span class="hljs-title function_ invoke__">trim_start_matches</span>(<span class="hljs-string">"Bearer "</span>);<br> <span class="hljs-keyword">if</span> token != data.auth_token {<br> <span class="hljs-keyword">return</span> HttpResponse::<span class="hljs-title function_ invoke__">Unauthorized</span>().<span class="hljs-title function_ invoke__">body</span>(<span class="hljs-string">"鉴权失败:Token不正确"</span>);<br> }<br> } <span class="hljs-keyword">else</span> {<br> <span class="hljs-keyword">return</span> HttpResponse::<span class="hljs-title function_ invoke__">Unauthorized</span>().<span class="hljs-title function_ invoke__">body</span>(<span class="hljs-string">"鉴权失败:缺失Token"</span>);<br> }<br><br> <span class="hljs-keyword">let</span> <span class="hljs-variable">referer</span> = req.<span class="hljs-title function_ invoke__">headers</span>().<span class="hljs-title function_ invoke__">get</span>(<span class="hljs-string">"Referer"</span>).<span class="hljs-title function_ invoke__">and_then</span>(|v| v.<span class="hljs-title function_ invoke__">to_str</span>().<span class="hljs-title function_ invoke__">ok</span>());<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">origin</span> = req.<span class="hljs-title function_ invoke__">headers</span>().<span class="hljs-title function_ invoke__">get</span>(<span class="hljs-string">"Origin"</span>).<span class="hljs-title function_ invoke__">and_then</span>(|v| v.<span class="hljs-title function_ invoke__">to_str</span>().<span class="hljs-title function_ invoke__">ok</span>());<br> <span class="hljs-keyword">if</span> !<span class="hljs-title function_ invoke__">is_valid_referer</span>(referer) && !<span class="hljs-title function_ invoke__">is_valid_referer</span>(origin) {<br> <span class="hljs-keyword">return</span> HttpResponse::<span class="hljs-title function_ invoke__">Forbidden</span>().<span class="hljs-title function_ invoke__">body</span>(<span class="hljs-string">"拒绝生成摘要:来源不正确"</span>);<br> }<br><br> <span class="hljs-keyword">let</span> <span class="hljs-variable">abbrlink</span> = summary_request.url<br> .<span class="hljs-title function_ invoke__">split</span>(<span class="hljs-string">'/'</span>)<br> .<span class="hljs-title function_ invoke__">filter</span>(|&segment| !segment.<span class="hljs-title function_ invoke__">is_empty</span>())<br> .<span class="hljs-title function_ invoke__">last</span>()<br> .<span class="hljs-title function_ invoke__">unwrap_or</span>(<span class="hljs-string">""</span>);<br><br> <span class="hljs-keyword">if</span> abbrlink.<span class="hljs-title function_ invoke__">is_empty</span>() {<br> <span class="hljs-keyword">return</span> HttpResponse::<span class="hljs-title function_ invoke__">BadRequest</span>().<span class="hljs-title function_ invoke__">body</span>(<span class="hljs-string">"Invalid URL format"</span>);<br> }<br><br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Some</span>(existing_summary) = <span class="hljs-title function_ invoke__">load_summary</span>(abbrlink) {<br> <span class="hljs-keyword">return</span> HttpResponse::<span class="hljs-title function_ invoke__">Ok</span>().<span class="hljs-title function_ invoke__">json</span>(existing_summary);<br> }<br><br> <span class="hljs-keyword">let</span> <span class="hljs-variable">summary</span> = <span class="hljs-keyword">match</span> <span class="hljs-title function_ invoke__">generate_summary</span>(&summary_request.content).<span class="hljs-keyword">await</span> {<br> <span class="hljs-title function_ invoke__">Ok</span>(summary) => summary,<br> <span class="hljs-title function_ invoke__">Err</span>(_) => <span class="hljs-keyword">return</span> HttpResponse::<span class="hljs-title function_ invoke__">InternalServerError</span>().<span class="hljs-title function_ invoke__">body</span>(<span class="hljs-string">"摘要生成失败"</span>),<br> };<br><br> <span class="hljs-keyword">let</span> <span class="hljs-variable">summary_data</span> = SummaryResponse {<br> url: summary_request.url.<span class="hljs-title function_ invoke__">clone</span>(),<br> summary: summary.<span class="hljs-title function_ invoke__">clone</span>(),<br> };<br><br> <span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Err</span>(err) = <span class="hljs-title function_ invoke__">save_summary</span>(abbrlink, &summary_data) {<br> <span class="hljs-keyword">return</span> HttpResponse::<span class="hljs-title function_ invoke__">InternalServerError</span>().<span class="hljs-title function_ invoke__">body</span>(<span class="hljs-built_in">format!</span>(<span class="hljs-string">"存储摘要失败: {}"</span>, err));<br> }<br><br> HttpResponse::<span class="hljs-title function_ invoke__">Ok</span>().<span class="hljs-title function_ invoke__">json</span>(summary_data)<br>}<br><br><span class="hljs-meta">#[actix_web::main]</span><br><span class="hljs-keyword">async</span> <span class="hljs-keyword">fn</span> <span class="hljs-title function_">main</span>() <span class="hljs-punctuation">-></span> std::io::<span class="hljs-type">Result</span><()> {<br> fs::<span class="hljs-title function_ invoke__">create_dir_all</span>(SUMMARY_DIR)?;<br> <span class="hljs-keyword">let</span> <span class="hljs-variable">auth_token</span> = std::env::<span class="hljs-title function_ invoke__">var</span>(<span class="hljs-string">"AUTH_TOKEN"</span>).<span class="hljs-title function_ invoke__">expect</span>(<span class="hljs-string">"AUTH_TOKEN 未被设置"</span>);<br><br> <span class="hljs-built_in">println!</span>(<span class="hljs-string">"服务端已经在 http://localhost:11451 开启"</span>);<br><br> HttpServer::<span class="hljs-title function_ invoke__">new</span>(<span class="hljs-keyword">move</span> || {<br> App::<span class="hljs-title function_ invoke__">new</span>()<br> .<span class="hljs-title function_ invoke__">app_data</span>(web::Data::<span class="hljs-title function_ invoke__">new</span>(AppState {<br> auth_token: auth_token.<span class="hljs-title function_ invoke__">clone</span>(),<br> }))<br> .<span class="hljs-title function_ invoke__">service</span>(generate_summary_handler)<br> })<br> .<span class="hljs-title function_ invoke__">bind</span>(<span class="hljs-string">"127.0.0.1:11451"</span>)?<br> .<span class="hljs-title function_ invoke__">run</span>()<br> .<span class="hljs-keyword">await</span><br>}<br></code></pre></td></tr></table></figure><p>(有兴趣就拿去用吧,标识原作者就好)</p><p>结果部署docker的时候服务器炸了,原因未知。</p><p>所以想着还是别再折腾我那辣鸡服务器了,遂转为用JavaScript写云函数,主打一个Serverless.</p><p>没什么好说的,主要是第一次写不太熟练,本身还是挺简单的。</p><p>遇到的问题是MongoDB没连上,无奈改为MySQL<span class="heimu" title="你知道的太多了">结果用的还是服务器上的数据库</span>。</p><h2 id="部署"><a class="markdownIt-Anchor" href="#部署"></a> 部署</h2><p>如果你想使用的话,前往<a href="https://github.com/OrdChaos/ordchaosgpt-cloud-function">这个项目的仓库</a>参考<code>readme.md</code>即可。</p><p>部署非常简单,有手就行,要求自备MySQL数据库。</p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>写了一上午的JS(</p><p>那就这样,886</p>]]></content>
<summary type="html"><p>时隔一年,终于抽出来时间完全重写了AI摘要的后端。</p></summary>
<category term="编程" scheme="https://www.ordchaos.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/tags/%E6%95%99%E7%A8%8B/"/>
<category term="javascript" scheme="https://www.ordchaos.com/tags/javascript/"/>
<category term="AI" scheme="https://www.ordchaos.com/tags/AI/"/>
<category term="npm" scheme="https://www.ordchaos.com/tags/npm/"/>
<category term="vercel" scheme="https://www.ordchaos.com/tags/vercel/"/>
<category term="无服务器" scheme="https://www.ordchaos.com/tags/%E6%97%A0%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
</entry>
<entry>
<title>学习笔记——分块、线段树</title>
<link href="https://www.ordchaos.com/posts/6e841aef/"/>
<id>https://www.ordchaos.com/posts/6e841aef/</id>
<published>2024-08-05T13:08:17.000Z</published>
<updated>2024-08-05T13:08:17.000Z</updated>
<content type="html"><![CDATA[<p>继续备赛CSP-S,这次解决一下此前让人<span class="heimu" title="你知道的太多了">只有我</span>闻之色变的线段树。</p><p>当然,在此之前,先来看看比较简单的分块。</p><span id="more"></span><p>不过在此之前,先理一理这两种数据结构(?)的适用范围。</p><p>(注:本文是对于<a href="https://oi-wiki.org/">OI WIKI</a>即其它内容写作而来的学习笔记,内容可能稍显一致,但绝非抄袭/洗稿等,欢迎对比)</p><h2 id="分块"><a class="markdownIt-Anchor" href="#分块"></a> 分块</h2><p>具体而言,分块并不是数据结构,而是一种思想。</p><p>在一次同时以相同操作处理大量数据时,不单独处理而进行统筹操作,一次性完成处理。</p><p>这使得其可以用于快速计算类似区间和的问题。</p><p>比之线段树其更为简单,当然,随数据量上升而渐进的复杂度就是相应的代价。</p><p>不过在数据量不大时显然分块更能帮助我们快速解决问题。</p><h3 id="原理"><a class="markdownIt-Anchor" href="#原理"></a> 原理</h3><p>想象我们有一组共<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span></span></span></span>个数据,记为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">x_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">x_{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.638891em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span></span></span></span>。</p><p>现在,我们希望得到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>a</mi><mo separator="true">,</mo><mi>b</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ a,b \right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>范围内的区间和。</p><p>如果线性存储,那么对于每次询问操作,都需要进行<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">(</mo><mi>b</mi><mo>−</mo><mi>a</mi><mo>+</mo><mn>1</mn><mo fence="true">)</mo></mrow><annotation encoding="application/x-tex">\left( b-a+1 \right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord mathdefault">b</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose delimcenter" style="top:0em;">)</span></span></span></span></span>次求和,是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mrow><mo fence="true">(</mo><mi>n</mi><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">O\left( n \right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord mathdefault">n</span><span class="mclose delimcenter" style="top:0em;">)</span></span></span></span></span>级别的时间复杂度。</p><p>于是开始分块。将数据分为每<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>个一组,记为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>z</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">z_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.04398em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>z</mi><mrow><mfrac><mi>n</mi><mi>y</mi></mfrac><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">z_{\frac{n}{y}-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.91858em;vertical-align:-0.4880199999999999em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33408000000000004em;"><span style="top:-2.85em;margin-left:-0.04398em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6915428571428572em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.384em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.48288571428571425em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.4880199999999999em;"><span></span></span></span></span></span></span></span></span></span>(其中<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>z</mi><mi>i</mi></msub><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mi>i</mi><mi>y</mi></mrow><mrow><mi>i</mi><mi>y</mi><mo>+</mo><mi>y</mi><mo>−</mo><mn>1</mn></mrow></msubsup><msub><mi>x</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">z_i=\sum_{j=iy}^{iy+y-1}{x_j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.04398em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.400382em;vertical-align:-0.43581800000000004em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.964564em;"><span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.2029000000000005em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.43581800000000004em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span></span>)<sup id="fnref:1" class="footnote-ref"><a href="#fn:1" rel="footnote"><span class="hint--top hint--rounded" aria-label="本文内的除法均为整数除法。">[1]</span></a></sup>:</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder><mo><munder><mrow><msub><mi>x</mi><mn>0</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>x</mi><mn>3</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>x</mi><mrow><mi>y</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><mo stretchy="true">⏟</mo></munder></mo><msub><mi>z</mi><mn>0</mn></msub></munder><mo separator="true">,</mo><munder><mo><munder><mrow><msub><mi>x</mi><mi>y</mi></msub><mo separator="true">,</mo><msub><mi>x</mi><mrow><mi>y</mi><mo>+</mo><mn>1</mn></mrow></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi></mrow><mo stretchy="true">⏟</mo></munder></mo><mrow><msub><mi>z</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>z</mi><mn>2</mn></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow></munder><mi mathvariant="normal">.</mi><munder><mo><munder><mrow><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><mo stretchy="true">⏟</mo></munder></mo><msub><mi>z</mi><mrow><mfrac><mi>n</mi><mi>y</mi></mfrac><mo>−</mo><mn>1</mn></mrow></msub></munder></mrow><annotation encoding="application/x-tex">\underset{z_0}{\underbrace{x_0,x_1,x_2,x_3,...,x_{y-1}}},\underset{z_1,z_2...}{\underbrace{x_y,x_{y+1},.}}.\underset{z_{\frac{n}{y}-1}}{\underbrace{.,x_{n-1}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.517531em;vertical-align:-2.086971em;"></span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.43056000000000005em;"><span style="top:-1.4658920000000002em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:-0.04398em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop"><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.43055999999999994em;"><span class="svg-align" style="top:-2.065892em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z'/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.934108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.734208em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.43056000000000005em;"><span style="top:-1.465892em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:-0.04398em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mpunct mtight">,</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:-0.04398em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mord mtight">.</span><span class="mord mtight">.</span><span class="mord mtight">.</span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop"><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.43055999999999994em;"><span class="svg-align" style="top:-2.065892em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z'/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.934108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.770216em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.43055999999999983em;"><span style="top:-1.543669em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3447999999999999em;"><span style="top:-2.760828571428571em;margin-left:-0.04398em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size1 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8175600000000001em;"><span style="top:-2.468em;"><span class="pstrut" style="height:3em;"></span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.387em;"><span class="pstrut" style="height:3em;"></span><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.72644em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size1 size6"></span></span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7580571428571429em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop"><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.43055999999999994em;"><span class="svg-align" style="top:-2.143669em;"><span class="pstrut" style="height:3em;"></span><span class="stretchy" style="height:0.548em;min-width:1.6em;"><span class="brace-left" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMinYMin slice'><path d='M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z'/></svg></span><span class="brace-center" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMidYMin slice'><path d='M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z'/></svg></span><span class="brace-right" style="height:0.548em;"><svg width='400em' height='0.548em' viewBox='0 0 400000 548' preserveAspectRatio='xMaxYMin slice'><path d='M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z'/></svg></span></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.208331em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.8563310000000001em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.086971em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>此时,对于<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>a</mi><mo separator="true">,</mo><mi>b</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ a,b \right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>的区间和,可以很容易想到求法(一般而言最后一块不会是完整块,不过无伤大雅):</p><ul><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>在同一块内,遍历<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>求和。</li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>不在同一块内,区间和为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mi>a</mi></mrow><mrow><mfrac><mi>a</mi><mi>y</mi></mfrac><mi>y</mi><mo>+</mo><mi>y</mi><mo>−</mo><mn>1</mn></mrow></msubsup><msub><mi>x</mi><mi>i</mi></msub><mo>+</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mfrac><mi>a</mi><mi>y</mi></mfrac><mo>+</mo><mn>1</mn></mrow><mrow><mfrac><mi>b</mi><mi>y</mi></mfrac><mo>−</mo><mn>1</mn></mrow></msubsup><mrow><msub><mi>z</mi><mi>i</mi></msub><mo>+</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mfrac><mi>b</mi><mi>y</mi></mfrac><mi>y</mi></mrow><mi>b</mi></msubsup><msub><mi>x</mi><mi>i</mi></msub></mrow></mrow><annotation encoding="application/x-tex">\sum_{i=a}^{\frac{a}{y}y+y-1}{x_i}+\sum_{i=\frac{a}{y}+1}^{\frac{b}{y}-1}{z_i+\sum_{i=\frac{b}{y}y}^b{x_i}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.443764em;vertical-align:-0.27686399999999994em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1669em;"><span style="top:-2.7231360000000002em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mathdefault mtight">a</span></span></span></span><span style="top:-3.68282em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6915428571428572em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.384em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">a</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.48288571428571425em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.27686399999999994em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.9365699999999997em;vertical-align:-0.6377299999999999em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.2988399999999998em;"><span style="top:-2.70072em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6915428571428572em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.384em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">a</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.48288571428571425em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.68282em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8800285714285714em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.384em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.48288571428571425em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.6373em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.04398em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9890079999999999em;"><span style="top:-2.70029em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8800285714285714em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.384em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">b</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.48288571428571425em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.5029em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.6377299999999999em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></span>,即包含了<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的不完整块与中间的完整块。</li></ul><p>只要在建块的时候进行预处理就可以通过分块节省大量时间(单次操作时间复杂度变为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mrow><mo fence="true">(</mo><mfrac><mi>n</mi><mi>y</mi></mfrac><mo>+</mo><mi>y</mi><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">O\left( \frac{n}{y}+y \right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.80002em;vertical-align:-0.65002em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size2">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size2">)</span></span></span></span></span></span>)</p><p>利用基本不等式<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>⩾</mo><mn>2</mn><msqrt><mrow><mi>a</mi><mi>b</mi></mrow></msqrt></mrow><annotation encoding="application/x-tex">a+b\geqslant 2\sqrt{ab}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83111em;vertical-align:-0.13667em;"></span><span class="mord mathdefault">b</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel amsrm">⩾</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.10777999999999999em;"></span><span class="mord">2</span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.93222em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord mathdefault">a</span><span class="mord mathdefault">b</span></span></span><span style="top:-2.89222em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.10777999999999999em;"><span></span></span></span></span></span></span></span></span>可以得知,当且仅当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mi>n</mi><mi>y</mi></mfrac><mo>=</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">\frac{n}{y}=y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1764999999999999em;vertical-align:-0.481108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>时,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">(</mo><mfrac><mi>n</mi><mi>y</mi></mfrac><mo>+</mo><mi>y</mi><mo fence="true">)</mo></mrow><annotation encoding="application/x-tex">\left( \frac{n}{y}+y \right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.80002em;vertical-align:-0.65002em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size2">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size2">)</span></span></span></span></span></span>取最小值<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><msqrt><mi>n</mi></msqrt></mrow><annotation encoding="application/x-tex">2\sqrt{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.23972em;"></span><span class="mord">2</span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8002800000000001em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord mathdefault">n</span></span></span><span style="top:-2.76028em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.23972em;"><span></span></span></span></span></span></span></span></span>。也就是说,当每个块大小为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msqrt><mi>n</mi></msqrt></mrow><annotation encoding="application/x-tex">\sqrt{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-0.23972em;"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8002800000000001em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord mathdefault">n</span></span></span><span style="top:-2.76028em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.23972em;"><span></span></span></span></span></span></span></span></span>时,单次操作得到最小时间复杂度<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mrow><mo fence="true">(</mo><msqrt><mi>n</mi></msqrt><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">O\left(\sqrt{n} \right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.05028em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8002800000000001em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord mathdefault">n</span></span></span><span style="top:-2.76028em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg width='400em' height='1.08em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'><path d='M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z'/></svg></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.23972em;"><span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;">)</span></span></span></span></span>。</p><p>于是我们可以尝试开始建块。</p><h3 id="建块"><a class="markdownIt-Anchor" href="#建块"></a> 建块</h3><p>首先,定义数据结构:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">template</span> <<span class="hljs-keyword">class</span> <span class="hljs-title class_">T</span>><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">blocks</span> {<br>vector<T> datas;<br>vector<T> sums;<br><span class="hljs-type">size_t</span> s;<br><br><span class="hljs-comment">//...</span><br>};<br></code></pre></td></tr></table></figure><p>用向量存储数据,用<code>s</code>来存储每一块的大小。</p><p>然后,建块:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//...</span><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">blocks</span> {<br><span class="hljs-comment">//...</span><br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">build</span><span class="hljs-params">(vector<T> d, <span class="hljs-type">size_t</span> ss)</span> </span>{<br><span class="hljs-type">size_t</span> length = d.<span class="hljs-built_in">size</span>();<br><br>datas.<span class="hljs-built_in">clear</span>();<br>sums.<span class="hljs-built_in">clear</span>();<br>datas.<span class="hljs-built_in">resize</span>(length);<br><br>T sum = <span class="hljs-number">0</span>;<br><span class="hljs-type">size_t</span> cnt = <span class="hljs-number">0</span>;<br><span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = <span class="hljs-number">0</span>;i < length;i++) {<br>datas[i] = d[i];<br>sum += d[i];<br>cnt++;<br><span class="hljs-keyword">if</span>(cnt == ss) {<br>sums.<span class="hljs-built_in">push_back</span>(sum);<br>cnt = <span class="hljs-number">0</span>;<br>sum = <span class="hljs-number">0</span>;<br>}<br>}<br><span class="hljs-keyword">if</span>(cnt != <span class="hljs-number">0</span>) sums.<span class="hljs-built_in">push_back</span>(sum);<br><br>s = ss;<br>}<br><br><span class="hljs-comment">//...</span><br>};<br></code></pre></td></tr></table></figure><p>在建块时计算每一块的区间和并存储即可(别忘了可能有的不完整块)。</p><p>以及根据由基本不等式得到的结论,块大小<code>s</code>一般为<code>size_t(sqrt(d.size()))</code></p><p>对于求区间和操作,依照原理一节所述操作即可。</p><p>如下:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//...</span><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">blocks</span> {<br><span class="hljs-comment">//...</span><br><br> <span class="hljs-keyword">public</span>:<br> <span class="hljs-function">T <span class="hljs-title">query</span><span class="hljs-params">(<span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end)</span> </span>{<br> <span class="hljs-type">size_t</span> block_begin = begin / s;<br> <span class="hljs-type">size_t</span> block_end = end / s;<br><br> T sum = <span class="hljs-number">0</span>;<br><br> <span class="hljs-comment">//在同一块里吗?</span><br> <span class="hljs-keyword">if</span>(block_begin == block_end) {<br> <span class="hljs-comment">//如果在,线性遍历求和即可</span><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin;i <= end;i++) {<br> sum += datas[i];<br> }<br><br> <span class="hljs-keyword">return</span> sum;<br> }<br><br> <span class="hljs-comment">//如果不在,分别计算左、中、右三部分</span><br> <span class="hljs-comment">//左</span><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin;i < (block_begin + <span class="hljs-number">1</span>) * s;i++) {<br> sum += datas[i];<br> }<br><br> <span class="hljs-comment">//右(注意小于等于)</span><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_end * s;i <= end;i++) {<br> sum += datas[i];<br> }<br><br> <span class="hljs-comment">//中</span><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_begin + <span class="hljs-number">1</span>;i < block_end;i++) {<br> sum += sums[i];<br> }<br><br> <span class="hljs-keyword">return</span> sum;<br> }<br><br><span class="hljs-comment">//...</span><br>};<br></code></pre></td></tr></table></figure><h3 id="更改"><a class="markdownIt-Anchor" href="#更改"></a> 更改</h3><p>存入了数据后,我们自然希望能够自由地更改存入的数据。</p><p>对于区间内的修改操作,同样分为两类(以修改区间<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>a</mi><mo separator="true">,</mo><mi>b</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ a,b\right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>为例):</p><ul><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>在同一块内,遍历<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>赋值(需要重新计算区间和)。</li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>不在同一块内,遍历包含了<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">x_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">a</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">x_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">b</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的两个不完整块赋值(同上),以及修改中间完整块的区间和即可(无需修改数据本身,具体内容如下代码)。</li></ul><p>问题在于,修改了包含数个整块的数据的值以后,计算修改范围内的完整块内的区间和时可能会导致结果未正确更新。此时需要引入新结构:懒惰标记(lazy marker)。</p><p>对每一个块建立懒惰标记,在查询时通过懒惰标记累计增量更新即可。</p><p>所以我们有:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">template</span> <<span class="hljs-keyword">class</span> <span class="hljs-title class_">T</span>><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">blocks</span> {<br>vector<T> datas;<br>vector<T> sums;<br>vector<T> lazy_markers; <span class="hljs-comment">//引入懒惰标记</span><br><span class="hljs-type">size_t</span> s;<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">build</span><span class="hljs-params">(vector<T> d, <span class="hljs-type">size_t</span> ss)</span> </span>{<br><span class="hljs-type">size_t</span> length = d.<span class="hljs-built_in">size</span>();<br><br>datas.<span class="hljs-built_in">clear</span>();<br>sums.<span class="hljs-built_in">clear</span>();<br>lazy_markers.<span class="hljs-built_in">clear</span>(); <span class="hljs-comment">//清空懒惰标记</span><br>datas.<span class="hljs-built_in">resize</span>(length);<br><br>T sum = <span class="hljs-number">0</span>;<br><span class="hljs-type">size_t</span> cnt = <span class="hljs-number">0</span>;<br><span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = <span class="hljs-number">0</span>;i < length;i++) {<br>datas[i] = d[i];<br>sum += d[i];<br>cnt++;<br><span class="hljs-keyword">if</span>(cnt == ss) {<br>sums.<span class="hljs-built_in">push_back</span>(sum);<br>lazy_markers.<span class="hljs-built_in">push_back</span>(<span class="hljs-number">0</span>); <span class="hljs-comment">//与sums一一对应</span><br>cnt = <span class="hljs-number">0</span>;<br>sum = <span class="hljs-number">0</span>;<br>}<br>}<br><span class="hljs-keyword">if</span>(cnt != <span class="hljs-number">0</span>) {<br>sums.<span class="hljs-built_in">push_back</span>(sum);<br>lazy_markers.<span class="hljs-built_in">push_back</span>(<span class="hljs-number">0</span>); <span class="hljs-comment">//同理,与sums一一对应</span><br>}<br><br>s = ss;<br>}<br><br> <span class="hljs-keyword">public</span>:<br> <span class="hljs-function">T <span class="hljs-title">query</span><span class="hljs-params">(<span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end)</span> </span>{<br> <span class="hljs-type">size_t</span> block_begin = begin / s;<br> <span class="hljs-type">size_t</span> block_end = end / s;<br><br> T sum = <span class="hljs-number">0</span>;<br><br> <span class="hljs-keyword">if</span>(block_begin == block_end) {<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin;i <= end;i++) {<br> sum += datas[i] + lazy_marker[block_begin]; <span class="hljs-comment">//增加懒惰标记内的增量</span><br> }<br><br> <span class="hljs-keyword">return</span> sum;<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin;i < (block_begin + <span class="hljs-number">1</span>) * s;i++) {<br> sum += datas[i] + lazy_marker[block_begin]; <span class="hljs-comment">//增加懒惰标记内的增量</span><br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_end * s;i <= end;i++) {<br> sum += datas[i] + lazy_marker[block_end]; <span class="hljs-comment">//增加懒惰标记内的增量</span><br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_begin + <span class="hljs-number">1</span>;i < block_end;i++) {<br> sum += sums[i];<span class="hljs-comment">//区间和已被改变,无需考虑增量</span><br> }<br><br> <span class="hljs-keyword">return</span> sum;<br> }<br><br><span class="hljs-comment">//...</span><br>};<br></code></pre></td></tr></table></figure><p>由此,对于增量,我们可以有:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//...</span><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">blocks</span> {<br><span class="hljs-comment">//...</span><br><br> <span class="hljs-keyword">public</span>:<br><span class="hljs-comment">//...</span><br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">update</span><span class="hljs-params">(<span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end, T value)</span> </span>{<br> <span class="hljs-comment">//在同一块里吗?</span><br> <span class="hljs-keyword">if</span>(block_begin == block_end) {<br> <span class="hljs-comment">//如果在,线性遍历更新即可</span><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin;i <= end;i++) {<br> datas[i] += value;<br> sums[block_begin] += value; <span class="hljs-comment">//更新区间和</span><br> }<br><br> <span class="hljs-keyword">return</span>;<br> }<br><br><span class="hljs-comment">//如果不在,分别更新左、中、右部分</span><br><span class="hljs-comment">//左</span><br><span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin;i < (block_begin + <span class="hljs-number">1</span>) * s;i++) {<br>datas[i] += value;<br>sums[block_begin] += value; <span class="hljs-comment">//更新区间和</span><br>}<br><br> <span class="hljs-comment">//右(注意小于等于)</span><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_end * s;i <= end;i++) {<br> datas[i] += value;<br> sums[block_end] += value; <span class="hljs-comment">//更新区间和</span><br> }<br><br> <span class="hljs-comment">//中</span><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_begin + <span class="hljs-number">1</span>;i < block_end;i++) {<br> sums[i] += value * s; <span class="hljs-comment">//更新区间和</span><br> lazy_marker[i] += value; <span class="hljs-comment">//更新懒惰标记</span><br> }<br>}<br><br><span class="hljs-comment">//...</span><br>};<br></code></pre></td></tr></table></figure><h3 id="比较"><a class="markdownIt-Anchor" href="#比较"></a> 比较</h3><p>当我们希望得到区间最小/最大值时,同样可以采取分块的思想。</p><p>相信根据懒惰标记的方法也能想到,只需要再添加两个向量用于维护区间最小/最大值即可。</p><p>原理仍然一致,这里不重复给出。</p><p>以下是完整的代码:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">template</span> <<span class="hljs-keyword">class</span> <span class="hljs-title class_">T</span>><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">blocks</span> {<br>vector<T> datas;<br>vector<T> sums;<br>vector<T> lazy_markers;<br> vector<T> maxs; <span class="hljs-comment">//维护区间最大值</span><br> vector<T> mins; <span class="hljs-comment">//维护区间最小值</span><br><span class="hljs-type">size_t</span> s;<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">build</span><span class="hljs-params">(vector<T> d, <span class="hljs-type">size_t</span> ss)</span> </span>{<br><span class="hljs-type">size_t</span> length = d.<span class="hljs-built_in">size</span>();<br><br>datas.<span class="hljs-built_in">clear</span>();<br>sums.<span class="hljs-built_in">clear</span>();<br>lazy_markers.<span class="hljs-built_in">clear</span>();<br> maxs.<span class="hljs-built_in">clear</span>();<br> mins.<span class="hljs-built_in">clear</span>();<br>datas.<span class="hljs-built_in">resize</span>(length);<br><br>T sum = <span class="hljs-number">0</span>;<br><span class="hljs-type">size_t</span> cnt = <span class="hljs-number">0</span>;<br> T max_val = numeric_limits<T>::<span class="hljs-built_in">min</span>(); <span class="hljs-comment">//当作负无穷</span><br> T min_val = numeric_limits<T>::<span class="hljs-built_in">max</span>(); <span class="hljs-comment">//当作正无穷</span><br><span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = <span class="hljs-number">0</span>; i < length; i++) {<br>datas[i] = d[i];<br>sum += d[i];<br> max_val = <span class="hljs-built_in">max</span>(max_val, d[i]);<br> min_val = <span class="hljs-built_in">min</span>(min_val, d[i]);<br> cnt++;<br><span class="hljs-keyword">if</span>(cnt == ss) {<br>sums.<span class="hljs-built_in">push_back</span>(sum);<br>lazy_markers.<span class="hljs-built_in">push_back</span>(<span class="hljs-number">0</span>);<br> maxs.<span class="hljs-built_in">push_back</span>(max_val);<br> mins.<span class="hljs-built_in">push_back</span>(min_val);<br> max_val = numeric_limits<T>::<span class="hljs-built_in">min</span>();<br> min_val = numeric_limits<T>::<span class="hljs-built_in">max</span>();<br>sum = <span class="hljs-number">0</span>;<br> cnt = <span class="hljs-number">0</span>;<br>}<br>}<br><span class="hljs-keyword">if</span>(cnt != <span class="hljs-number">0</span>) {<br>sums.<span class="hljs-built_in">push_back</span>(sum);<br>lazy_markers.<span class="hljs-built_in">push_back</span>(<span class="hljs-number">0</span>);<br> maxs.<span class="hljs-built_in">push_back</span>(max_val);<br> mins.<span class="hljs-built_in">push_back</span>(min_val);<br>}<br><br>s = ss;<br>}<br><br> <span class="hljs-keyword">public</span>:<br> <span class="hljs-comment">//构造函数</span><br> <span class="hljs-built_in">blocks</span>(<span class="hljs-type">const</span> vector<T>& d, <span class="hljs-type">size_t</span> ss) {<br> <span class="hljs-built_in">build</span>(d, ss);<br> }<br><br><span class="hljs-comment">//query不变</span><br><br> <span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">update</span><span class="hljs-params">(<span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end, T value)</span> </span>{<br> <span class="hljs-type">size_t</span> block_begin = begin / s;<br> <span class="hljs-type">size_t</span> block_end = end / s;<br><br> <span class="hljs-comment">//重新计算最大/最小值</span><br> T max_val = numeric_limits<T>::<span class="hljs-built_in">min</span>();<br> T min_val = numeric_limits<T>::<span class="hljs-built_in">max</span>();<br><br> <span class="hljs-keyword">if</span>(block_begin == block_end) {<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin; i <= end; i++) {<br> datas[i] += value;<br> sums[block_begin] += value;<br> max_val = <span class="hljs-built_in">max</span>(max_val, datas[i]);<br> min_val = <span class="hljs-built_in">min</span>(min_val, datas[i]);<br> }<br> <span class="hljs-comment">//更新最大/最小值</span><br> maxs[block_begin] = <span class="hljs-built_in">max</span>(maxs[block_begin], max_val);<br> mins[block_begin] = <span class="hljs-built_in">min</span>(mins[block_begin], min_val);<br> <span class="hljs-keyword">return</span>;<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin; i < (block_begin + <span class="hljs-number">1</span>) * s; i++) {<br> datas[i] += value;<br> sums[block_begin] += value;<br> max_val = <span class="hljs-built_in">max</span>(max_val, datas[i]);<br> min_val = <span class="hljs-built_in">min</span>(min_val, datas[i]);<br> }<br> maxs[block_begin] = <span class="hljs-built_in">max</span>(maxs[block_begin], max_val);<br> mins[block_begin] = <span class="hljs-built_in">min</span>(mins[block_begin], min_val);<br><br> max_val = numeric_limits<T>::<span class="hljs-built_in">min</span>();<br> min_val = numeric_limits<T>::<span class="hljs-built_in">max</span>();<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_end * s; i <= end; i++) {<br> datas[i] += value;<br> sums[block_end] += value;<br> max_val = <span class="hljs-built_in">max</span>(max_val, datas[i]);<br> min_val = <span class="hljs-built_in">min</span>(min_val, datas[i]);<br> }<br> maxs[block_end] = <span class="hljs-built_in">max</span>(maxs[block_end], max_val);<br> mins[block_end] = <span class="hljs-built_in">min</span>(mins[block_end], min_val);<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_begin + <span class="hljs-number">1</span>; i < block_end; i++) {<br> sums[i] += value * s;<br> lazy_markers[i] += value;<br> maxs[i] += value;<br> mins[i] += value;<br> }<br> }<br><br> <span class="hljs-comment">//与query和update相同的结构:是否在同一块内->计算,query_min同理</span><br> <span class="hljs-function">T <span class="hljs-title">query_max</span><span class="hljs-params">(<span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end)</span> </span>{<br> <span class="hljs-type">size_t</span> block_begin = begin / s;<br> <span class="hljs-type">size_t</span> block_end = end / s;<br><br> T max_val = numeric_limits<T>::<span class="hljs-built_in">min</span>();<br><br> <span class="hljs-keyword">if</span>(block_begin == block_end) {<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin; i <= end; i++) {<br> max_val = <span class="hljs-built_in">max</span>(max_val, datas[i] + lazy_markers[block_begin]); <span class="hljs-comment">//注意处理懒惰标记的影响,以下同理</span><br> }<br> <span class="hljs-keyword">return</span> max_val;<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin; i < (block_begin + <span class="hljs-number">1</span>) * s; i++) {<br> max_val = <span class="hljs-built_in">max</span>(max_val, datas[i] + lazy_markers[block_begin]);<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_end * s; i <= end; i++) {<br> max_val = <span class="hljs-built_in">max</span>(max_val, datas[i] + lazy_markers[block_end]);<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_begin + <span class="hljs-number">1</span>; i < block_end; i++) {<br> max_val = <span class="hljs-built_in">max</span>(max_val, maxs[i]);<br> }<br><br> <span class="hljs-keyword">return</span> max_val;<br> }<br><br> <span class="hljs-function">T <span class="hljs-title">query_min</span><span class="hljs-params">(<span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end)</span> </span>{<br> <span class="hljs-type">size_t</span> block_begin = begin / s;<br> <span class="hljs-type">size_t</span> block_end = end / s;<br><br> T min_val = numeric_limits<T>::<span class="hljs-built_in">max</span>();<br><br> <span class="hljs-keyword">if</span>(block_begin == block_end) {<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin; i <= end; i++) {<br> min_val = <span class="hljs-built_in">min</span>(min_val, datas[i] + lazy_markers[block_begin]);<br> }<br> <span class="hljs-keyword">return</span> min_val;<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = begin; i < (block_begin + <span class="hljs-number">1</span>) * s; i++) {<br> min_val = <span class="hljs-built_in">min</span>(min_val, datas[i] + lazy_markers[block_begin]);<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_end * s; i <= end; i++) {<br> min_val = <span class="hljs-built_in">min</span>(min_val, datas[i] + lazy_markers[block_end]);<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">size_t</span> i = block_begin + <span class="hljs-number">1</span>; i < block_end; i++) {<br> min_val = <span class="hljs-built_in">min</span>(min_val, mins[i]);<br> }<br><br> <span class="hljs-keyword">return</span> min_val;<br> }<br>};<br></code></pre></td></tr></table></figure><p>一般而言,不会有题目同时要求进行数据变更、求区间和、求最值。</p><p>如果有,更推荐写线段树,毕竟分块拓展到这种程度也不简单了。</p><p>最后,对于懒惰标记的影响范围:</p><ul><li>赋值时:由update方法确定<strong>区间和</strong>的懒惰标记(datas、maxs、mins;不完整块直接线性增加)。</li><li>使用时:只对<strong>完整区间</strong>内的<strong>datas</strong>(换句话说,第三个循环/遍历中间块的循环内的datas)数据增加<strong>该块的懒惰标记</strong>;在query、query_max、query_min内使用。</li></ul><h3 id="例题"><a class="markdownIt-Anchor" href="#例题"></a> 例题</h3><p>如上文,几乎没有同时要求进行数据变更、求区间和、求最值的例题。</p><p>这里随便放一道看看得了。</p><p>题目来自洛谷<a href="https://www.luogu.com.cn/problem/P1816">P1816 忠诚</a></p><h4 id="题目描述"><a class="markdownIt-Anchor" href="#题目描述"></a> 题目描述</h4><p>老管家是一个聪明能干的人。他为财主工作了整整<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>10</mn></mrow><annotation encoding="application/x-tex">10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>年。财主为了让自已账目更加清楚,要求管家每天记<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>次账。由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">1,2,3,...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span></span></span></span>编号,然后不定时的问管家问题,问题是这样的:在<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">a</span></span></span></span>到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span>号账中最少的一笔是多少?为了让管家没时间作假,他总是一次问多个问题。</p><h4 id="输入格式"><a class="markdownIt-Anchor" href="#输入格式"></a> 输入格式</h4><p>输入中第一行有两个数<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mo separator="true">,</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">m,n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">m</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">n</span></span></span></span>表示有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">m</span></span></span></span>笔账和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span></span></span></span>个问题。</p><p>第二行为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">m</span></span></span></span>个数,分别是账目的钱数。</p><p>后面<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span></span></span></span>行分别是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span></span></span></span>个问题,每行有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span>个数字说明开始结束的账目编号。</p><h4 id="输出格式"><a class="markdownIt-Anchor" href="#输出格式"></a> 输出格式</h4><p>在一行中输出每个问题的答案,以一个空格分割。</p><h4 id="输入样例"><a class="markdownIt-Anchor" href="#输入样例"></a> 输入样例</h4><figure class="highlight shell"><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><code class="hljs shell">10 3<br>1 2 3 4 5 6 7 8 9 10<br>2 7<br>3 9<br>1 10<br></code></pre></td></tr></table></figure><h4 id="输出样例"><a class="markdownIt-Anchor" href="#输出样例"></a> 输出样例</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">2 3 1<br></code></pre></td></tr></table></figure><h4 id="题解"><a class="markdownIt-Anchor" href="#题解"></a> 题解</h4><p>上文重复了多遍建块以及各种操作的代码,故而这里只给出<code>main</code>函数。</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><bits/stdc++.h></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-comment">//blocks相关</span><br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">int</span> m, n;<br> cin >> m >> n;<br> <span class="hljs-function">vector<<span class="hljs-type">int</span>> <span class="hljs-title">data</span><span class="hljs-params">(m)</span></span>;<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>; i < m; ++i) {<br> cin >> data[i];<br> }<br><br> <span class="hljs-function">blocks<<span class="hljs-type">int</span>> <span class="hljs-title">b</span><span class="hljs-params">(data, <span class="hljs-type">size_t</span>(sqrt(data.size())))</span></span>;<br><br> vector<<span class="hljs-type">int</span>> results;<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>; i < n; ++i) {<br> <span class="hljs-type">int</span> a, c;<br> cin >> a >> c;<br> results.<span class="hljs-built_in">push_back</span>(b.<span class="hljs-built_in">query_min</span>(a - <span class="hljs-number">1</span>, c - <span class="hljs-number">1</span>));<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> result : results) {<br> cout << result << <span class="hljs-string">" "</span>;<br> }<br> cout << endl;<br><br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><h3 id="补充"><a class="markdownIt-Anchor" href="#补充"></a> 补充</h3><p>再次申明:分块是一种思想而不是数据结构,故而用法绝对不止这些。</p><p>在同时处理大量数据时,不妨考虑一下分块。</p><h2 id="线段树"><a class="markdownIt-Anchor" href="#线段树"></a> 线段树</h2><p>线段树是用来维护区间信息的<strong>数据结构</strong>。</p><p>相比于分块而言,线段树的结构更为细化,可以精确的控制数据的索引范围,而无需对于不完整部分进行遍历。</p><h3 id="原理-2"><a class="markdownIt-Anchor" href="#原理-2"></a> 原理</h3><blockquote><p>线段树将每个长度不为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>的区间划分成左右两个区间递归求解,把整个线段划分为一个树形结构,通过合并左右两区间信息来求得该区间的信息。这种数据结构可以方便的进行大部分的区间操作。<br />——<a href="https://oi-wiki.org/ds/seg/">OI WIKI - 线段树</a></p></blockquote><p>看到这段话之后有没有想起什么?</p><p>没错,是递归。通过递归就可以不断细化每一个左、右子树,直至叶节点为止。</p><h3 id="建树"><a class="markdownIt-Anchor" href="#建树"></a> 建树</h3><p>首先建立数据结构:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">template</span> <<span class="hljs-keyword">class</span> <span class="hljs-title class_">T</span>><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">SegTree</span> {<br>vector<T> datas;<br>vector<T> lazy_markers; <span class="hljs-comment">//懒惰标记,应该没忘记吧</span><br><span class="hljs-type">size_t</span> length;<br>};<br></code></pre></td></tr></table></figure><p>然后考虑递归建树即可:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//是SegTree的成员函数</span><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">build</span><span class="hljs-params">(vector<T> &d, <span class="hljs-type">size_t</span> node, <span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end)</span> </span>{<br><span class="hljs-keyword">if</span>(begin == end) { <span class="hljs-comment">//是叶节点</span><br>datas[node] = d[begin];<br>}<br><span class="hljs-keyword">else</span> { <span class="hljs-comment">//不是叶节点</span><br><span class="hljs-type">size_t</span> mid = (begin + end) / <span class="hljs-number">2</span>;<br><span class="hljs-built_in">build</span>(d, node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>, begin, mid); <span class="hljs-comment">//左子树</span><br><span class="hljs-built_in">build</span>(d, node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>, mid + <span class="hljs-number">1</span>, end); <span class="hljs-comment">//右子树</span><br>datas[node] = datas[node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>] + datas[node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>];<br>}<br>}<br><br><span class="hljs-keyword">public</span>:<br><span class="hljs-built_in">SegTree</span>(vector<T> &d) { <span class="hljs-comment">//构造函数</span><br>datas.<span class="hljs-built_in">clear</span>();<br>lazy_markers.<span class="hljs-built_in">clear</span>();<br>length = d.<span class="hljs-built_in">size</span>();<br><br>datas.<span class="hljs-built_in">resize</span>(length * <span class="hljs-number">4</span>);<br>lazy_markers.<span class="hljs-built_in">resize</span>(length * <span class="hljs-number">4</span>, <span class="hljs-number">0</span>);<br><br><span class="hljs-built_in">build</span>(d, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, length - <span class="hljs-number">1</span>);<br>}<br></code></pre></td></tr></table></figure><p>可能会有人认为完全二叉树的左右子节点应该是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mi>n</mi></mrow><annotation encoding="application/x-tex">2n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord mathdefault">n</span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mi>n</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2n+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">2</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>,但对于<code>0base</code>的数组而言,显然<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mo>×</mo><mn>0</mn><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">2\times 0=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>代表不了子节点。</p><h3 id="查询区间和"><a class="markdownIt-Anchor" href="#查询区间和"></a> 查询/区间和</h3><p>为何线段树由于分块?答案就在这里。</p><p>来看看这张图(备好草稿纸,照着下面的流程对着图自己想象一下):</p><p><img src="https://img.ordchaos.com/img/2024/08/79b1b7f18647e1f5596bc89cdfd11b29.png" alt="" /></p><p>根据<code>build</code>方法,对<code>{1, 2, 3, 4, 5}</code>建树,可以得到这样的一棵完全二叉树。</p><p>若我们希望得到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>b</mi><mo separator="true">,</mo><mi>e</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ b,e\right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">b</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">e</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>的区间和,流程如下:</p><ul><li><ol><li>将目前区间<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>s</mi><mo separator="true">,</mo><mi>t</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ s,t\right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">t</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>设置为<strong>整个区间</strong>;</li></ol></li><li><ol start="2"><li>目前区间是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>b</mi><mo separator="true">,</mo><mi>e</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ b,e\right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">b</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">e</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>的子区间吗?如果是,返回目前区间的区间和;如果不是且<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>b</mi><mo separator="true">,</mo><mi>e</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ b,e\right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">b</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">e</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>与目前区间<strong>有交区间</strong>,继续。</li></ol></li><li><ol start="3"><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>i</mi><mi>d</mi><mo>=</mo><mfrac><mrow><mi>s</mi><mo>+</mo><mi>t</mi></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">mid=\frac{s+t}{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.169556em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.824556em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">s</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight">t</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>,由此将<strong>目前区间</strong>划分为左区间(左子树;右子树同理)<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>s</mi><mo separator="true">,</mo><mi>m</mi><mi>i</mi><mi>d</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ s,mid\right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>与右区间<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>m</mi><mi>i</mi><mi>d</mi><mo>+</mo><mn>1</mn><mo separator="true">,</mo><mi>t</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[mid+1,t]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">t</span><span class="mclose">]</span></span></span></span>;</li></ol></li><li><ol start="4"><li>递归查找左区间与右区间,返回左区间返回值与右区间返回值之和。</li></ol></li></ul><p>这样可以方便快速地将待查区间划分为尽可能大的不同区间,而这些区间的区间和已经被储存,就不需要遍历以获取区间和了。</p><p>代码如下:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//是SegTree的成员函数</span><br><span class="hljs-function">T <span class="hljs-title">query</span><span class="hljs-params">(<span class="hljs-type">size_t</span> node, <span class="hljs-type">size_t</span> begin_now, <span class="hljs-type">size_t</span> end_now, <span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end)</span> </span>{<br><span class="hljs-keyword">if</span>(begin_now > end || end_now < begin) <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; <span class="hljs-comment">//不在查找范围内,返回0</span><br><span class="hljs-keyword">if</span>(begin_now >= begin && end_now <= end) <span class="hljs-keyword">return</span> datas[node]; <span class="hljs-comment">//目前区间是目标区间的子区间,返回区间和</span><br><br><span class="hljs-type">size_t</span> mid = (begin_now + end_now) / <span class="hljs-number">2</span>;<br>T left_res = <span class="hljs-built_in">query</span>(node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>, begin_now, mid, begin, end); <span class="hljs-comment">//左区间</span><br>T right_res = <span class="hljs-built_in">query</span>(node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>, mid + <span class="hljs-number">1</span>, end_now, begin, end); <span class="hljs-comment">//右区间</span><br><span class="hljs-keyword">return</span> left_res + right_res;<br>}<br></code></pre></td></tr></table></figure><p>调用时使用<code>this->query(0, 0, length - 1, b, e)</code>即可。</p><h3 id="修改"><a class="markdownIt-Anchor" href="#修改"></a> 修改</h3><p>利用懒惰标记即可,这里的懒惰标记表明“这个区间内的所有元素都应当加上懒惰标记”。</p><p>换句话说,你会发现懒惰标记与线段树的大小与结构一模一样。对于节点<code>node</code>,其懒惰标记就存在<code>lazy_markers[node]</code>里。</p><p>因此流程实际上与求区间和是一模一样的:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//是SegTree的成员函数</span><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">update</span><span class="hljs-params">(<span class="hljs-type">size_t</span> node, <span class="hljs-type">size_t</span> begin_now, <span class="hljs-type">size_t</span> end_now, <span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end, T value)</span> </span>{<br><span class="hljs-keyword">if</span>(begin_now > end || end_now < begin) <span class="hljs-keyword">return</span>;<br><span class="hljs-keyword">if</span>(begin_now >= begin && end_now <= end) {<br>datas[node] += (end_now - begin_now + <span class="hljs-number">1</span>) * value; <span class="hljs-comment">//区间和增加</span><br><span class="hljs-keyword">if</span>(begin_now != end_now) {<br>lazy_markers[node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>] += value; <span class="hljs-comment">//设置左右区间的懒惰标记(即整个区间)</span><br>lazy_markers[node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>] += value;<br>}<br><span class="hljs-keyword">return</span>;<br>}<br><br><span class="hljs-type">size_t</span> mid = (begin_now + end_now) / <span class="hljs-number">2</span>;<br><span class="hljs-built_in">update</span>(node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>, begin_now, mid, begin, end, value); <span class="hljs-comment">//左区间</span><br><span class="hljs-built_in">update</span>(node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>, mid + <span class="hljs-number">1</span>, end_now, begin, end, value); <span class="hljs-comment">//右区间</span><br>datas[node] = datas[node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>] + datas[node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>]; <span class="hljs-comment">//当前区间</span><br>}<br></code></pre></td></tr></table></figure><p>为了应用懒惰标记,我们也需要一个方法,这个方法将当前节点的懒惰标记加载当前节点的值上,然后设置其左右子节点的懒惰标记(<strong>传递懒惰标记</strong>)</p><p>那就写呗:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//是SegTree的成员函数</span><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">push</span><span class="hljs-params">(<span class="hljs-type">size_t</span> node, <span class="hljs-type">size_t</span> begin_now, <span class="hljs-type">size_t</span> end_now)</span> </span>{ <span class="hljs-comment">//在使用时传递区间大小</span><br><span class="hljs-keyword">if</span>(lazy_markers[node] != <span class="hljs-number">0</span>) { <span class="hljs-comment">//需要更新</span><br>datas[node] += (end_now - begin_now + <span class="hljs-number">1</span>) * lazy_markers[node];<br><span class="hljs-keyword">if</span>(begin_now != end_now) { <span class="hljs-comment">//不是叶节点</span><br>lazy_markers[<span class="hljs-number">2</span> * node + <span class="hljs-number">1</span>] += lazy_markers[node];<br>lazy_markers[<span class="hljs-number">2</span> * node + <span class="hljs-number">2</span>] += lazy_markers[node];<br>}<br>lazy_markers[node] = <span class="hljs-number">0</span>; <span class="hljs-comment">//释放</span><br>}<br>}<br></code></pre></td></tr></table></figure><p>你会发现这个操作是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mrow><mo fence="true">(</mo><mn>1</mn><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">O\left(1 \right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">(</span><span class="mord">1</span><span class="mclose delimcenter" style="top:0em;">)</span></span></span></span></span>的。</p><p>Without thinking twice,在每次<code>query</code>与<code>update</code>以前调用即可。</p><h3 id="比较-2"><a class="markdownIt-Anchor" href="#比较-2"></a> 比较</h3><p>不像分块那么复杂,只需要修改维护<code>datas</code>的规则,我们就可以轻松进行对最小/最大值的查询。</p><p>当前对<code>datas</code>的维护规则是:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi><mi>s</mi><mrow><mo fence="true">[</mo><mi>i</mi><mo fence="true">]</mo></mrow><mo>=</mo><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi><mi>s</mi><mrow><mo fence="true">[</mo><mn>2</mn><mi>i</mi><mo>+</mo><mn>1</mn><mo fence="true">]</mo></mrow><mo>+</mo><mi>d</mi><mi>a</mi><mi>t</mi><mi>a</mi><mi>s</mi><mrow><mo fence="true">[</mo><mn>2</mn><mi>i</mi><mo>+</mo><mn>2</mn><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">datas\left[i \right]=datas\left[2i+1 \right]+datas\left[2i+2 \right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">d</span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">a</span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">i</span><span class="mclose delimcenter" style="top:0em;">]</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">d</span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">a</span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord">2</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose delimcenter" style="top:0em;">]</span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">d</span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">a</span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord">2</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">2</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>,将<code>sum</code>改为<code>min</code>或者<code>max</code>即可得到最值。(懒惰标记的维护不变)</p><p>代码就不放了。</p><h3 id="例题-2"><a class="markdownIt-Anchor" href="#例题-2"></a> 例题</h3><p>来一道模板吧!</p><p>题目来自洛谷<a href="https://www.luogu.com.cn/problem/P3372">P3372 【模板】线段树 1</a></p><h4 id="题目描述-2"><a class="markdownIt-Anchor" href="#题目描述-2"></a> 题目描述</h4><p>如题,已知一个数列,你需要进行下面两种操作:</p><ul><li>将某区间每一个数加上<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>。</li><li>求出某区间每一个数的和。</li></ul><h4 id="输入格式-2"><a class="markdownIt-Anchor" href="#输入格式-2"></a> 输入格式</h4><p>第一行包含两个整数<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mo separator="true">,</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">m,n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">m</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">n</span></span></span></span>,分别表示该数列数字的个数和操作的总个数。</p><p>第二行包含<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span></span></span></span>个用空格分隔的整数,其中第<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>个数字表示数列第<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>项的初始值。</p><p>接下来<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">m</span></span></span></span>行每行包含<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">3</span></span></span></span>或<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">4</span></span></span></span>个整数,表示一个操作,具体如下:</p><ul><li><code>1 x y k</code> 将区间<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ x,y\right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>内每个数加上<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span></li><li><code>2 x y</code> 输出区间<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">[</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\left[ x,y\right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;">[</span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose delimcenter" style="top:0em;">]</span></span></span></span></span>内每个数的和</li></ul><h4 id="输出格式-2"><a class="markdownIt-Anchor" href="#输出格式-2"></a> 输出格式</h4><p>输出包含若干行整数,即为所有操作 2 的结果。</p><h4 id="输入样例-2"><a class="markdownIt-Anchor" href="#输入样例-2"></a> 输入样例</h4><figure class="highlight shell"><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></pre></td><td class="code"><pre><code class="hljs shell">5 5<br>1 5 4 2 3<br>2 2 4<br>1 2 3 2<br>2 3 4<br>1 1 5 1<br>2 1 4<br></code></pre></td></tr></table></figure><h4 id="输出样例-2"><a class="markdownIt-Anchor" href="#输出样例-2"></a> 输出样例</h4><figure class="highlight shell"><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><code class="hljs shell">11<br>8<br>20<br></code></pre></td></tr></table></figure><h4 id="题解-2"><a class="markdownIt-Anchor" href="#题解-2"></a> 题解</h4><p>套!!!模!!!板!!!</p><p>注!!!意!!!开!!!<code>long long</code>!!!</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><bits/stdc++.h></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-keyword">template</span> <<span class="hljs-keyword">class</span> <span class="hljs-title class_">T</span>><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">SegTree</span> {<br>vector<T> datas;<br>vector<T> lazy_markers;<br><span class="hljs-type">size_t</span> length;<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">build</span><span class="hljs-params">(vector<T> &d, <span class="hljs-type">size_t</span> node, <span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end)</span> </span>{<br> <span class="hljs-keyword">if</span>(begin == end) {<br> datas[node] = d[begin];<br> }<br> <span class="hljs-keyword">else</span> {<br> <span class="hljs-type">size_t</span> mid = (begin + end) / <span class="hljs-number">2</span>;<br> <span class="hljs-built_in">build</span>(d, node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>, begin, mid);<br> <span class="hljs-built_in">build</span>(d, node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>, mid + <span class="hljs-number">1</span>, end);<br> datas[node] = datas[node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>] + datas[node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>];<br> }<br> }<br> <br> <span class="hljs-function">T <span class="hljs-title">query</span><span class="hljs-params">(<span class="hljs-type">size_t</span> node, <span class="hljs-type">size_t</span> begin_now, <span class="hljs-type">size_t</span> end_now, <span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end)</span> </span>{<br> <span class="hljs-built_in">push</span>(node, begin_now, end_now);<br> <span class="hljs-keyword">if</span>(begin_now > end || end_now < begin) <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br> <span class="hljs-keyword">if</span>(begin_now >= begin && end_now <= end) <span class="hljs-keyword">return</span> datas[node];<br><br> <span class="hljs-type">size_t</span> mid = (begin_now + end_now) / <span class="hljs-number">2</span>;<br> T left_res = <span class="hljs-built_in">query</span>(node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>, begin_now, mid, begin, end);<br> T right_res = <span class="hljs-built_in">query</span>(node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>, mid + <span class="hljs-number">1</span>, end_now, begin, end);<br> <span class="hljs-keyword">return</span> left_res + right_res;<br> }<br> <br> <span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">update</span><span class="hljs-params">(<span class="hljs-type">size_t</span> node, <span class="hljs-type">size_t</span> begin_now, <span class="hljs-type">size_t</span> end_now, <span class="hljs-type">size_t</span> begin, <span class="hljs-type">size_t</span> end, T value)</span> </span>{<br> <span class="hljs-built_in">push</span>(node, begin_now, end_now);<br> <span class="hljs-keyword">if</span>(begin_now > end || end_now < begin) <span class="hljs-keyword">return</span>;<br> <span class="hljs-keyword">if</span>(begin_now >= begin && end_now <= end) {<br> datas[node] += (end_now - begin_now + <span class="hljs-number">1</span>) * value;<br> <span class="hljs-keyword">if</span>(begin_now != end_now) {<br> lazy_markers[node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>] += value;<br> lazy_markers[node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>] += value;<br> }<br> <span class="hljs-keyword">return</span>;<br> }<br><br> <span class="hljs-type">size_t</span> mid = (begin_now + end_now) / <span class="hljs-number">2</span>;<br> <span class="hljs-built_in">update</span>(node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>, begin_now, mid, begin, end, value);<br> <span class="hljs-built_in">update</span>(node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>, mid + <span class="hljs-number">1</span>, end_now, begin, end, value);<br> datas[node] = datas[node * <span class="hljs-number">2</span> + <span class="hljs-number">1</span>] + datas[node * <span class="hljs-number">2</span> + <span class="hljs-number">2</span>];<br> }<br> <br> <span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">push</span><span class="hljs-params">(<span class="hljs-type">size_t</span> node, <span class="hljs-type">size_t</span> begin_now, <span class="hljs-type">size_t</span> end_now)</span> </span>{<br> <span class="hljs-keyword">if</span>(lazy_markers[node] != <span class="hljs-number">0</span>) {<br> datas[node] += (end_now - begin_now + <span class="hljs-number">1</span>) * lazy_markers[node];<br> <span class="hljs-keyword">if</span>(begin_now != end_now) {<br> lazy_markers[<span class="hljs-number">2</span> * node + <span class="hljs-number">1</span>] += lazy_markers[node];<br> lazy_markers[<span class="hljs-number">2</span> * node + <span class="hljs-number">2</span>] += lazy_markers[node];<br> }<br> lazy_markers[node] = <span class="hljs-number">0</span>;<br> }<br> }<br> <br> <span class="hljs-keyword">public</span>:<br> <span class="hljs-built_in">SegTree</span>(vector<T> &d) {<br> datas.<span class="hljs-built_in">clear</span>();<br> lazy_markers.<span class="hljs-built_in">clear</span>();<br> length = d.<span class="hljs-built_in">size</span>();<br> <br> datas.<span class="hljs-built_in">resize</span>(length * <span class="hljs-number">4</span>);<br> lazy_markers.<span class="hljs-built_in">resize</span>(length * <span class="hljs-number">4</span>, <span class="hljs-number">0</span>);<br> <br> <span class="hljs-built_in">build</span>(d, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, length - <span class="hljs-number">1</span>);<br> }<br> <br> <span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">update</span><span class="hljs-params">(<span class="hljs-type">size_t</span> l, <span class="hljs-type">size_t</span> r, T value)</span> </span>{<br> <span class="hljs-built_in">update</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, length - <span class="hljs-number">1</span>, l, r, value);<br> }<br><br> <span class="hljs-function">T <span class="hljs-title">query</span><span class="hljs-params">(<span class="hljs-type">size_t</span> l, <span class="hljs-type">size_t</span> r)</span> </span>{<br> <span class="hljs-keyword">return</span> <span class="hljs-built_in">query</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, length - <span class="hljs-number">1</span>, l, r);<br> }<br>};<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">long</span> <span class="hljs-type">long</span> n, m;<br> cin >> n >> m;<br><br> <span class="hljs-function">vector<<span class="hljs-type">long</span> <span class="hljs-type">long</span>> <span class="hljs-title">data</span><span class="hljs-params">(n)</span></span>;<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">long</span> <span class="hljs-type">long</span> &in : data) {<br> cin >> in;<br> }<br><br> <span class="hljs-function">SegTree<<span class="hljs-type">long</span> <span class="hljs-type">long</span>> <span class="hljs-title">tree</span><span class="hljs-params">(data)</span></span>;<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">long</span> <span class="hljs-type">long</span> turn = <span class="hljs-number">0</span>; turn < m; turn++) {<br> <span class="hljs-type">long</span> <span class="hljs-type">long</span> opt;<br> cin >> opt;<br><br> <span class="hljs-keyword">if</span>(opt == <span class="hljs-number">1</span>) {<br> <span class="hljs-type">long</span> <span class="hljs-type">long</span> x, y, k;<br> cin >> x >> y >> k;<br> x--;<br> y--;<br> tree.<span class="hljs-built_in">update</span>(x, y, k);<br> } <span class="hljs-keyword">else</span> {<br> <span class="hljs-type">long</span> <span class="hljs-type">long</span> x, y;<br> cin >> x >> y;<br> x--;<br> y--;<br> cout << tree.<span class="hljs-built_in">query</span>(x, y) << endl;<br> }<br> }<br><br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>把全站所有小节标题由<code>h3</code>改成<code>h2</code>了,其它依次上升。</p><p>主要是<code>h5</code>比正文还小了。</p><p>以及总算是一知半解(?)地弄会了线段树。</p><p>这下可以做绿题(?)了哈哈。</p><h2 id="注释"><a class="markdownIt-Anchor" href="#注释"></a> 注释</h2><section class="footnotes"><div class="footnote-list"><ol><li><span id="fn:1" class="footnote-text"><span>本文内的除法均为整数除法。<a href="#fnref:1" rev="footnote" class="footnote-backref"> ↩</a></span></span></li></ol></div></section>]]></content>
<summary type="html"><p>继续备赛CSP-S,这次解决一下此前让人<span class="heimu" title="你知道的太多了">只有我</span>闻之色变的线段树。</p>
<p>当然,在此之前,先来看看比较简单的分块。</p></summary>
<category term="编程" scheme="https://www.ordchaos.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="cpp" scheme="https://www.ordchaos.com/tags/cpp/"/>
</entry>
<entry>
<title>学习笔记——STL模板库之数据结构</title>
<link href="https://www.ordchaos.com/posts/8752b65a/"/>
<id>https://www.ordchaos.com/posts/8752b65a/</id>
<published>2024-08-01T16:09:08.000Z</published>
<updated>2024-08-01T16:09:08.000Z</updated>
<content type="html"><![CDATA[<p>如题,CSP-S备赛中,复习一下STL库的用法节省时间。</p><span id="more"></span><p>内容不会太详细到原理,只知道用法就好。</p><h2 id="向量vector"><a class="markdownIt-Anchor" href="#向量vector"></a> 向量(Vector)</h2><h3 id="介绍"><a class="markdownIt-Anchor" href="#介绍"></a> 介绍</h3><ul><li>向量是STL中的一种动态数组,索引(下标)从0开始。</li><li>向量使用连续的内存块来存储元素,这使得它们在访问和迭代方面非常高效。</li><li>使用向量类型前,需要引入<code>vector</code>头文件</li></ul><h3 id="操作"><a class="markdownIt-Anchor" href="#操作"></a> 操作</h3><p>使用以下代码创建存储<code>type</code>类型变量,名为<code>vec</code>的向量:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">std::vector<type> vec; <span class="hljs-comment">//其中没有任何元素</span><br></code></pre></td></tr></table></figure><p>当然,可以进行更细致的初始化:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-function">std::vector<<span class="hljs-type">int</span>> <span class="hljs-title">v1</span><span class="hljs-params">(<span class="hljs-number">10</span>)</span></span>; <span class="hljs-comment">//创建一个包含10个元素的向量,默认初始化为0</span><br><span class="hljs-function">std::vector<<span class="hljs-type">int</span>> <span class="hljs-title">v2</span><span class="hljs-params">(<span class="hljs-number">10</span>, <span class="hljs-number">5</span>)</span></span>; <span class="hljs-comment">//创建一个包含10个元素的向量,初始化为5</span><br>std::vector<<span class="hljs-type">int</span>> v3 = {<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>}; <span class="hljs-comment">//使用列表初始化</span><br></code></pre></td></tr></table></figure><p>而后,可以进行加入、插入、删除、清空、访问、获取元素数量等操作:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">struct</span> <span class="hljs-title class_">type</span> {<br> <span class="hljs-type">int</span> temp;<br> <span class="hljs-built_in">type</span>(<span class="hljs-type">int</span> t) : <span class="hljs-built_in">temp</span>(t) {}<br>};<br><br>std::vector<type> vec;<br><span class="hljs-type">int</span> var;<br><span class="hljs-type">size_t</span> offset;<br><br>vec.<span class="hljs-built_in">push_back</span>(<span class="hljs-built_in">type</span>(var)); <span class="hljs-comment">//在末尾添加一个值为var的元素</span><br>vec.<span class="hljs-built_in">emplace_back</span>(var); <span class="hljs-comment">//同上,但是不重复进行构造,使得不需要进行多余的拷贝操作,节省时间</span><br>vec.<span class="hljs-built_in">insert</span>(vec.<span class="hljs-built_in">begin</span>() + offset, <span class="hljs-built_in">type</span>(var)); <span class="hljs-comment">//在第(offset + 1)个位置插入值为var的元素,注意使用迭代器而非索引</span><br>vec.<span class="hljs-built_in">pop_back</span>(); <span class="hljs-comment">//删除最后一个元素</span><br>vec.<span class="hljs-built_in">erase</span>(vec.<span class="hljs-built_in">begin</span>() + offset); <span class="hljs-comment">//删除第(offset + 1)个位置的元素,注意同样使用迭代器而非索引</span><br>vec.<span class="hljs-built_in">clear</span>(); <span class="hljs-comment">//删除所有元素</span><br>vec[offset] <span class="hljs-comment">//访问第(offset + 1)个位置的元素</span><br>vec.<span class="hljs-built_in">size</span>(); <span class="hljs-comment">//获取元素数量</span><br></code></pre></td></tr></table></figure><h3 id="用例"><a class="markdownIt-Anchor" href="#用例"></a> 用例</h3><h4 id="题目描述"><a class="markdownIt-Anchor" href="#题目描述"></a> 题目描述</h4><p>你被邀请参加一个图书仓库管理系统的编程挑战。系统需要处理一系列指令,对图书仓库进行操作。仓库开始时为空,你需要根据以下指令类型操作图书仓库:</p><ul><li><code>A S</code> 向仓库最后添加一本名为<code>S</code>的图书。</li><li><code>D</code> 从仓库中移除最后一本图书(如果仓库非空),如果仓库为空,则输出<code>Warehouse is empty</code>。</li><li><code>C</code> 清空仓库中所有图书。</li><li><code>I X S</code> 在仓库中的第<code>X</code>个位置(从<code>1</code>开始计数)插入一本名为<code>S</code>的图书。如果<code>X</code>大于当前图书总数,将图书添加到仓库末尾。</li><li><code>Q</code> 查询并返回当前仓库中图书的总数。</li><li><code>P X</code> 输出第<code>X</code>个位置(从<code>1</code>开始计数)的图书名称。如果位置<code>X</code>超出范围,则输出<code>Invalid Position</code>。</li></ul><h4 id="输入描述"><a class="markdownIt-Anchor" href="#输入描述"></a> 输入描述</h4><p>第一行包含一个整数<code>N</code>(1≤N≤10<sup>5</sup>),表示指令的数量。<br />接下来的<code>N</code>行,每行包含一个指令,按照上述格式给出。</p><h4 id="输出描述"><a class="markdownIt-Anchor" href="#输出描述"></a> 输出描述</h4><p>对于每个查询指令(<code>Q</code>),输出当前仓库中图书的总数。<br />对于每个位置查询指令(<code>P</code>),输出该位置的图书名称或<code>Invalid Position</code>。</p><h4 id="样例输入"><a class="markdownIt-Anchor" href="#样例输入"></a> 样例输入</h4><figure class="highlight shell"><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><code class="hljs shell">10<br>D<br>A Harry Potter<br>A The Great Gatsby<br>Q<br>I 2 To Kill a Mockingbird<br>Q<br>D<br>Q<br>P 1<br>P 3<br></code></pre></td></tr></table></figure><h4 id="样例输出"><a class="markdownIt-Anchor" href="#样例输出"></a> 样例输出</h4><figure class="highlight shell"><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></pre></td><td class="code"><pre><code class="hljs shell">Warehouse is empty<br>2<br>3<br>2<br>Harry Potter<br>Invalid Position<br></code></pre></td></tr></table></figure><h4 id="题解"><a class="markdownIt-Anchor" href="#题解"></a> 题解</h4><p>没什么难度的模拟,直接写就好了。</p><p>难点不在向量,而在输入与字符串分割。</p><p>代码如下:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><bits/stdc++.h></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">int</span> command_count;<br> cin>>command_count;<br> cin.<span class="hljs-built_in">ignore</span>();<br><br> vector<string> books;<br> vector<string> log;<br><br> string command;<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>; i < command_count; i++) {<br> <span class="hljs-built_in">getline</span>(cin, command);<br> <span class="hljs-type">char</span> action = command[<span class="hljs-number">0</span>];<br> <span class="hljs-type">size_t</span> space_index, position;<br> string book_name;<br><br> <span class="hljs-keyword">switch</span>(action) {<br> <span class="hljs-keyword">case</span> <span class="hljs-string">'A'</span>:<br> book_name = command.<span class="hljs-built_in">substr</span>(<span class="hljs-number">2</span>);<br> books.<span class="hljs-built_in">push_back</span>(book_name);<br> <span class="hljs-keyword">break</span>;<br><br> <span class="hljs-keyword">case</span> <span class="hljs-string">'D'</span>:<br> <span class="hljs-keyword">if</span>(books.<span class="hljs-built_in">empty</span>()) log.<span class="hljs-built_in">push_back</span>(<span class="hljs-string">"Warehouse is empty"</span>);<br><span class="hljs-keyword">else</span> books.<span class="hljs-built_in">pop_back</span>();<br> <span class="hljs-keyword">break</span>;<br><br> <span class="hljs-keyword">case</span> <span class="hljs-string">'C'</span>:<br> books.<span class="hljs-built_in">clear</span>();<br> <span class="hljs-keyword">break</span>;<br><br> <span class="hljs-keyword">case</span> <span class="hljs-string">'Q'</span>:<br> log.<span class="hljs-built_in">push_back</span>(<span class="hljs-built_in">to_string</span>(books.<span class="hljs-built_in">size</span>()));<br> <span class="hljs-keyword">break</span>;<br><br> <span class="hljs-keyword">case</span> <span class="hljs-string">'P'</span>:<br> position = <span class="hljs-built_in">stoi</span>(command.<span class="hljs-built_in">substr</span>(<span class="hljs-number">2</span>));<br> <span class="hljs-keyword">if</span>(position <= <span class="hljs-number">0</span> || position > books.<span class="hljs-built_in">size</span>()) log.<span class="hljs-built_in">push_back</span>(<span class="hljs-string">"Invalid Position"</span>);<br> <span class="hljs-keyword">else</span> log.<span class="hljs-built_in">push_back</span>(books[position - <span class="hljs-number">1</span>]);<br> <span class="hljs-keyword">break</span>;<br><br> <span class="hljs-keyword">case</span> <span class="hljs-string">'I'</span>:<br> space_index = command.<span class="hljs-built_in">find</span>(<span class="hljs-string">' '</span>, <span class="hljs-number">2</span>);<br> position = <span class="hljs-built_in">stoi</span>(command.<span class="hljs-built_in">substr</span>(<span class="hljs-number">2</span>, space_index - <span class="hljs-number">2</span>));<br> book_name = command.<span class="hljs-built_in">substr</span>(space_index + <span class="hljs-number">1</span>);<br> <span class="hljs-keyword">if</span>(position > books.<span class="hljs-built_in">size</span>()) books.<span class="hljs-built_in">push_back</span>(book_name);<br> <span class="hljs-keyword">else</span> books.<span class="hljs-built_in">insert</span>(books.<span class="hljs-built_in">begin</span>() + position - <span class="hljs-number">1</span>, book_name);<br> <span class="hljs-keyword">break</span>;<br><br> <span class="hljs-keyword">default</span>:<br> <span class="hljs-keyword">break</span>;<br> }<br> }<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">const</span> <span class="hljs-keyword">auto</span> entry : log) {<br> cout<<entry<<endl;<br> }<br><br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><h2 id="队列queue"><a class="markdownIt-Anchor" href="#队列queue"></a> 队列(Queue)</h2><h3 id="介绍-2"><a class="markdownIt-Anchor" href="#介绍-2"></a> 介绍</h3><ul><li>队列是一种先进先出(FIFO)的数据结构。</li><li>使用队列类型前,需要引入<code>queue</code>头文件。</li></ul><h3 id="操作-2"><a class="markdownIt-Anchor" href="#操作-2"></a> 操作</h3><p>使用以下代码创建存储<code>type</code>类型变量,名为<code>q</code>的队列:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">std::queue<type> q;<br></code></pre></td></tr></table></figure><p>可以进行加入、移除、访问、获取元素数量等操作(注意没有清空,所有类型的队列都没有):</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></pre></td><td class="code"><pre><code class="hljs cpp">std::queue<<span class="hljs-type">int</span>> q;<br><span class="hljs-type">int</span> var;<br><br>q.<span class="hljs-built_in">push</span>(var); <span class="hljs-comment">// 在末尾添加一个值为var的元素</span><br>q.<span class="hljs-built_in">pop</span>(); <span class="hljs-comment">// 移除第一个元素</span><br>q.<span class="hljs-built_in">front</span>(); <span class="hljs-comment">// 访问第一个元素</span><br>q.<span class="hljs-built_in">back</span>(); <span class="hljs-comment">// 访问最后一个元素</span><br>q.<span class="hljs-built_in">empty</span>(); <span class="hljs-comment">// 判断队列是否为空</span><br>q.<span class="hljs-built_in">size</span>(); <span class="hljs-comment">// 获取元素数量</span><br></code></pre></td></tr></table></figure><h3 id="用例-2"><a class="markdownIt-Anchor" href="#用例-2"></a> 用例</h3><p>此前写过两篇关于队列实现的文章(<a href="https://www.ordchaos.com/posts/da7075f0/">C++ 数组实现队列</a>与<a href="https://www.ordchaos.com/posts/6270475f/">C++ 链表实现队列</a>),可以看看。</p><p>问题、题解可以参考其中的“解决问题”部分。</p><p>这里给出使用STL队列的题解:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><bits/stdc++.h></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> queue<<span class="hljs-type">int</span>> q;<br> <span class="hljs-type">int</span> n;<br> cin>>n;<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">1</span>;i <=n;i++) q.<span class="hljs-built_in">push</span>(i);<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">1</span>;!q.<span class="hljs-built_in">empty</span>();i++) {<br> <span class="hljs-keyword">if</span>(i%<span class="hljs-number">2</span> == <span class="hljs-number">0</span>) {<br> <span class="hljs-type">int</span> temp = q.<span class="hljs-built_in">front</span>();<br> q.<span class="hljs-built_in">pop</span>();<br> q.<span class="hljs-built_in">push</span>(temp);<br> }<br> <span class="hljs-keyword">else</span> {<br> cout<<q.<span class="hljs-built_in">front</span>()<<<span class="hljs-string">" "</span>;<br> q.<span class="hljs-built_in">pop</span>();<br> }<br> }<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><h3 id="双端队列deque"><a class="markdownIt-Anchor" href="#双端队列deque"></a> 双端队列(Deque)</h3><h4 id="介绍-3"><a class="markdownIt-Anchor" href="#介绍-3"></a> 介绍</h4><ul><li>双端队列(Deque)是一种可以在两端进行插入和删除操作的队列。</li><li>使用双端队列类型前,需要引入<code>deque</code>头文件。</li></ul><h4 id="操作-3"><a class="markdownIt-Anchor" href="#操作-3"></a> 操作</h4><p>使用以下代码创建存储<code>type</code>类型变量,名为<code>dq</code>的双端队列:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">std::deque<type> dq;<br></code></pre></td></tr></table></figure><p>同样,可以进行在两端加入、移除、访问、获取元素数量等操作:</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></pre></td><td class="code"><pre><code class="hljs cpp">std::deque<<span class="hljs-type">int</span>> dq;<br><span class="hljs-type">int</span> var;<br><br>dq.<span class="hljs-built_in">push_back</span>(var); <span class="hljs-comment">// 在末尾添加一个值为var的元素</span><br>dq.<span class="hljs-built_in">push_front</span>(var); <span class="hljs-comment">// 在开头添加一个值为var的元素</span><br>dq.<span class="hljs-built_in">pop_back</span>(); <span class="hljs-comment">// 移除最后一个元素</span><br>dq.<span class="hljs-built_in">pop_front</span>(); <span class="hljs-comment">// 移除第一个元素</span><br>dq.<span class="hljs-built_in">front</span>(); <span class="hljs-comment">// 访问第一个元素</span><br>dq.<span class="hljs-built_in">back</span>(); <span class="hljs-comment">// 访问最后一个元素</span><br>dq.<span class="hljs-built_in">empty</span>(); <span class="hljs-comment">// 判断队列是否为空</span><br>dq.<span class="hljs-built_in">size</span>(); <span class="hljs-comment">// 获取元素数量</span><br></code></pre></td></tr></table></figure><h3 id="优先队列priority-queue或堆heap"><a class="markdownIt-Anchor" href="#优先队列priority-queue或堆heap"></a> 优先队列(Priority Queue)或堆(Heap)</h3><h4 id="介绍-4"><a class="markdownIt-Anchor" href="#介绍-4"></a> 介绍</h4><ul><li>优先队列(Priority Queue)是一种每次取出具有最高优先级元素的数据结构,一般按照从大到小的顺序存储(即大根堆)。</li><li>使用优先队列类型前,需要引入<code>queue</code>头文件。</li></ul><p>更多内容可以看看这篇<a href="https://www.ordchaos.com/posts/fab451a5/">堆</a></p><h4 id="操作-4"><a class="markdownIt-Anchor" href="#操作-4"></a> 操作</h4><p>使用以下代码创建存储<code>type</code>类型变量,名为<code>pq</code>的优先队列:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">std::priority_queue<type> pq;<br></code></pre></td></tr></table></figure><p>可以进行加入、移除、访问、获取元素数量等操作:</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></pre></td><td class="code"><pre><code class="hljs cpp">std::priority_queue<<span class="hljs-type">int</span>> pq;<br><span class="hljs-type">int</span> var;<br><br>pq.<span class="hljs-built_in">push</span>(var); <span class="hljs-comment">// 插入一个值为var的元素</span><br>pq.<span class="hljs-built_in">pop</span>(); <span class="hljs-comment">// 移除具有最高优先级的元素</span><br>pq.<span class="hljs-built_in">top</span>(); <span class="hljs-comment">// 访问具有最高优先级的元素</span><br>pq.<span class="hljs-built_in">empty</span>(); <span class="hljs-comment">// 判断优先队列是否为空</span><br>pq.<span class="hljs-built_in">size</span>(); <span class="hljs-comment">// 获取元素数量</span><br></code></pre></td></tr></table></figure><p>也可以优先级,如下:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><functional></span> <span class="hljs-comment">//引入std::greater</span></span><br><br>std::priority_queue<<span class="hljs-type">int</span>, std::vector<<span class="hljs-type">int</span>>, std::greater<<span class="hljs-type">int</span>>> pq_min_heap; <span class="hljs-comment">//自定义优先级,得到小根堆</span><br></code></pre></td></tr></table></figure><p>对于自定义类型,有:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">struct</span> <span class="hljs-title class_">type</span> {<br> <span class="hljs-type">int</span> value;<br>};<br><br><span class="hljs-keyword">struct</span> <span class="hljs-title class_">compare</span> {<br> <span class="hljs-function"><span class="hljs-type">bool</span> <span class="hljs-title">operator</span><span class="hljs-params">()</span><span class="hljs-params">(<span class="hljs-type">const</span> type& a, <span class="hljs-type">const</span> type& b)</span> </span>{<br> <span class="hljs-keyword">return</span> a.value > b.value;<br> }<br>}<br><br>std::priority_queue<type, std::vector<type>, compare> <span class="hljs-comment">//自定义根据type.value决定的优先级,得到小根堆</span><br></code></pre></td></tr></table></figure><h4 id="用例-3"><a class="markdownIt-Anchor" href="#用例-3"></a> 用例</h4><p>可以查看<a href="https://www.ordchaos.com/posts/fab451a5/#%E5%BA%94%E7%94%A8">这里</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><bits/stdc++.h></span></span><br><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">int</span> n;<br> cin>>n;<br> priority_queue<<span class="hljs-type">int</span>, vector<<span class="hljs-type">int</span>>, greater<<span class="hljs-type">int</span>>> min_heap;<br> <span class="hljs-type">int</span> temp;<br><br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i=<span class="hljs-number">0</span>;i<n;i++) {<br> cin>>temp;<br> min_heap.<span class="hljs-built_in">push</span>(temp);<br> }<br><br> <span class="hljs-type">int</span> power = <span class="hljs-number">0</span>;<br> <span class="hljs-keyword">while</span>(min_heap.<span class="hljs-built_in">size</span>() > <span class="hljs-number">1</span>) {<br> <span class="hljs-type">int</span> quick1 = min_heap.<span class="hljs-built_in">top</span>();<br> min_heap.<span class="hljs-built_in">pop</span>();<br> <span class="hljs-type">int</span> quick2 = min_heap.<span class="hljs-built_in">top</span>();<br> min_heap.<span class="hljs-built_in">pop</span>();<br> <span class="hljs-type">int</span> combined = quick1 + quick2;<br> power += combined;<br> min_heap.<span class="hljs-built_in">push</span>(combined);<br> }<br><br> cout<<power<<endl;<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><h2 id="键值对map"><a class="markdownIt-Anchor" href="#键值对map"></a> 键值对(Map)</h2><h3 id="介绍-5"><a class="markdownIt-Anchor" href="#介绍-5"></a> 介绍</h3><ul><li>顾名思义,一个键与一个值一一对应,通过键快速查找值。</li><li><code>map</code>通过红黑树实现。</li><li>使用键值对类型前,需要引入<code>map</code>头文件。</li><li>对于自定义类型的键,需要重载<code><</code>操作符(键值对自带排序)。</li></ul><h3 id="操作-5"><a class="markdownIt-Anchor" href="#操作-5"></a> 操作</h3><p>使用以下代码创建键类型为<code>KeyType</code>,值类型为<code>ValueType</code>,名为<code>mp</code>的键值对:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">std::map<KeyType, ValueType> mp;<br></code></pre></td></tr></table></figure><p>可以进行插入、删除、访问、查找、获取元素数量等操作(由于键的唯一性,不支持修改操作,可以先删除再插入):</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></pre></td><td class="code"><pre><code class="hljs cpp">std::map<<span class="hljs-type">int</span>, std::string> mp; <span class="hljs-comment">//键为int,值为string</span><br><br>mp[<span class="hljs-number">1</span>] = <span class="hljs-string">"one"</span>; <span class="hljs-comment">// 插入键为1,值为"one"的元素(直接赋值,无需插入)</span><br>mp.<span class="hljs-built_in">erase</span>(<span class="hljs-number">1</span>); <span class="hljs-comment">// 删除键为1的元素</span><br>mp[<span class="hljs-number">1</span>] <span class="hljs-comment">// 访问键为1的元素</span><br>mp.<span class="hljs-built_in">find</span>(<span class="hljs-number">1</span>); <span class="hljs-comment">// 查找键为1的元素,返回一个迭代器</span><br>mp.<span class="hljs-built_in">size</span>(); <span class="hljs-comment">// 获取元素数量</span><br></code></pre></td></tr></table></figure><h3 id="哈希表版本不排序"><a class="markdownIt-Anchor" href="#哈希表版本不排序"></a> 哈希表版本/不排序</h3><h4 id="介绍-6"><a class="markdownIt-Anchor" href="#介绍-6"></a> 介绍</h4><ul><li>利用桶函数实现,相比键值对它不会排序,速度快一些。</li><li>使用上与键值对无区别(需引入<code>unordered_map</code>头文件),但内存利用率不够高。</li><li>对于自定义类型的键,需要重载哈希函数。</li></ul><h4 id="操作-6"><a class="markdownIt-Anchor" href="#操作-6"></a> 操作</h4><p>使用以下代码创建键类型为<code>KeyType</code>,值类型为<code>ValueType</code>,名为<code>ump</code>的不排序键值对:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">std::unordered_map<KeyType, ValueType> ump;<br></code></pre></td></tr></table></figure><p>对于自定义类型的键:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">struct</span> <span class="hljs-title class_">KeyType</span> {<br> <span class="hljs-type">int</span> id;<br> std::string name;<br><br> <span class="hljs-type">bool</span> <span class="hljs-keyword">operator</span>==(<span class="hljs-type">const</span> KeyType &other) <span class="hljs-type">const</span> {<br> <span class="hljs-keyword">return</span> id == other.id && name == other.name;<br> }<br>};<br><br><span class="hljs-keyword">namespace</span> std {<br> <span class="hljs-keyword">template</span><><br> <span class="hljs-keyword">struct</span> <span class="hljs-title class_">hash</span><KeyType> {<br> <span class="hljs-function">std::<span class="hljs-type">size_t</span> <span class="hljs-title">operator</span><span class="hljs-params">()</span><span class="hljs-params">(<span class="hljs-type">const</span> KeyType& k)</span> <span class="hljs-type">const</span> </span>{<br> <span class="hljs-keyword">using</span> std::hash;<br> <span class="hljs-keyword">using</span> std::<span class="hljs-type">size_t</span>;<br> <span class="hljs-keyword">using</span> std::string;<br><br> <span class="hljs-keyword">return</span> ((<span class="hljs-built_in">hash</span><<span class="hljs-type">int</span>>()(k.id)<br> ^ (<span class="hljs-built_in">hash</span><string>()(k.name) << <span class="hljs-number">1</span>)) >> <span class="hljs-number">1</span>); <span class="hljs-comment">//自定义哈希函数即可,使用任何你喜欢的算法。</span><br> }<br> };<br>}<br></code></pre></td></tr></table></figure><p>其它的不变。</p><h2 id="集合set"><a class="markdownIt-Anchor" href="#集合set"></a> 集合(Set)</h2><h3 id="介绍-7"><a class="markdownIt-Anchor" href="#介绍-7"></a> 介绍</h3><ul><li>集合是一种不包含重复元素的数据结构(集合的互斥性)。</li><li>使用集合类型前,需要引入<code>set</code>头文件。</li><li>对于自定义类型,需要重载<code><</code>操作符(集合自带排序)。</li></ul><h3 id="操作-7"><a class="markdownIt-Anchor" href="#操作-7"></a> 操作</h3><p>使用以下代码创建存储<code>type</code>类型变量,名为<code>s</code>的集合:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">std::set<type> s;<br></code></pre></td></tr></table></figure><p>可以进行插入、删除、访问、查找、获取元素数量等操作(由于集合的互斥性,不支持修改操作,可以先删除再插入):</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></pre></td><td class="code"><pre><code class="hljs cpp">std::set<<span class="hljs-type">int</span>> s;<br><br>s.<span class="hljs-built_in">insert</span>(<span class="hljs-number">1</span>); <span class="hljs-comment">// 插入元素1</span><br>s.<span class="hljs-built_in">erase</span>(<span class="hljs-number">1</span>); <span class="hljs-comment">// 删除元素1</span><br>s.<span class="hljs-built_in">find</span>(<span class="hljs-number">1</span>); <span class="hljs-comment">// 查找元素1,返回一个迭代器</span><br>s.<span class="hljs-built_in">size</span>(); <span class="hljs-comment">// 获取元素数量</span><br></code></pre></td></tr></table></figure><h3 id="哈希表版本不排序-2"><a class="markdownIt-Anchor" href="#哈希表版本不排序-2"></a> 哈希表版本/不排序</h3><h4 id="介绍-8"><a class="markdownIt-Anchor" href="#介绍-8"></a> 介绍</h4><ul><li>引用<code>unordered_set</code>以使用。</li><li>同样,速度更快,内存利用率下降。</li><li>个人感觉这个更接近于数学意义上的集合(无序性)。</li><li>对于自定义类型,需要重载<code>==</code>操作符与哈希函数。</li></ul><h4 id="操作-8"><a class="markdownIt-Anchor" href="#操作-8"></a> 操作</h4><p>使用以下代码创建存储<code>type</code>类型变量,名为<code>us</code>的不排序集合:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">std::unordered_set<type> us;<br></code></pre></td></tr></table></figure><p>对于自定义类型:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">struct</span> <span class="hljs-title class_">type</span> {<br> <span class="hljs-type">int</span> id;<br> std::string name;<br><br> <span class="hljs-type">bool</span> <span class="hljs-keyword">operator</span>==(<span class="hljs-type">const</span> type &other) <span class="hljs-type">const</span> {<br> <span class="hljs-keyword">return</span> id == other.id && name == other.name;<br> }<br>};<br><br><span class="hljs-keyword">namespace</span> std {<br> <span class="hljs-keyword">template</span><><br> <span class="hljs-keyword">struct</span> <span class="hljs-title class_">hash</span><type> {<br> <span class="hljs-function">std::<span class="hljs-type">size_t</span> <span class="hljs-title">operator</span><span class="hljs-params">()</span><span class="hljs-params">(<span class="hljs-type">const</span> type &myType)</span> <span class="hljs-type">const</span> </span>{<br> <span class="hljs-keyword">return</span> std::<span class="hljs-built_in">hash</span><<span class="hljs-type">int</span>>()(type.id) ^ std::<span class="hljs-built_in">hash</span><std::string>()(type.name);<br> }<br> };<br>}<br></code></pre></td></tr></table></figure><p>其它的不变。</p><h2 id="补充"><a class="markdownIt-Anchor" href="#补充"></a> 补充</h2><p>除了粗暴的重载,<code>unordered_map</code>与<code>unordered_set</code>都可以通过自定义的哈希函数进行构造。</p><p>参考以下内容:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">struct</span> <span class="hljs-title class_">type</span> {<br> <span class="hljs-type">int</span> a;<br> std::string b;<br><br> <span class="hljs-type">bool</span> <span class="hljs-keyword">operator</span>==(<span class="hljs-type">const</span> MyStruct &other) <span class="hljs-type">const</span> {<br> <span class="hljs-keyword">return</span> a == other.a && b == other.b;<br> }<br>};<br><br><span class="hljs-keyword">struct</span> <span class="hljs-title class_">TypeHash</span> {<br> <span class="hljs-function">std::<span class="hljs-type">size_t</span> <span class="hljs-title">operator</span><span class="hljs-params">()</span><span class="hljs-params">(<span class="hljs-type">const</span> type &s)</span> <span class="hljs-type">const</span> </span>{<br> std::<span class="hljs-type">size_t</span> h1 = std::<span class="hljs-built_in">hash</span><<span class="hljs-type">int</span>>()(s.a);<br> std::<span class="hljs-type">size_t</span> h2 = std::<span class="hljs-built_in">hash</span><std::string>()(s.b);<br> <span class="hljs-keyword">return</span> h1 ^ (h2 << <span class="hljs-number">1</span>); <span class="hljs-comment">//或者使用其他组合哈希的方法</span><br> }<br>};<br><br><span class="hljs-comment">//使用以下方法构造:</span><br>std::unordered_map<type, ValueType, TypeHash> ump;<br>std::unordered_set<type, TypeHash> us;<br></code></pre></td></tr></table></figure><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>没什么可说的……<span class="heimu" title="你知道的太多了">What can I say?</span>马上升高二了。</p><p>最后一次CSP与NOIP,加油!</p>]]></content>
<summary type="html"><p>如题,CSP-S备赛中,复习一下STL库的用法节省时间。</p></summary>
<category term="编程" scheme="https://www.ordchaos.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="cpp" scheme="https://www.ordchaos.com/tags/cpp/"/>
</entry>
<entry>
<title>使用Github Action定时重启邮件服务</title>
<link href="https://www.ordchaos.com/posts/e9c784c5/"/>
<id>https://www.ordchaos.com/posts/e9c784c5/</id>
<published>2024-02-09T18:52:38.000Z</published>
<updated>2024-02-12T21:27:30.000Z</updated>
<content type="html"><![CDATA[<p>主要是邮件服务器的容器经常崩溃,所以尝试设置定时任务来解决这个问题。</p><span id="more"></span><h2 id="情景引入"><a class="markdownIt-Anchor" href="#情景引入"></a> 情景引入</h2><p>邮件服务器性能羸弱,无法胜任设置定时任务这样的重担,所以只能用一些盘外招试试了。</p><p>有关于邮件服务器搭建,参考这篇文章:<a href="https://www.ordchaos.com/posts/3b90dbec/">自托管 E-mail ,宝宝喜欢妈妈爱</a></p><h2 id="设置-action"><a class="markdownIt-Anchor" href="#设置-action"></a> 设置 Action</h2><p>那么首先,本着轻量化的原则,新建一个仓库拿来干这种事:</p><p><img src="https://img.ordchaos.com/img/2024/02/5e1a07ea1593440507e3e0bdb6c80c3b.png" alt="" /></p><p><img src="https://img.ordchaos.com/img/2024/02/9eb9df8cc12a4331e3cb95ccc902c52a.png" alt="" /></p><p>然后切到Action页面:</p><p><img src="https://img.ordchaos.com/img/2024/02/a94c8d5c7c4026bb49bda5a0fc93e9d3.png" alt="" /></p><p>选择新建一个空白模板:</p><p><img src="https://img.ordchaos.com/img/2024/02/235b3a988d6ae333547c22e3bf7cdcc1.png" alt="" /></p><p><img src="https://img.ordchaos.com/img/2024/02/d3bc49ec763c91aa05cf79e84e4006b8.png" alt="" /></p><p>修改Action名称、内容并设置定时,参考我的:</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><code class="hljs ymal"># This is a basic workflow to help you get started with Actions<br><br>name: REMX<br><br># Controls when the workflow will run<br>on:<br> # Triggers the workflow on push or pull request events but only for the "main" branch<br> push:<br> branches: [ "main" ]<br> schedule:<br> - cron: "0 20 * * *"<br><br> # Allows you to run this workflow manually from the Actions tab<br> workflow_dispatch:<br><br># A workflow run is made up of one or more jobs that can run sequentially or in parallel<br>jobs:<br> # This workflow contains a single job called "build"<br> build:<br> # The type of runner that the job will run on<br> runs-on: ubuntu-latest<br><br> # Steps represent a sequence of tasks that will be executed as part of the job<br> steps:<br> - name: Checkout Codes<br> uses: actions/checkout@v3<br><br> - name: Restart MX Service<br> uses: garygrossgarten/github-action-ssh@release<br> with:<br> command: ./restart.sh<br> host: ${{ secrets.HOST }}<br> username: root<br> password: ${{ secrets.PASSWORD }}<br><br> - name: Finish<br> run: echo "Action Finish"<br></code></pre></td></tr></table></figure><p>SSH相关配置自行查看<a href="https://github.com/marketplace/actions/run-ssh-command">官方文档</a>,<code>restart.sh</code>内容填写重启docker指令即可。</p><p>可参考以下内容:</p><figure class="highlight shell"><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><code class="hljs shell"><span class="hljs-meta prompt_">#</span><span class="language-bash">!/bin/bash</span><br>cd /mailu<br>docker-compose down<br>docker-compose up -d<br></code></pre></td></tr></table></figure><p>保存,然后去设置Secret:</p><p><img src="https://img.ordchaos.com/img/2024/02/265d26f043a2d554f2fe8a74ad1b1e36.png" alt="" /></p><p>分别设置服务器地址、密码等即可:</p><p><img src="https://img.ordchaos.com/img/2024/02/dfc32309634675e5cb5269692da37c13.png" alt="" /></p><p>大功告成!</p><h2 id="结语"><a class="markdownIt-Anchor" href="#结语"></a> 结语</h2><p>上高中之后就没写博文了……</p><p>除夕赶出一篇博文,祝新年快乐!!!</p><p>也迟来的祝博客两周年快乐!!!</p><h2 id="2024212-更新"><a class="markdownIt-Anchor" href="#2024212-更新"></a> 2024.2.12 更新</h2><p>经评论<a href="https://alampy.com/">@极地萤火(橙子)</a>提醒,增加自动推送commit同时记录log功能。</p><p>首先,进入仓库设置:</p><p><img src="https://img.ordchaos.com/img/2024/02/c4c3600448c97ba96934e025554e40d9.png" alt="" /></p><p>选择Action选项卡:</p><p><img src="https://img.ordchaos.com/img/2024/02/6dd35d54352e8f341f6d4f21e076f78a.png" alt="" /></p><p>修改访问权限为读写:</p><p><img src="https://img.ordchaos.com/img/2024/02/9eef169d5e8f617e4f61b2da73185d6d.png" alt="" /></p><p>保存即可。</p><p>然后,修改Action内容,增加推流部分:</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><code class="hljs ymal">- name: Update log.txt<br> run: |<br> var=`date +%Y%m%d%H%M`<br> echo $var | tee -a log.txt<br><br>- name: Commit<br> run: |<br> git config --global user.name 'username'<br> git config --global user.email 'youremail@example.com'<br> git add log.txt<br> var=`date +%Y%m%d%H%M`<br> git commit -m $var<br> git push origin main<br></code></pre></td></tr></table></figure><p>记得将信息改为自己的github用户名与邮箱。</p>]]></content>
<summary type="html"><p>主要是邮件服务器的容器经常崩溃,所以尝试设置定时任务来解决这个问题。</p></summary>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/tags/%E6%95%99%E7%A8%8B/"/>
<category term="白嫖" scheme="https://www.ordchaos.com/tags/%E7%99%BD%E5%AB%96/"/>
</entry>
<entry>
<title>年中总结,及进16岁生贺</title>
<link href="https://www.ordchaos.com/posts/95bd9bb8/"/>
<id>https://www.ordchaos.com/posts/95bd9bb8/</id>
<published>2023-08-24T17:28:53.000Z</published>
<updated>2023-08-24T17:28:53.000Z</updated>
<content type="html"><![CDATA[<p>又是一年生日了,回想上次生日<span class="heimu" title="说了跟没说一样">,好像还是在上次一样</span>,那时还是在初三开学前的补课。补课放学的很早,五点就回家了。当时在超市里买了一根价值14块大洋的钟薛糕……</p><p>说起来真的像是发生在昨天。</p><h2 id="1~2月"><a class="markdownIt-Anchor" href="#1~2月"></a> 1~2月</h2><p>经过了疫情的洗礼,九年级下学期的开学总算是如期而至,但紧随而来便是对二月调考的紧张。原本武汉是只有元调、四调的,不过由于众所周知的疫情因素,元调从原定的1月4号挪到了2月21号。让我们过了一个安心的元旦和一个安心的寒假。</p><p>但该来的还是要来,二调总归也是调考,压迫感并未消失,只是转移到了一个月后。故而新学期伊始,我们就全身心投入到了复习之中。那时我的心里总会浮现出七年级刚开学时班主任在班里说的话,她告诉我们三年很短,元调很重要。初听不知话中意,而现在,已为语中人。</p><p>二调的成绩中规中矩吧,523分(523/600),随后便立下了四调要进步15分的目标。但那时我还不知道,这个目标永远没有机会达成了。</p><h2 id="3~4月"><a class="markdownIt-Anchor" href="#3~4月"></a> 3~4月</h2><p>二调完了就是四调,没什么可说的,该复习复习,该上新课上新课。伴随着一本又一本教材被翻至最后一课、最后一面,初中即将毕业的感受才开始从心中滋生。不论是Graduation还是“从这里出发”,课本中的一句句话,一段段文章都正提醒着我们即将分别的事实。</p><p>四调成绩说实话,很不好,只有508。以至于我的母亲对我这个分数不抱什么期望了,也便没有如同二调结束后那样跑前跑后地签各种约。也正因如此,已然退休的她只能在家里独自心焦,这是我的问题。</p><h2 id="5~6月"><a class="markdownIt-Anchor" href="#5~6月"></a> 5~6月</h2><p>五月有各个区自己的五调,六月便是全武汉市的中考。志愿早在五月九日便截至提交,在此之前,我终于说服了我的父母为我填写武钢三中为第一志愿。“说服”,无奈的选择,毕竟要说二调成绩勉强足够的话,四调成绩面对钢三简直就是依托答辩。但我仍然坚定的选择了这条路,算是对自己的压迫吧,同时也伴随着一股气,一股不服输的精神。</p><p>五调前举行了理化生实验考试,和八年级的地理生物一样,采用机考的形式。没什么难度,几乎全班满分通过,只有3人被扣了1分。加上由于疫情取消的体育中考,近乎就是给每个人送了80分。</p><p>六月初,抽了一个上午,我们全班在学校里拍了毕业照。学校不大,很快就走遍了整个校园。伴随着感慨,拍完室外照后回班,我们齐心协力在十分钟内办好了一面黑板报。站在黑板报前,我们拍了最后的几张照片。</p><p>中考日以前,最后一个在校日,是一个周六。老师在上午或看自习,或做最后的查漏补缺。而下午,老师开了一场动员会,给每个人发了一块粽子玩偶。既代表端午将临,亦有一举高中之意。一场班会结束,打扫完教室,离开学校,颇有一种或解脱、或不舍的情愫。</p><p><img src="https://img.ordchaos.com/img/2023/08/6099e101fa1e501ee9e50a3a1a7bf2a9.jpg" alt="" /></p><p>中考前一天,周一,下午我便前往了考点处。每个文化课老师都在考点门口,为我们一张张派发着准考证。面对那一句句叮嘱,我明白,不能当做是像以前那样的老生常谈了。</p><p>中考结束的那一天,考完历史道法的上午。连续更改了两道选择题的我放下了手中的笔,一根根地把中性笔、2B铅笔、涂卡笔以及橡皮擦、垫板、准考证装入了文具袋。走回休息室,再和全班同学及老师走出了考场。此时此刻,心中只有解脱,无暇再顾及其它。</p><p>随后就是<a href="https://www.ordchaos.com/posts/c2e7460a/">毕业旅行</a>了,很愉快的出行经历,也为初中三年画上了一个圆满的句号。</p><p><img src="https://img.ordchaos.com/img/2023/07/d2352d5a89443272b242dc2d485012cf.jpg" alt="" /></p><h2 id="7~8月"><a class="markdownIt-Anchor" href="#7~8月"></a> 7~8月</h2><p>七月一号一早,昨天刚从青岛回到家的我点进了武汉招考网,惊心动魄的输入姓名、报名号和身份证号。按下蓝色按钮的那一刻,时间仿佛凝滞。好在接下来引入眼帘的数字令我终于放下了心,614分(614/680),是我最高的一次了。</p><p>毫无疑问的被钢三录取,之后是钢三的夏令营,一直到七月二十一。食堂很美味,与同学相处得很愉快,校园环境很好,近乎无可挑剔了。</p><p><img src="https://img.ordchaos.com/img/2023/08/94e829ac385fbe31768f1ee61242fe69.jpg" alt="" /></p><p>八月,很放松的一个月,这个月一直在玩master duel和原神,开始了摆烂状态(笑)</p><p>直到今天,我的生日为止,一切都很放松。</p><h2 id="未来"><a class="markdownIt-Anchor" href="#未来"></a> 未来……</h2><p>马上就是钢三的军训了,再之后就是开学,祝我一路顺利吧!</p><p>也希望三年后的暑假能像现在一样无忧无虑。</p><p>Happy Birthday for Me!</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/08/f1d85bc861f2ece841d0a9335b8a158c.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/08/8cb70d4e7a728e4284bb74654f2a1cda.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/08/853a55642896ca6df431184a4f348297.jpg" alt="" /></div></div></div><p>顺便晒一下毕业纪念册!</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/08/e566af9ac33c10341d308ef6f57b8e04.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/08/9547b00a63868888107ab63ff5beb3d6.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/08/dd88f12c1f3f1b3df62efef0487cb224.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/08/5c82d2f53e97b62d26870ace1b70ef2a.jpg" alt="" /></div></div></div>]]></content>
<summary type="html">与初中生活告别,迈入新的人生阶段</summary>
<category term="日常" scheme="https://www.ordchaos.com/categories/%E6%97%A5%E5%B8%B8/"/>
<category term="个人" scheme="https://www.ordchaos.com/tags/%E4%B8%AA%E4%BA%BA/"/>
<category term="生日" scheme="https://www.ordchaos.com/tags/%E7%94%9F%E6%97%A5/"/>
<category term="总结" scheme="https://www.ordchaos.com/tags/%E6%80%BB%E7%BB%93/"/>
</entry>
<entry>
<title>数字生命卡开箱——来自《流浪地球II》</title>
<link href="https://www.ordchaos.com/posts/b3d3143c/"/>
<id>https://www.ordchaos.com/posts/b3d3143c/</id>
<published>2023-07-23T16:00:58.000Z</published>
<updated>2023-07-23T16:00:58.000Z</updated>
<content type="html"><![CDATA[<p>过年档的电影,看完就买了周边。历经半年,终于到手啦!哈哈!</p><span id="more"></span><p>《流浪地球II》的官方周边产品大部分都是赛凡做的。怎么说呢……我买的数字生命卡是第二批,看到很多第一批的都有程度不一的瑕疵。不过我这个就还好,没有什么大问题,看来还是有在改进运输和包装质量。</p><p>到手差不多就是这么些东西:</p><p><img src="https://img.ordchaos.com/img/2023/07/1eb5ea21897bcf46876b164f10f7e7f5.jpg" alt="" /></p><p>其它周边什么的就不多说了,重头戏还是数字生命卡。</p><h2 id="数字生命卡"><a class="markdownIt-Anchor" href="#数字生命卡"></a> 数字生命卡</h2><p>只说外观的话,看起来金属感不是很强,喷个漆观感应该会好一些,但我不会(</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/04fea4d017486394e5f4e74c65da142c.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/fdf1ef85b582bd1377910ba05c44f103.jpg" alt="" /></div></div></div><p>别的道具倒是挺还原的,比如说袋子。</p><p>别的也没什么可说的了,毕竟这也就是一个128G的U盘和一个读卡器而已。</p><h2 id="其它"><a class="markdownIt-Anchor" href="#其它"></a> 其它</h2><p>不说什么了,放几张图吧。</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/c951c925b05f52336a35e7e15d18b85f.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/4579c559da29d7b53d5ef0b661368067.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/86f32e7d676f188ec1fa9d18c3e5fb98.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/8a1f33737209f5978494e9220725d876.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/495badd6356fb1dba5fbe634fbeaca3a.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/729b18b9ed8d6bd8f2a686ff5d447819.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/ac1edd6a5369af89fdf36da162dde1ff.jpg" alt="" /></div></div></div><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>不是很好评价赛凡的产品了……</p><p>我只能说我能接受这个做工,但的确,赛凡的破事很难让我提起好感。</p><p>就这样,886!</p>]]></content>
<summary type="html"><p>过年档的电影,看完就买了周边。历经半年,终于到手啦!哈哈!</p></summary>
<category term="日常" scheme="https://www.ordchaos.com/categories/%E6%97%A5%E5%B8%B8/"/>
<category term="电影" scheme="https://www.ordchaos.com/tags/%E7%94%B5%E5%BD%B1/"/>
<category term="开箱" scheme="https://www.ordchaos.com/tags/%E5%BC%80%E7%AE%B1/"/>
<category term="科技" scheme="https://www.ordchaos.com/tags/%E7%A7%91%E6%8A%80/"/>
<category term="U盘" scheme="https://www.ordchaos.com/tags/U%E7%9B%98/"/>
<category term="周边" scheme="https://www.ordchaos.com/tags/%E5%91%A8%E8%BE%B9/"/>
</entry>
<entry>
<title>文章AI摘要?太酷啦!</title>
<link href="https://www.ordchaos.com/posts/ec8c9790/"/>
<id>https://www.ordchaos.com/posts/ec8c9790/</id>
<published>2023-07-06T16:05:00.000Z</published>
<updated>2024-08-14T18:00:00.000Z</updated>
<content type="html"><![CDATA[<p>看了HEO的<a href="https://blog.zhheo.com/p/ec57d8b2.html">如何让博客支持AI摘要,使用TianliGPT自动生成文章的AI摘要</a>,甚是手痒……整一个!</p><span id="more"></span><h2 id="前情提要"><a class="markdownIt-Anchor" href="#前情提要"></a> 前情提要</h2><p>的确,我可以直接把HEO现成的部署方案拿来用,但我是一个有追求的人(雾。事实上,直接使用这种解决方案得到的摘要栏与我博客的设计风格并不是很搭,这就要求我自己写一个前端<span class="heimu" title="你知道的太多了">后端是不可能的,这辈子也不可能的</span>。</p><p>好,开干!但首先,第一个问题出现了:我博客的设计风格本身就不太统一。首页的说说轮播和说说页面的数量统计用了fluid主题自带的info,而友链朋友圈页面又没有,直接使用了圆角矩形承载统计信息。</p><p>为了解决这个问题,我需要用一样东西代替info标签。经过再三深思熟虑,我选用圆角矩形统一替换info.</p><p>而后便有了枯燥的漫长(?)css编写时间:</p><figure class="highlight css"><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></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">div</span><span class="hljs-selector-class">.ocxqntcontainer</span> {<br> <span class="hljs-attribute">display</span>: flex;<br> <span class="hljs-attribute">align-items</span>: center;<br> <span class="hljs-attribute">justify-content</span>: center;<br> <span class="hljs-attribute">height</span>: auto;<br>}<br><br><span class="hljs-selector-tag">div</span><span class="hljs-selector-class">.ocxqnt</span> {<br> <span class="hljs-attribute">border</span>: <span class="hljs-number">1px</span> solid <span class="hljs-number">#e9e9e9</span>;<br> <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">1rem</span>;<br> <span class="hljs-attribute">padding</span>: <span class="hljs-number">1rem</span>;<br> <span class="hljs-attribute">text-align</span>: left;<br> <span class="hljs-attribute">width</span>: <span class="hljs-number">100%</span>;<br>}<br><br><span class="hljs-selector-tag">span</span><span class="hljs-selector-class">.memos-t</span> {<br> <span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span> <span class="hljs-number">1rem</span>;<br>}<br></code></pre></td></tr></table></figure><p>就这样,圆角矩形大功告成。</p><h2 id="摘要部署"><a class="markdownIt-Anchor" href="#摘要部署"></a> 摘要部署</h2><p>现在这个步骤就变得很简单了,对于我用的fluid主题,编辑<code>layout/post.ejs</code>即可,在<code>article</code>标签中,类为<code>markdown-body</code>的<code>div</code>标签之前加入以下内容:</p><figure class="highlight html"><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></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag"><<span class="hljs-name">style</span>></span><span class="language-css"></span><br><span class="language-css"> <span class="hljs-selector-tag">i</span><span class="hljs-selector-class">.icon-ordchaos-blog-robot</span>, <span class="hljs-selector-tag">span</span><span class="hljs-selector-class">.ocxq-ai-title</span> {</span><br><span class="language-css"><span class="hljs-attribute">font-weight</span>: bold;</span><br><span class="language-css"><span class="hljs-attribute">font-size</span>: <span class="hljs-number">1.2em</span>;</span><br><span class="language-css"> }</span><br><span class="language-css"></span><br><span class="language-css"> <span class="hljs-selector-tag">span</span><span class="hljs-selector-class">.ocxq-ai-warn</span> {</span><br><span class="language-css"><span class="hljs-attribute">font-weight</span>: bold;</span><br><span class="language-css"> }</span><br><span class="language-css"></span><br><span class="language-css"> <span class="hljs-selector-class">.ocxq-ai-text</span><span class="hljs-selector-class">.typing</span><span class="hljs-selector-pseudo">::after</span> {</span><br><span class="language-css"><span class="hljs-attribute">content</span>: <span class="hljs-string">"_"</span>;</span><br><span class="language-css"><span class="hljs-attribute">margin-left</span>: <span class="hljs-number">2px</span>;</span><br><span class="language-css"><span class="hljs-attribute">animation</span>: blink <span class="hljs-number">0.7s</span> infinite;</span><br><span class="language-css"> }</span><br><span class="language-css"></span><br><span class="language-css"> <span class="hljs-keyword">@keyframes</span> blink {</span><br><span class="language-css"><span class="hljs-number">50%</span> {</span><br><span class="language-css"> <span class="hljs-attribute">opacity</span>: <span class="hljs-number">0</span>;</span><br><span class="language-css">}</span><br><span class="language-css"> }</span><br><span class="language-css"></span><span class="hljs-tag"></<span class="hljs-name">style</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript"></span><br><span class="language-javascript"> <span class="hljs-keyword">let</span> tianliGPT_postSelector = <span class="hljs-string">'#board .post-content .markdown-body'</span>;</span><br><span class="language-javascript"> <span class="hljs-keyword">let</span> tianliGPT_key = <span class="hljs-string">'5Q5mpqRK5DkwT1X9Gi5e'</span>;</span><br><span class="language-javascript"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ocxqntcontainer"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ocxqnt"</span>></span><br><span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">'memos-t'</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"iconfont icon-ordchaos-blog-robot"</span>></span><span class="hljs-tag"></<span class="hljs-name">i</span>></span><span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"memos-index-space"</span>></span> <span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ocxq-ai-title"</span>></span>AI摘要<span class="hljs-tag"></<span class="hljs-name">span</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">br</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ocxq-ai-text"</span>></span><br>生成中...<br> <span class="hljs-tag"></<span class="hljs-name">span</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">br</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"ocxq-ai-warn"</span>></span>摘要由AI自动生成,仅供参考!<span class="hljs-tag"></<span class="hljs-name">span</span>></span><br><span class="hljs-tag"></<span class="hljs-name">span</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">div</span>></span><br><span class="hljs-tag"></<span class="hljs-name">div</span>></span><br><span class="hljs-tag"><<span class="hljs-name">br</span>></span><br><br><span class="hljs-comment"><!--正文部分--></span><br><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://www.ordchaos.com/js/aisummary.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br></code></pre></td></tr></table></figure><p>这里有几个问题:</p><ul><li>为什么内容在<code>id</code>为<code>memos-t</code>的<code>span</code>标签中:因为它同样套用了刚刚写好的圆角矩形,而这个圆角矩形为了适配原有的<code>memos</code>说说而要求内部文字必须拥有<code>memos-t</code>的<code>id</code>.</li><li><code>iconfont icon-ordchaos-blog-robot</code>是什么图标:我在<code>iconfont.cn</code>中取用的,因为加入了我的图标库所以拥有图标库前缀<code>icon-ordchaos-blog</code>,若也想选用的话可以直接在<code>iconfont.cn</code>搜索关键词robot找到并添加到自己的图标库</li><li>为什么不把样式代码写到css里面去:我懒</li></ul><p>最后在文件的末尾处加上对js文件的引用。</p><p>说到js,由于HEO提供的js文件中含有生成前端容器的部分,所以必须要删除这部分内容并对其做出部分修改。过程这里就不放了,实在看不懂的可以参考我改好的<span class="heimu" title="你知道的太多了">被压缩了怎么看啊</span><span class="heimu" title="你知道的太多了">自己想办法</span><span class="heimu" title="你知道的太多了">现在想看也看不到了(</span>。</p><p>而后去爱发电订阅TianliGPT并将api key填入即可。</p><h2 id="效果"><a class="markdownIt-Anchor" href="#效果"></a> 效果</h2><p><img src="https://img.ordchaos.com/img/2023/07/89262b9071f3c4db0169b20c42cc1549.png" alt="" /></p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>最开始因为不想写css而拖了好久……最终因为实在眼馋,欲望盖过了懒病才动身做完。</p><p>话说我这样改别人写好的js应该没问题吧……</p><p>那就这样,886!</p><h2 id="20240814更新"><a class="markdownIt-Anchor" href="#20240814更新"></a> 2024.08.14更新</h2><p>自己整了一个无服务器的后端,已经换上了。</p><p>详见<a href="https://www.ordchaos.com/posts/fd9dafa1/">无服务器AI摘要后端——OrdChaosGPT</a></p>]]></content>
<summary type="html"><p>看了HEO的<a href="https://blog.zhheo.com/p/ec57d8b2.html">如何让博客支持AI摘要,使用TianliGPT自动生成文章的AI摘要</a>,甚是手痒……整一个!</p></summary>
<category term="编程" scheme="https://www.ordchaos.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/tags/%E6%95%99%E7%A8%8B/"/>
<category term="javascript" scheme="https://www.ordchaos.com/tags/javascript/"/>
<category term="css" scheme="https://www.ordchaos.com/tags/css/"/>
<category term="AI" scheme="https://www.ordchaos.com/tags/AI/"/>
</entry>
<entry>
<title>哇!是毕业旅行!</title>
<link href="https://www.ordchaos.com/posts/c2e7460a/"/>
<id>https://www.ordchaos.com/posts/c2e7460a/</id>
<published>2023-07-01T16:17:37.000Z</published>
<updated>2023-07-01T16:17:37.000Z</updated>
<content type="html"><![CDATA[<p>初三毕业,结束了忙碌的一年,老师带我们全班去了青岛毕业旅行!</p><span id="more"></span><h2 id="前情提要"><a class="markdownIt-Anchor" href="#前情提要"></a> 前情提要</h2><p>武汉今年中考在六月的二十、二十一、二十二号总共三天,考完以后休息<span class="heimu" title="真相了">放纵</span>两日后,我们全班便踏上了高铁前往青岛。</p><p>怎么说呢……说是六天五夜,但武汉与青岛之间的高铁要坐8小时,所以第一天和最后一天都相当于是在高铁上玩一天手机(雾</p><h2 id="day-1-2"><a class="markdownIt-Anchor" href="#day-1-2"></a> Day 1 & 2</h2><p>我们在武汉站登车,高铁从上午十一点一直开到了晚上七点。好在酒店离高铁站很近,走路也就5分钟路程,所以我们就前往了酒店开房。</p><p>该说不说,4个人挤双人房的安排是有点逆天的。就算我们没意见,酒店也没意见?!</p><p>第二天起来吃了早饭之后我们便走路前往了海边,很近,不过不是海滩。拍了几张照,早上天气真的很差,本来是小雨的天气,结果雨越来越大,风也越来越强。但过了一会天又晴了……</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/e0ed20c3d5136cb686dc2ff3081b54db.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/a7bbb72908a3a10572038a31053a7171.jpg" alt="" /></div></div></div><p>然后就是非常晒人。</p><p>下午乘坐青岛地铁去了中山公园附近的沙滩。只能说不愧是夏天,晚上五六点仍然晴空万里。</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/c55a85172009f20dc72c0fd41657e9bc.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/d2352d5a89443272b242dc2d485012cf.jpg" alt="" /></div></div></div><p>玩水玩得非常开心,不过也仅限于在海水中跑一跑了。毕竟我可不想和部分其他同学一样弄得浑身湿透。</p><p>请同学拍了两张照!</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/1b6a0517c5cf55f13d8f6a6830682023.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/ca804f1c6d7f57b3152a85051d62eb05.jpg" alt="" /></div></div></div><h2 id="day-3"><a class="markdownIt-Anchor" href="#day-3"></a> Day 3</h2><p>走路去了圣弥勒尔大教堂,不过也没进去,就是在外面拍了几张照。</p><p><img src="https://img.ordchaos.com/img/2023/07/62238afaa48a06e6242ceafb444a9da1.jpg" alt="" /></p><p>风景很不错,宝宝喜欢妈妈爱。</p><p>以及本来还以为会碰到什么传教士什么的<span class="heimu" title="你知道的太多了">,然后我就能回一句”我信铂金龙神巴哈姆特“(大雾</span>,结果没有。</p><p>然后就去了老舍故居,看到了《骆驼祥子》相关的很多文物(?)。得亏武汉今年考的是《钢铁是怎样炼成的》,不是《骆驼祥子》<span class="heimu" title="你知道的太多了">,没有被祥子一车创si</span>。</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/30994c7fd487b6138aafaaf90d7f5110.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/78f083e6ef27e73305fdc6baa37b5581.jpg" alt="" /></div></div></div><p>然后就是坐地铁回酒店了,这次是从人民会堂到青岛站。</p><p><img src="https://img.ordchaos.com/img/2023/07/df00eee487e1d169cc131b3b6c538f55.jpg" alt="" /></p><p>下午去坐船了,不大不小的船。</p><p>我只想说,快艇我不晕,轮船我不晕,所以就是这种两者之间的会晕是吗!!!</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/e4d4c272ccd407ee49becaba89d91cb8.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/b20de0855378880fc55b6909a211982a.jpg" alt="" /></div></div></div><p>下午天气很不好,在海上飘着,外面还下大雨,甚至打雷……</p><p>坐了四小时,而后从原港口下了船,感觉像是自找了四小时的罪受,艹。</p><p>回酒店后第一时间点了外卖,不然真感觉要吐了。</p><h2 id="day-4"><a class="markdownIt-Anchor" href="#day-4"></a> Day 4</h2><p>又是地铁!这几天地铁成了我们唯一的陆上交通工具,别的旅行团都会有大巴什么的,我们没有,我们就是坐地铁(</p><p>还是人民会堂站下车,这次我们去了小青岛公园。公园环境很好,玩得很开心,甚至还去看了鱼雷洞。</p><p>以及走的时候发现了一条绿意盎然的楼梯,拍了张照,很好看(</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/a42b5ac4592e8098a0a1d8f1fa3324d3.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/030a20f9951d5cfde976f1bab86d98e2.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/6f554c8ce914078e84a3b547d185e59f.jpg" alt="" /></div></div></div><p>下午坐一号线去了台东,去了步行街吃晚饭。</p><p>兴致突然起来了,和同学一起买了地铁票进站而非使用手机app. 运气挺好,买到了不一样样式的单程票。</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/5c8d26bb74174153422278db56a1d5fe.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/00b7e4503d7ed04ec859fd458b56986a.jpg" alt="" /></div></div></div><p>下车之后全班就直接分组分头行动了。穿梭于人来人往的小吃摊中,感受到烟火气的缭绕,对于一个忙碌了一整年的初三学生来说实在是太酷啦!</p><p>买了铁板豆腐、臭豆腐、鱿鱼和青岛啤酒,香的嘞。</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/f42a14c17adccc1cae15fc5c3600546a.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/41e8972b204a1610d0aee08bf096c7e6.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/8b4e5734c0a6b66058a460d8206d0279.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/58718b4cb621cfd134f6dbec69b1eab7.jpg" alt="" /></div></div></div><p>然后去了五四广场,再之后就又回了酒店。</p><h2 id="day-5"><a class="markdownIt-Anchor" href="#day-5"></a> Day 5</h2><p>又去了海边,不过是坐地铁去的,三号线转二号线。</p><p>所以又收集(?)到了两款不一样的地铁票。</p><p>还有在五四广场同站换乘。</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/ef5c90c7f5b909f67add74d4abb55dcf.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/69344b5bfd12c4074dbb4641487d5847.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/dbe52b5998dfae665d5c6923d2939a33.jpg" alt="" /></div></div></div><p>说实话,天气真的不好,海边景色这几天也看腻了(</p><p>浅浅拍了几张照之后就坐地铁回去了,以及又收集到了一种地铁票。</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/04245b72ac38ea4a5573d8cf09aa9f46.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/5f4214fcb7818e449854e9baf0b1a0b8.jpg" alt="" /></div></div></div><p>下午老师组织看电影,一起看了端午档的《消失的她》</p><p>悬疑片嘛……不是很和我胃口,但是观感还不错。</p><p>然后就是吃完饭。老师给了每人80的预算,让分组一起吃晚饭,我就和另外三个同学一起去了海底捞。</p><p>第一次去海底捞,服务很好,很符合我的期待,价格也正常,不算很贵,起码没超预算。</p><p>点了两个菌菇和麻辣两个汤底,味道就很正常,跟我家里和父母一起煮的火锅差不多。</p><p>最后还送了一份面条,海底捞真的,我哭死(大雾</p><p>师傅的手艺很好,观赏性十足,爱了爱了。</p><p>随便贴几张图吧:</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/927d9663fbb157687f742417639ba0e7.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/5576687f8e9c71df1a21514fc763d10e.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/ea37492473b6f9e4d469be71b8ec64f7.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/3af2025c5205e1672c02d3273c56aa51.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/fe4a159c84065a5b6b3a012e1b070d05.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/8c4470186aa87ba5f1a1ea8168207d90.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2023/07/4e56ebe5058e82bf1c3488484565c558.jpg" alt="" /></div></div></div><h2 id="day-6"><a class="markdownIt-Anchor" href="#day-6"></a> Day 6</h2><p>早起前往高铁站,赶十点的高铁。</p><p>天气阴了这么多天,结果偏偏走的时候才好,我的评价是,6.</p><p><img src="https://img.ordchaos.com/img/2023/07/f7d5e1387fe352a4e0f1a89974044fe8.jpg" alt="" /></p><p>坐的复兴号高铁,不过站台另一侧有一辆绿皮火车,于是拍了一张个人觉得很好看的照片:</p><p><img src="https://img.ordchaos.com/img/2023/07/8155c4412294c426fda908358de30667.jpg" alt="" /></p><p>然后又是玩了一天手机……</p><p>最后,晚上6点,回到武汉,与老师同学告别后回到了家,结束了这一场旅行。</p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>生活记录型的博文,尤其是这么长的,我还是第一次写,有什么不足请多多海涵!</p><p>什么?你问中考?</p><p>请观阅以下内容:</p><blockquote><p>你说的对,但是《中考》是由武汉教育局自主研发的一款「互联网时代」全新开放世界冒险游戏。游戏发生在一个被称作「HappyPark」的幻想公园,在这里,被「往上提的溢水杯」选中的人将被授予「0.797g沉淀」,导引「两种酸」之力。你将扮演一位名为「有两块抹布的直径0.3m的扫地机器人」的神秘角色,在面积27m<sup>2</sup>的秘鲁考古遗址中邂逅的紫甘蓝味软糖,和百万年前出士的bright flowers化石一起,找回「简练明快,势巧形密」的家书同时,感受「尽责地爱」,且逐步发掘「点P过定线」的真相。</p></blockquote><p>怎么说呢,今年的题真的很创人。</p><p>所以……考的差一点也不要紧啦,哈哈……</p><p><strong>···</strong></p><p>啊?你真以为我考砸了?</p><p><img src="https://img.ordchaos.com/img/2023/07/6f09b89f5c261a0d5d0f0fa89c408ff0.png" alt="" /></p><p>886!</p>]]></content>
<summary type="html"><p>初三毕业,结束了忙碌的一年,老师带我们全班去了青岛毕业旅行!</p></summary>
<category term="日常" scheme="https://www.ordchaos.com/categories/%E6%97%A5%E5%B8%B8/"/>
<category term="日常" scheme="https://www.ordchaos.com/tags/%E6%97%A5%E5%B8%B8/"/>
<category term="旅行" scheme="https://www.ordchaos.com/tags/%E6%97%85%E8%A1%8C/"/>
</entry>
<entry>
<title>前、后与中——表达式求值</title>
<link href="https://www.ordchaos.com/posts/c9c6cb4f/"/>
<id>https://www.ordchaos.com/posts/c9c6cb4f/</id>
<published>2023-04-02T10:09:31.000Z</published>
<updated>2023-04-03T09:32:31.000Z</updated>
<content type="html"><![CDATA[<p>记录一下最近的练习程序与做法,加深记忆,也当个教程吧,毕竟赠人玫瑰手留余香(bushi</p><span id="more"></span><p>如果你不知道这些表达式分别指什么东西,可以百度一下,这里不再赘述。</p><h2 id="后缀表达式"><a class="markdownIt-Anchor" href="#后缀表达式"></a> 后缀表达式</h2><p>这个应该是最常见的了,下面讲一下实现。</p><p>首先,还是定义函数<span class="heimu" title="你知道的太多了">废话</span>:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br><span class="hljs-comment">//...</span><br>}<br></code></pre></td></tr></table></figure><p>然后,进行文件读取,可以用<code>freopen()</code>,不过我这里用的是<code>fopen()</code>:</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></pre></td><td class="code"><pre><code class="hljs cpp">FILE* stream = <span class="hljs-built_in">fopen</span>(<span class="hljs-string">"input.txt"</span>, <span class="hljs-string">"r"</span>);<br>stack<<span class="hljs-type">double</span>> nums;<br><span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br><span class="hljs-type">char</span> tstr[<span class="hljs-number">100</span>]; <span class="hljs-comment">//temp</span><br><span class="hljs-built_in">fscanf</span>(stream, <span class="hljs-string">"%s"</span>, tstr);<br><span class="hljs-keyword">if</span>(<span class="hljs-built_in">feof</span>(stream)) <span class="hljs-keyword">break</span>;<br>string input = tstr;<br><br><span class="hljs-comment">//...</span><br>}<br></code></pre></td></tr></table></figure><p>解释一下上面的程序:</p><ul><li><code>stack<double> nums</code> 这个栈后面会用到,这里先不用管</li><li><code>fscanf()</code>和<code>scanf()</code>用法一样,唯一的区别是<code>fscanf()</code>用于读取文件流中的信息而非输入流</li><li><code>feof()</code>中的参数为文件流,用于判断是否读到结尾,读到则返回真</li></ul><p>很显然,这段程序用于分别读入每一段字符,那么接下来便是判断输入了。</p><p>代码如下:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br><span class="hljs-comment">//...</span><br><br><span class="hljs-keyword">if</span>(<span class="hljs-built_in">isdigit</span>(input[<span class="hljs-number">0</span>])) {<br>nums.<span class="hljs-built_in">push</span>(<span class="hljs-built_in">atof</span>(input.<span class="hljs-built_in">c_cstr</span>()));<br>}<br><span class="hljs-keyword">else</span> {<br><span class="hljs-comment">//...</span><br>}<br>}<br></code></pre></td></tr></table></figure><p>如果输入为整数,则进入数字栈,否则开始计算。</p><p>这里使用了<code>isdigit()</code>函数,输入为<code>char</code>类型,用于判断参数是否在<code>'0'</code>与<code>'9'</code>之间。</p><p>计算过程很简单,弹出两个数字栈中的数,根据运算符计算即可:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//...</span><br><span class="hljs-keyword">else</span> {<br><span class="hljs-type">double</span> y = nums.<span class="hljs-built_in">top</span>();<br>nums.<span class="hljs-built_in">pop</span>();<br><span class="hljs-type">double</span> x = nums.<span class="hljs-built_in">top</span>();<br>nums.<span class="hljs-built_in">pop</span>();<br><br><span class="hljs-type">double</span> temp;<br><span class="hljs-keyword">switch</span>(input[<span class="hljs-number">0</span>]) {<br><span class="hljs-keyword">case</span> <span class="hljs-string">'+'</span>:<br>temp = x + y;<br><span class="hljs-keyword">break</span>;<br><br><span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:<br>temp = x - y;<br><span class="hljs-keyword">break</span>;<br><br><span class="hljs-keyword">case</span> <span class="hljs-string">'*'</span>:<br>temp = x * y;<br><span class="hljs-keyword">break</span>;<br><br><span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:<br>temp = x / y;<br><span class="hljs-keyword">break</span>;<br>}<br><br>nums.<span class="hljs-built_in">push</span>(temp);<br>}<br></code></pre></td></tr></table></figure><p>尤其要注意减法与除法的操作数与被操作数顺序,毕竟它们可没有交换律。</p><p>此时已经计算完成,结果作为栈中唯一的元素处在栈顶,直接输出即可:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-built_in">fclose</span>(stream); <span class="hljs-comment">//关文件是一个好习惯</span><br>cout<<nums.<span class="hljs-built_in">top</span>()<<endl;<br><br><span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br></code></pre></td></tr></table></figure><p>大概就是这样。</p><p>完整代码还是放一下:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span><span class="hljs-string"><bits/stdc++.h></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-function"><span class="hljs-keyword">inline</span> <span class="hljs-type">bool</span> <span class="hljs-title">is_num</span><span class="hljs-params">(string str)</span> </span>{<br><span class="hljs-keyword">if</span>(str[<span class="hljs-number">0</span>] >= <span class="hljs-string">'0'</span> && str[<span class="hljs-number">0</span>] <= <span class="hljs-string">'9'</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;<br><span class="hljs-keyword">else</span> <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;<br>}<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br>FILE* stream = <span class="hljs-built_in">fopen</span>(<span class="hljs-string">"input.txt"</span>, <span class="hljs-string">"r"</span>);<br>stack<<span class="hljs-type">double</span>> nums;<br><span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br><span class="hljs-type">char</span> tstr[<span class="hljs-number">100</span>];<br><span class="hljs-built_in">fscanf</span>(stream, <span class="hljs-string">"%s"</span>, tstr);<br><span class="hljs-keyword">if</span>(<span class="hljs-built_in">feof</span>(stream)) <span class="hljs-keyword">break</span>;<br>string input = tstr;<br><span class="hljs-keyword">if</span>(<span class="hljs-built_in">is_num</span>(input)) {<br>nums.<span class="hljs-built_in">push</span>(<span class="hljs-built_in">atof</span>(input.<span class="hljs-built_in">c_str</span>()));<br>}<br><span class="hljs-keyword">else</span> {<br><span class="hljs-type">double</span> y = nums.<span class="hljs-built_in">top</span>();<br>nums.<span class="hljs-built_in">pop</span>();<br><span class="hljs-type">double</span> x = nums.<span class="hljs-built_in">top</span>();<br>nums.<span class="hljs-built_in">pop</span>();<br><span class="hljs-type">double</span> temp;<br><span class="hljs-keyword">switch</span>(input[<span class="hljs-number">0</span>]) {<br><span class="hljs-keyword">case</span> <span class="hljs-string">'+'</span>:<br>temp = x + y;<br><span class="hljs-keyword">break</span>;<br><br><span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:<br>temp = x - y;<br><span class="hljs-keyword">break</span>;<br><br><span class="hljs-keyword">case</span> <span class="hljs-string">'*'</span>:<br>temp = x * y;<br><span class="hljs-keyword">break</span>;<br><br><span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:<br>temp = x / y;<br><span class="hljs-keyword">break</span>;<br>}<br>nums.<span class="hljs-built_in">push</span>(temp);<br>}<br>}<br><span class="hljs-built_in">fclose</span>(stream);<br>cout<<nums.<span class="hljs-built_in">top</span>()<<endl;<br><br><span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><p>输入样例:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">1 2 + 3 - <br></code></pre></td></tr></table></figure><p>输出样例:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">0<br></code></pre></td></tr></table></figure><h2 id="前缀表达式"><a class="markdownIt-Anchor" href="#前缀表达式"></a> 前缀表达式</h2><p>细心一点就能发现,它与后缀表达式几乎一样,只是顺序不同。</p><p>没错,这正是因为前、后、中缀表达式分别为表达式树的先序、后续与中序遍历。</p><p>利用这个性质,将后缀表达式的顺序稍稍更改即可得到前缀表达式求值的程序:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span><span class="hljs-string"><bits/stdc++.h></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-function"><span class="hljs-keyword">inline</span> <span class="hljs-type">bool</span> <span class="hljs-title">is_num</span><span class="hljs-params">(string str)</span> </span>{<br> <span class="hljs-keyword">if</span>(str[<span class="hljs-number">0</span>] >= <span class="hljs-string">'0'</span> && str[<span class="hljs-number">0</span>] <= <span class="hljs-string">'9'</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;<br>}<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span>{<br> FILE* stream = <span class="hljs-built_in">fopen</span>(<span class="hljs-string">"input.txt"</span>, <span class="hljs-string">"r"</span>);<br> <br> stack<<span class="hljs-type">double</span>> nums;<br> vector<string> input; <span class="hljs-comment">//存储读取数据</span><br> <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-type">char</span> tstr[<span class="hljs-number">100</span>];<br> <span class="hljs-built_in">fscanf</span>(stream, <span class="hljs-string">"%s"</span>, tstr);<br> <span class="hljs-keyword">if</span>(<span class="hljs-built_in">feof</span>(stream)) <span class="hljs-keyword">break</span>;<br> input.<span class="hljs-built_in">push_back</span>(<span class="hljs-built_in">string</span>(tstr));<br> }<br> <br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = input.<span class="hljs-built_in">size</span>() - <span class="hljs-number">1</span>;i >= <span class="hljs-number">0</span>;i--) { <span class="hljs-comment">//倒序读取</span><br> <span class="hljs-keyword">if</span>(<span class="hljs-built_in">is_num</span>(input[i])) {<br> nums.<span class="hljs-built_in">push</span>(<span class="hljs-built_in">atof</span>(input[i].<span class="hljs-built_in">c_str</span>()));<br> }<br> <span class="hljs-keyword">else</span> {<br> <span class="hljs-type">double</span> x = nums.<span class="hljs-built_in">top</span>();<br> nums.<span class="hljs-built_in">pop</span>();<br> <span class="hljs-type">double</span> y = nums.<span class="hljs-built_in">top</span>();<br> nums.<span class="hljs-built_in">pop</span>();<br> <br> <span class="hljs-type">double</span> temp;<br> <span class="hljs-keyword">switch</span>(input[i][<span class="hljs-number">0</span>]) {<br> <span class="hljs-keyword">case</span> <span class="hljs-string">'+'</span>:<br> temp = x + y;<br> <span class="hljs-keyword">break</span>;<br> <br> <span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:<br> temp = x - y;<br> <span class="hljs-keyword">break</span>;<br> <br> <span class="hljs-keyword">case</span> <span class="hljs-string">'*'</span>:<br> temp = x * y;<br> <span class="hljs-keyword">break</span>;<br> <br> <span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:<br> temp = x / y;<br> <span class="hljs-keyword">break</span>;<br> }<br> <br> nums.<span class="hljs-built_in">push</span>(temp);<br> }<br> }<br> <br> <span class="hljs-built_in">fclose</span>(stream);<br> cout<<nums.<span class="hljs-built_in">top</span>()<<endl;<br> <br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><p>改成倒序读取即可。</p><p>输入样例:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">- + 1 2 3 <br></code></pre></td></tr></table></figure><p>输出样例:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">0<br></code></pre></td></tr></table></figure><h2 id="中缀表达式"><a class="markdownIt-Anchor" href="#中缀表达式"></a> 中缀表达式</h2><p>我们最常用的表达式,处理起来却是最复杂的,因为现在需要考虑优先级与括号了。</p><p>这里有几种方法:</p><h3 id="递归"><a class="markdownIt-Anchor" href="#递归"></a> 递归</h3><p>首先,定义函数用于取多项式的因子:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">factor</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">int</span> res = <span class="hljs-number">0</span>;<br> <span class="hljs-type">char</span> c = cin.<span class="hljs-built_in">peek</span>();<br> <span class="hljs-keyword">if</span>(c == <span class="hljs-string">'('</span>) {<br> cin.<span class="hljs-built_in">get</span>();<br> res = <span class="hljs-built_in">expression</span>();<br> cin.<span class="hljs-built_in">get</span>();<br> }<br> <span class="hljs-keyword">else</span> {<br> <span class="hljs-keyword">while</span>(<span class="hljs-built_in">isdigit</span>(c)) {<br> res = <span class="hljs-number">10</span> * res + c - <span class="hljs-string">'0'</span>;<br> cin.<span class="hljs-built_in">get</span>();<br> c = cin.<span class="hljs-built_in">peek</span>();<br> }<br> }<br> <span class="hljs-keyword">return</span> res;<br>}<br></code></pre></td></tr></table></figure><p>先定义结果为0,然后判断输入。若为括号,则将其内容视为新表达式,交由马上要定义的<code>expression()</code>函数计算。否则,按位取出输入中的数即可。</p><p>顺带一提,这些代码中的<code>cin.get()</code>与<code>cin.peek()</code>尤其重要,切勿移动位置或轻易替换。至于原因,自己模拟想一下吧。</p><p>然后,计算单项式的值,代码如下:</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><code class="hljs cpp"><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">term</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">int</span> res = <span class="hljs-built_in">factor</span>();<br> <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-type">char</span> mark = cin.<span class="hljs-built_in">peek</span>();<br> <span class="hljs-keyword">if</span>(mark == <span class="hljs-string">'*'</span> || mark == <span class="hljs-string">'/'</span>) {<br> cin.<span class="hljs-built_in">get</span>();<br> <span class="hljs-type">int</span> v = <span class="hljs-built_in">factor</span>();<br> <span class="hljs-keyword">if</span>(mark == <span class="hljs-string">'*'</span>) res *= v;<br> <span class="hljs-keyword">else</span> res /= v;<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">break</span>;<br> }<br> <span class="hljs-keyword">return</span> res;<br>}<br></code></pre></td></tr></table></figure><p>先用<code>factor()</code>函数读入因子,然后循环判断该单项式是否读完。若未读完(即该因子与下一个因子间仍用乘号或除号连接)则取下一个因子并计算,否则返回该单项式的值即可。并且很显然,这样的写法就代表输入的表达式中不应当含有任何空格,也只支持整数运算(要浮点数自己改<span class="heimu" title="你知道的太多了">我不干了</span>)。</p><p>最后是整个表达式,与计算单项式基本一样:</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><code class="hljs cpp"><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">expression</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">int</span> res = <span class="hljs-built_in">term</span>();<br> <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-type">char</span> mark = cin.<span class="hljs-built_in">peek</span>();<br> <span class="hljs-keyword">if</span>(mark == <span class="hljs-string">'+'</span> || mark == <span class="hljs-string">'-'</span>) {<br> cin.<span class="hljs-built_in">get</span>();<br> <span class="hljs-type">int</span> v = <span class="hljs-built_in">term</span>();<br> <span class="hljs-keyword">if</span>(mark == <span class="hljs-string">'+'</span>) res += v;<br> <span class="hljs-keyword">else</span> res -= v;<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">break</span>;<br> }<br> <span class="hljs-keyword">return</span> res;<br>}<br></code></pre></td></tr></table></figure><p>读入单项式再计算,直到该表达式计算完毕(即<code>mark</code>取到<code>)</code>或<code>EOF</code>)</p><p>主函数其实已经一目了然了,重定向输入再调用<code>expression()</code>即可,就不写了。</p><p>输入样例:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">(28/7)/2+(8-9)<br></code></pre></td></tr></table></figure><p>输出样例:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">1<br></code></pre></td></tr></table></figure><h3 id="栈"><a class="markdownIt-Anchor" href="#栈"></a> 栈</h3><p>这里又分为两种方案:</p><h4 id="转为后前缀表达式再计算"><a class="markdownIt-Anchor" href="#转为后前缀表达式再计算"></a> 转为后/前缀表达式再计算</h4><p>这里的重点是转换的过程,逻辑整体如下(中缀->后缀):</p><ul><li>输入若为数字,直接放入输出表达式中。若为符号:<ul><li>如果符号栈为空,则放入符号栈中</li><li>如果符号栈栈顶元素优先级大于等于该符号,则出栈栈顶符号放入表达式,若此时栈顶符号优先级大于等于该符号,则重复以上流程直至小于,而后入栈该符号</li><li>如果符号栈栈顶元素优先级小于该符号,该符号入栈</li><li>如果该符号为左括号,直接入栈</li><li>如果该符号为右括号,则依次出栈符号栈栈顶元素放入表达式中,直至左括号。最后抛弃左括号与右括号</li></ul></li><li>若输入完毕,符号栈中仍有符号,则依次出栈放入表达式</li></ul><p>代码如下(转为后缀表达式):</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></pre></td><td class="code"><pre><code class="hljs cpp">map<<span class="hljs-type">char</span>, <span class="hljs-type">int</span>> markl;<br><br>markl[<span class="hljs-string">'+'</span>] = <span class="hljs-number">0</span>;<br>markl[<span class="hljs-string">'-'</span>] = <span class="hljs-number">0</span>;<br>markl[<span class="hljs-string">'*'</span>] = <span class="hljs-number">1</span>;<br>markl[<span class="hljs-string">'/'</span>] = <span class="hljs-number">1</span>;<br><br>FILE* stream = <span class="hljs-built_in">fopen</span>(<span class="hljs-string">"input.txt"</span>, <span class="hljs-string">"r"</span>);<br><br>stack<<span class="hljs-type">char</span>> marks;<br>vector<string> expression;<br><span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-type">char</span> tstr[<span class="hljs-number">100</span>];<br> <span class="hljs-built_in">fscanf</span>(stream, <span class="hljs-string">"%s"</span>, tstr);<br> <span class="hljs-keyword">if</span>(<span class="hljs-built_in">feof</span>(stream)) <span class="hljs-keyword">break</span>;<br> string input = tstr;<br> <br> <span class="hljs-keyword">if</span>(<span class="hljs-built_in">isdigit</span>(input[<span class="hljs-number">0</span>])) {<br> expression.<span class="hljs-built_in">push_back</span>(input);<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(input[<span class="hljs-number">0</span>] == <span class="hljs-string">'('</span>) {<br> marks.<span class="hljs-built_in">push</span>(<span class="hljs-string">'('</span>);<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(input[<span class="hljs-number">0</span>] == <span class="hljs-string">')'</span>) {<br> <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-keyword">if</span>(marks.<span class="hljs-built_in">top</span>() == <span class="hljs-string">'('</span>) {<br> marks.<span class="hljs-built_in">pop</span>();<br> <span class="hljs-keyword">break</span>;<br> }<br> <span class="hljs-type">char</span> t[<span class="hljs-number">2</span>] = {marks.<span class="hljs-built_in">top</span>(), <span class="hljs-string">'\0'</span>};<br> expression.<span class="hljs-built_in">push_back</span>(<span class="hljs-built_in">string</span>(t));<br> marks.<span class="hljs-built_in">pop</span>();<br> }<br> }<br> <span class="hljs-keyword">else</span> {<br> <span class="hljs-keyword">if</span>(marks.<span class="hljs-built_in">empty</span>() || marks.<span class="hljs-built_in">top</span>() == <span class="hljs-string">'('</span>) {<br> marks.<span class="hljs-built_in">push</span>(input[<span class="hljs-number">0</span>]);<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(markl[input[<span class="hljs-number">0</span>]] <= markl[marks.<span class="hljs-built_in">top</span>()]) {<br> <span class="hljs-keyword">while</span>(!marks.<span class="hljs-built_in">empty</span>() && markl[temp[<span class="hljs-number">0</span>]] <= markl[marks.<span class="hljs-built_in">top</span>()]) {<br> <span class="hljs-type">char</span> t[<span class="hljs-number">2</span>] = {marks.<span class="hljs-built_in">top</span>(), <span class="hljs-string">'\0'</span>};<br> expression.<span class="hljs-built_in">push_back</span>(<span class="hljs-built_in">string</span>(t));<br> marks.<span class="hljs-built_in">pop</span>();<br> }<br> marks.<span class="hljs-built_in">push</span>(input[<span class="hljs-number">0</span>]);<br> }<br> <span class="hljs-keyword">else</span> {<br> marks.<span class="hljs-built_in">push</span>(input[<span class="hljs-number">0</span>]);<br> }<br> }<br>}<br><br><span class="hljs-keyword">while</span>(!marks.<span class="hljs-built_in">empty</span>()) {<br><span class="hljs-type">char</span> t[<span class="hljs-number">2</span>] = {marks.<span class="hljs-built_in">top</span>(), <span class="hljs-string">'\0'</span>};<br>expression.<span class="hljs-built_in">push_back</span>(<span class="hljs-built_in">string</span>(t));<br>marks.<span class="hljs-built_in">pop</span>();<br>}<br></code></pre></td></tr></table></figure><p>和上面的逻辑完全一样,唯一要注意的是这里使用了<code>map</code>,可以理解为字典。</p><p>然后只需要计算就行,代码就不放了。</p><p>前缀表达式的逻辑与代码可以自己想想。</p><p>输入输出样例同下面。</p><h4 id="直接计算"><a class="markdownIt-Anchor" href="#直接计算"></a> 直接计算</h4><p>逻辑和转换本身是一样的,只不过没有了表达式向量,而是直接计算后放入数字栈。</p><p>即将所有的对于<code>expression</code>的操作改为计算即可:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><bits/stdc++.h></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-function"><span class="hljs-type">double</span> <span class="hljs-title">calc</span><span class="hljs-params">(<span class="hljs-type">char</span> mark, <span class="hljs-type">double</span> x, <span class="hljs-type">double</span> y)</span> </span>{<br> <span class="hljs-type">double</span> temp = <span class="hljs-number">0</span>;<br> <span class="hljs-keyword">switch</span>(mark) {<br> <span class="hljs-keyword">case</span> <span class="hljs-string">'+'</span>:<br> temp = x + y;<br> <span class="hljs-keyword">break</span>;<br> <br> <span class="hljs-keyword">case</span> <span class="hljs-string">'-'</span>:<br> temp = x - y;<br> <span class="hljs-keyword">break</span>;<br> <br> <span class="hljs-keyword">case</span> <span class="hljs-string">'*'</span>:<br> temp = x * y;<br> <span class="hljs-keyword">break</span>;<br> <br> <span class="hljs-keyword">case</span> <span class="hljs-string">'/'</span>:<br> temp = x / y;<br> <span class="hljs-keyword">break</span>;<br> }<br><br> <span class="hljs-keyword">return</span> temp;<br>}<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> FILE* stream = <span class="hljs-built_in">fopen</span>(<span class="hljs-string">"input.txt"</span>, <span class="hljs-string">"r"</span>);<br><br> map<<span class="hljs-type">char</span>, <span class="hljs-type">int</span>> markl;<br> markl[<span class="hljs-string">'+'</span>] = <span class="hljs-number">0</span>;<br> markl[<span class="hljs-string">'-'</span>] = <span class="hljs-number">0</span>;<br> markl[<span class="hljs-string">'*'</span>] = <span class="hljs-number">1</span>;<br> markl[<span class="hljs-string">'/'</span>] = <span class="hljs-number">1</span>;<br><br> stack<<span class="hljs-type">char</span>> marks;<br> stack<<span class="hljs-type">double</span>> nums;<br> <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-type">char</span> tstr[<span class="hljs-number">100</span>];<br> <span class="hljs-built_in">fscanf</span>(stream, <span class="hljs-string">"%s"</span>, tstr);<br> <span class="hljs-keyword">if</span>(<span class="hljs-built_in">feof</span>(stream)) <span class="hljs-keyword">break</span>;<br> string temp = tstr;<br><br> <span class="hljs-keyword">if</span>(<span class="hljs-built_in">isdigit</span>(temp[<span class="hljs-number">0</span>])) {<br> nums.<span class="hljs-built_in">push</span>(<span class="hljs-built_in">atof</span>(temp.<span class="hljs-built_in">c_str</span>()));<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(temp[<span class="hljs-number">0</span>] == <span class="hljs-string">'('</span>) {<br> marks.<span class="hljs-built_in">push</span>(<span class="hljs-string">'('</span>);<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(temp[<span class="hljs-number">0</span>] == <span class="hljs-string">')'</span>) {<br> <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-keyword">if</span>(marks.<span class="hljs-built_in">top</span>() == <span class="hljs-string">'('</span>) {<br> marks.<span class="hljs-built_in">pop</span>();<br> <span class="hljs-keyword">break</span>;<br> }<br><br> <span class="hljs-type">double</span> y = nums.<span class="hljs-built_in">top</span>();<br> nums.<span class="hljs-built_in">pop</span>();<br> <span class="hljs-type">double</span> x = nums.<span class="hljs-built_in">top</span>();<br> nums.<span class="hljs-built_in">pop</span>();<br> nums.<span class="hljs-built_in">push</span>(<span class="hljs-built_in">calc</span>(marks.<span class="hljs-built_in">top</span>(), x, y));<br><br> marks.<span class="hljs-built_in">pop</span>();<br> }<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(marks.<span class="hljs-built_in">empty</span>() || marks.<span class="hljs-built_in">top</span>() == <span class="hljs-string">'('</span>) {<br> marks.<span class="hljs-built_in">push</span>(temp[<span class="hljs-number">0</span>]);<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(markl[temp[<span class="hljs-number">0</span>]] <= markl[marks.<span class="hljs-built_in">top</span>()]) {<br> <span class="hljs-keyword">while</span>(!marks.<span class="hljs-built_in">empty</span>() && markl[temp[<span class="hljs-number">0</span>]] <= markl[marks.<span class="hljs-built_in">top</span>()]) {<br> <span class="hljs-type">double</span> y = nums.<span class="hljs-built_in">top</span>();<br> nums.<span class="hljs-built_in">pop</span>();<br> <span class="hljs-type">double</span> x = nums.<span class="hljs-built_in">top</span>();<br> nums.<span class="hljs-built_in">pop</span>();<br> nums.<span class="hljs-built_in">push</span>(<span class="hljs-built_in">calc</span>(marks.<span class="hljs-built_in">top</span>(), x, y));<br><br> marks.<span class="hljs-built_in">pop</span>();<br> }<br> marks.<span class="hljs-built_in">push</span>(temp[<span class="hljs-number">0</span>]);<br> }<br> <span class="hljs-keyword">else</span> {<br> marks.<span class="hljs-built_in">push</span>(temp[<span class="hljs-number">0</span>]);<br> }<br> }<br><br> <span class="hljs-keyword">while</span>(!marks.<span class="hljs-built_in">empty</span>()) {<br> <span class="hljs-type">double</span> y = nums.<span class="hljs-built_in">top</span>();<br> nums.<span class="hljs-built_in">pop</span>();<br> <span class="hljs-type">double</span> x = nums.<span class="hljs-built_in">top</span>();<br> nums.<span class="hljs-built_in">pop</span>();<br> nums.<span class="hljs-built_in">push</span>(<span class="hljs-built_in">calc</span>(marks.<span class="hljs-built_in">top</span>(), x, y));<br><br> marks.<span class="hljs-built_in">pop</span>();<br> }<br><br><span class="hljs-built_in">fclose</span>(stream);<br><br> cout<<nums.<span class="hljs-built_in">top</span>()<<endl;<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><p>输入样例:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">( 28 / 7 ) / 2 + ( 8 - 9 ) <br></code></pre></td></tr></table></figure><p>输出样例:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">1<br></code></pre></td></tr></table></figure><p>收工!</p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>这篇大概是我最长的纯原创技术类博文了。。。。。。</p><p>好累QAQ</p><p>下次再见啦!886!</p><h3 id="20230403更新"><a class="markdownIt-Anchor" href="#20230403更新"></a> 2023.04.03更新</h3><p>让ChatGPT改了一个支持浮点数的递归版本:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><iostream></span></span><br><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><cstdlib></span></span><br><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><cstdio></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">print_tab</span><span class="hljs-params">(<span class="hljs-type">int</span>)</span></span>;<br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">print_log</span><span class="hljs-params">(string, <span class="hljs-type">int</span>)</span></span>;<br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">print_log</span><span class="hljs-params">(string, <span class="hljs-type">int</span>, <span class="hljs-type">double</span>)</span></span>;<br><span class="hljs-function"><span class="hljs-type">double</span> <span class="hljs-title">expression</span><span class="hljs-params">(<span class="hljs-type">int</span>)</span></span>;<br><span class="hljs-function"><span class="hljs-type">double</span> <span class="hljs-title">term</span><span class="hljs-params">(<span class="hljs-type">int</span>)</span></span>;<br><span class="hljs-function"><span class="hljs-type">double</span> <span class="hljs-title">factor</span><span class="hljs-params">(<span class="hljs-type">int</span>)</span></span>;<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-built_in">freopen</span>(<span class="hljs-string">"input.txt"</span>, <span class="hljs-string">"r"</span>, stdin);<br> cout << <span class="hljs-built_in">expression</span>(<span class="hljs-number">0</span>) << endl;<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">print_tab</span><span class="hljs-params">(<span class="hljs-type">int</span> deep)</span> </span>{<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>;i < deep;i++) {<br> cout << <span class="hljs-string">"\t"</span>;<br> }<br> <span class="hljs-keyword">return</span>;<br>}<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">print_log</span><span class="hljs-params">(string name, <span class="hljs-type">int</span> deep)</span> </span>{<br> <span class="hljs-built_in">print_tab</span>(deep);<br> cout << name << <span class="hljs-string">" {"</span> << endl;<br> <span class="hljs-keyword">return</span>;<br>}<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">print_log</span><span class="hljs-params">(string name, <span class="hljs-type">int</span> deep, <span class="hljs-type">double</span> res)</span> </span>{<br> <span class="hljs-built_in">print_tab</span>(deep);<br> cout << <span class="hljs-string">"} -> res ="</span> << res << endl;<br> <span class="hljs-keyword">return</span>;<br>}<br><br><span class="hljs-function"><span class="hljs-type">double</span> <span class="hljs-title">expression</span><span class="hljs-params">(<span class="hljs-type">int</span> deep)</span> </span>{<br> <span class="hljs-built_in">print_log</span>(<span class="hljs-string">"expression"</span>, deep);<br><br> <span class="hljs-type">double</span> res = <span class="hljs-built_in">term</span>(deep + <span class="hljs-number">1</span>);<br> <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-type">char</span> mark = cin.<span class="hljs-built_in">peek</span>(); <span class="hljs-comment">//get</span><br> <span class="hljs-keyword">if</span>(mark == <span class="hljs-string">'+'</span> || mark == <span class="hljs-string">'-'</span>) {<br> cin.<span class="hljs-built_in">get</span>(); <span class="hljs-comment">//skip</span><br> <span class="hljs-type">double</span> v = <span class="hljs-built_in">term</span>(deep + <span class="hljs-number">1</span>);<br> <span class="hljs-keyword">if</span>(mark == <span class="hljs-string">'+'</span>) res += v;<br> <span class="hljs-keyword">else</span> res -= v;<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">break</span>;<br> }<br><br> <span class="hljs-built_in">print_log</span>(<span class="hljs-string">"expression"</span>, deep, res);<br><br> <span class="hljs-keyword">return</span> res;<br>}<br><br><span class="hljs-function"><span class="hljs-type">double</span> <span class="hljs-title">term</span><span class="hljs-params">(<span class="hljs-type">int</span> deep)</span> </span>{<br> <span class="hljs-built_in">print_log</span>(<span class="hljs-string">"term"</span>, deep);<br><br> <span class="hljs-type">double</span> res = <span class="hljs-built_in">factor</span>(deep + <span class="hljs-number">1</span>);<br> <span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>) {<br> <span class="hljs-type">char</span> mark = cin.<span class="hljs-built_in">peek</span>(); <span class="hljs-comment">//get</span><br> <span class="hljs-keyword">if</span>(mark == <span class="hljs-string">'*'</span> || mark == <span class="hljs-string">'/'</span>) {<br> cin.<span class="hljs-built_in">get</span>(); <span class="hljs-comment">//skip</span><br> <span class="hljs-type">double</span> v = <span class="hljs-built_in">factor</span>(deep + <span class="hljs-number">1</span>);<br> <span class="hljs-keyword">if</span>(mark == <span class="hljs-string">'*'</span>) res *= v;<br> <span class="hljs-keyword">else</span> res /= v;<br> }<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">break</span>;<br> }<br><br> <span class="hljs-built_in">print_log</span>(<span class="hljs-string">"term"</span>, deep, res);<br> <br> <span class="hljs-keyword">return</span> res;<br>}<br><br><span class="hljs-function"><span class="hljs-type">double</span> <span class="hljs-title">factor</span><span class="hljs-params">(<span class="hljs-type">int</span> deep)</span> </span>{<br> <span class="hljs-built_in">print_log</span>(<span class="hljs-string">"factor"</span>, deep);<br><br> <span class="hljs-type">double</span> res = <span class="hljs-number">0</span>;<br> <span class="hljs-type">double</span> base = <span class="hljs-number">1.0</span>;<br> <span class="hljs-type">char</span> c = cin.<span class="hljs-built_in">peek</span>(); <span class="hljs-comment">//get</span><br> <span class="hljs-keyword">if</span>(c == <span class="hljs-string">'('</span>) {<br> cin.<span class="hljs-built_in">get</span>(); <span class="hljs-comment">//skip</span><br> res = <span class="hljs-built_in">expression</span>(deep + <span class="hljs-number">1</span>);<br> cin.<span class="hljs-built_in">get</span>(); <span class="hljs-comment">//skip</span><br> }<br> <span class="hljs-keyword">else</span> {<br> <span class="hljs-keyword">while</span>(<span class="hljs-built_in">isdigit</span>(c) || c == <span class="hljs-string">'.'</span>) { <span class="hljs-comment">// == GET A NUMBER ==</span><br> <span class="hljs-keyword">if</span>(c == <span class="hljs-string">'.'</span>) {<br> cin.<span class="hljs-built_in">get</span>(); <span class="hljs-comment">//skip the '.'</span><br> c = cin.<span class="hljs-built_in">peek</span>(); <span class="hljs-comment">//get the next character</span><br> <span class="hljs-keyword">while</span>(<span class="hljs-built_in">isdigit</span>(c)) { <span class="hljs-comment">//collect digits for the decimal part</span><br> res = res + (c - <span class="hljs-string">'0'</span>) * (base /= <span class="hljs-number">10.0</span>);<br> cin.<span class="hljs-built_in">get</span>();<br> c = cin.<span class="hljs-built_in">peek</span>();<br> }<br> <span class="hljs-keyword">break</span>;<br> }<br> res = res * <span class="hljs-number">10</span> + c - <span class="hljs-string">'0'</span>; <span class="hljs-comment">//get num</span><br> cin.<span class="hljs-built_in">get</span>(); <span class="hljs-comment">//skip</span><br> c = cin.<span class="hljs-built_in">peek</span>(); <span class="hljs-comment">//get</span><br> }<br> }<br><br> <span class="hljs-built_in">print_tab</span>(deep + <span class="hljs-number">1</span>);<br> cout << <span class="hljs-string">"get_num();"</span> << endl;<br> <span class="hljs-built_in">print_log</span>(<span class="hljs-string">"factor"</span>, deep, res);<br><br> <span class="hljs-keyword">return</span> res;<br>}<br></code></pre></td></tr></table></figure><p>神</p>]]></content>
<summary type="html"><p>记录一下最近的练习程序与做法,加深记忆,也当个教程吧,毕竟赠人玫瑰手留余香(bushi</p></summary>
<category term="编程" scheme="https://www.ordchaos.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="cpp" scheme="https://www.ordchaos.com/tags/cpp/"/>
<category term="算法" scheme="https://www.ordchaos.com/tags/%E7%AE%97%E6%B3%95/"/>
</entry>
<entry>
<title>迟来的二月调考总结</title>
<link href="https://www.ordchaos.com/posts/7eb4319/"/>
<id>https://www.ordchaos.com/posts/7eb4319/</id>
<published>2023-03-26T10:14:38.000Z</published>
<updated>2023-03-26T10:14:38.000Z</updated>
<content type="html"><![CDATA[<p>各位,好久不见,距离上次发文的时间过的有点久,其中最大的原因就是<span class="heimu" title="你知道的太多了">万恶的</span>二月调考。现在已经考完一个多月了<span class="heimu" title="你知道的太多了">离四调也就一个月了</span>,这里我来总结一下。</p><h2 id="背景要素"><a class="markdownIt-Anchor" href="#背景要素"></a> 背景要素</h2><p>以防不知道,本人生在武汉,学籍武汉,参加武汉的统一考试。武汉在九年级时会有几场全市统考,分别为九上的元月调考(期末)与九下的四月调考(期中)和中考(期末)。今年闹疫情,于是原定在一月四号的元调被挪到了二月二十一号(九下开头)。</p><p>武汉的中考在我这一届改革了,下面对比一下以往和之后的不同:</p><table><thead><tr><th style="text-align:center">科目</th><th style="text-align:center">分数(前)</th><th style="text-align:center">分数(后)</th></tr></thead><tbody><tr><td style="text-align:center">语文</td><td style="text-align:center">120</td><td style="text-align:center">120</td></tr><tr><td style="text-align:center">数学</td><td style="text-align:center">120</td><td style="text-align:center">120</td></tr><tr><td style="text-align:center">英语</td><td style="text-align:center">120</td><td style="text-align:center">120</td></tr><tr><td style="text-align:center">物理</td><td style="text-align:center">70</td><td style="text-align:center">70</td></tr><tr><td style="text-align:center">化学</td><td style="text-align:center">50</td><td style="text-align:center">50</td></tr><tr><td style="text-align:center">历史</td><td style="text-align:center">\</td><td style="text-align:center">60</td></tr><tr><td style="text-align:center">道德与法治</td><td style="text-align:center">40</td><td style="text-align:center">60</td></tr><tr><td style="text-align:center">实验</td><td style="text-align:center">0</td><td style="text-align:center">30</td></tr><tr><td style="text-align:center">体育</td><td style="text-align:center">30</td><td style="text-align:center">50</td></tr><tr><td style="text-align:center"><strong>总分</strong></td><td style="text-align:center"><strong>550</strong></td><td style="text-align:center"><strong>680</strong></td></tr></tbody></table><p>详解:</p><ul><li>原本不考历史</li><li>道德与法治原先只有选择题,现在新加入了材料题,分数构成为<code>28分选择 + 32分材料</code>。历史分数构成与其一样,且二者合卷</li><li>实验考试以往不计分,为实操。现在为机考答卷,在120道题(40物理,40化学,40生物)中每个科目随机选10道题目作答,每题一分</li><li>体育由30分改为50分,构成为<code>15分平时 + 35分考试</code>。本届由于新冠疫情的原因,取消体育中考(即所有人考试分数计为35)</li></ul><h2 id="二调情况"><a class="markdownIt-Anchor" href="#二调情况"></a> 二调情况</h2><p>先明确二调的考试内容,为中考所有科目除去体育与实验(四调亦然)</p><p>分数不是很方便透露,大致说一下考试情况吧。说来惭愧,正正好好是语数英垮了(bushi</p><p>语文选择题眼瞎,错了两题。英语则是阅读理解B篇,神<span class="heimu" title="你知道的太多了">你以为我会说脏话吗?</span>的<code>Live a colorful life</code>,我真感觉不到这么大,真的。</p><p>总之就是很意难平。</p><p>好消息是化学满分,终于!</p><p>签约的话倒不是不能签,只能说是比上不足,比下有余余余余余…</p><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h2><p>也没什么可说的,给自己加油吧。我是想打竞赛的,文化课成绩必然需要更上一层楼才行。</p><p>886!</p><p>(鬼知道下次什么时候更新)</p>]]></content>
<summary type="html">一些自己的话</summary>
<category term="个人" scheme="https://www.ordchaos.com/categories/%E4%B8%AA%E4%BA%BA/"/>
<category term="总结" scheme="https://www.ordchaos.com/tags/%E6%80%BB%E7%BB%93/"/>
<category term="学习" scheme="https://www.ordchaos.com/tags/%E5%AD%A6%E4%B9%A0/"/>
<category term="考试" scheme="https://www.ordchaos.com/tags/%E8%80%83%E8%AF%95/"/>
</entry>
<entry>
<title>全站 webp 自动切换,加速访问好帮手</title>
<link href="https://www.ordchaos.com/posts/23e22de2/"/>
<id>https://www.ordchaos.com/posts/23e22de2/</id>
<published>2023-01-12T09:42:10.000Z</published>
<updated>2025-01-29T06:43:58.212Z</updated>
<content type="html"><![CDATA[<p>原本博客用的都是普通图片,就算有懒加载,一堆圈圈一起转也惹人心烦。现在改为了原图/webp的自适应切换,效果好上不少。</p><span id="more"></span><h2 id="前期准备"><a class="markdownIt-Anchor" href="#前期准备"></a> 前期准备</h2><p>首要任务是拿到webp格式的图片,这个看自己。像我用的vps上的<a href="https://www.lsky.pro/">Lsky Pro</a>,本地存储。有高性能vps可以试试用<a href="https://webp.sh">Webp-Server</a>配合。但我的轻量应用承受不起,遂作罢。改为了定时shell脚本,一分钟触发一次:</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta prompt_">#</span><span class="language-bash">!/bin/bash</span><br><br>find . -type f -iname "*.png" | while read file; do<br> if [ ! -f "${file%.*}.webp" ]; then<br> cwebp -q 85 "$file" -o "${file%.*}.webp"<br> fi<br>done<br><br>find . -type f -iname "*.jpg" | while read file; do<br> if [ ! -f "${file%.*}.webp" ]; then<br> cwebp -q 85 "$file" -o "${file%.*}.webp"<br> fi<br>done<br> <br>find . -type f -iname "*.jpeg" | while read file; do<br> if [ ! -f "${file%.*}.webp" ]; then<br> cwebp -q 85 "$file" -o "${file%.*}.webp"<br> fi<br>done<br> <br>find . -type f -iname "*.tif" | while read file; do<br> if [ ! -f "${file%.*}.webp" ]; then<br> cwebp -q 85 "$file" -o "${file%.*}.webp"<br> fi<br>done<br></code></pre></td></tr></table></figure><p>脚本运行时会遍历自己所在的文件夹及其子文件夹,转换所有没有对应webp格式的图片(<code>png</code>,<code>jpg</code>、<code>jpeg</code>与<code>tiff</code>)为webp图片(原图还在,放心)。</p><p>这段脚本中使用了<code>cwebp</code>指令,它来源于<code>libwebp</code>。安装可以参考下方:</p><figure class="highlight shell"><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><code class="hljs shell"><span class="hljs-meta prompt_"># </span><span class="language-bash">安装编译器以及依赖包</span><br>yum install -y gcc make autoconf automake libtool libjpeg-devel libpng-devel<br><span class="hljs-meta prompt_"># </span><span class="language-bash">请到官网下载最新版本,版本列表:https://storage.googleapis.com/downloads.webmproject.org/releases/webp/</span><br>wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.2.4.tar.gz<br><span class="hljs-meta prompt_"># </span><span class="language-bash">解压</span><br>tar -zxvf libwebp-1.2.4.tar.gz<br><span class="hljs-meta prompt_"># </span><span class="language-bash">进入目录</span><br>cd libwebp-1.2.4<br><span class="hljs-meta prompt_"># </span><span class="language-bash">源代码安装环境检查</span><br>./configure<br><span class="hljs-meta prompt_"># </span><span class="language-bash">编译</span><br>make<br><span class="hljs-meta prompt_"># </span><span class="language-bash">安装</span><br>make install<br></code></pre></td></tr></table></figure><p>安装过程中遇到问题请善用百度/Google,本人不对此负责(bushi</p><p>做好以上所有工作后,就可以开始下面的内容。</p><h2 id="service-worker"><a class="markdownIt-Anchor" href="#service-worker"></a> Service Worker</h2><h3 id="安装"><a class="markdownIt-Anchor" href="#安装"></a> 安装</h3><p>不知道是什么、如何部署的,可以看看CYF大佬的这两篇文章:</p><ul><li><a href="https://blog.eurekac.cn/p/c0af86bb.html">欲善其事,必利其器 - 论如何善用ServiceWorker</a></li><li><a href="https://blog.eurekac.cn/p/d3c51290.html">SpeedUp!使用黑科技为你的网站提速</a></li></ul><p>如果你已经部署了Service Worker就可以继续了。</p><h3 id="脚本"><a class="markdownIt-Anchor" href="#脚本"></a> 脚本</h3><p>添加一个监听器,监听<code>fetch</code>事件:</p><figure class="highlight javascript"><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><code class="hljs javascript">self.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'fetch'</span>, <span class="hljs-keyword">async</span> event => {<br> <span class="hljs-comment">//...</span><br>});<br></code></pre></td></tr></table></figure><p>(或者在本来的监听器里面加上)</p><p>然后判断流量是否是对图站的请求,可以用一个if来判断:</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">if</span>(event.<span class="hljs-property">request</span>.<span class="hljs-property">url</span>.<span class="hljs-title function_">indexOf</span>(<span class="hljs-string">'your.image.site'</span>) !== -<span class="hljs-number">1</span>) {<br> <span class="hljs-keyword">var</span> requestUrl = event.<span class="hljs-property">request</span>.<span class="hljs-property">url</span>;<br> <span class="hljs-comment">//...</span><br>}<br></code></pre></td></tr></table></figure><p><code>event.request.url</code>是请求的地址,用<code>indexOf()</code>方法来判断地址中是否包含图站地址,若不反回代表没有的-1即为是对图站的请求。</p><p>接下来判断浏览器是否支持webp图片,定义一个变量<code>supportsWebp</code></p><figure class="highlight javascript"><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></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">var</span> supportsWebp = <span class="hljs-literal">false</span>;<br><span class="hljs-keyword">if</span> (event.<span class="hljs-property">request</span>.<span class="hljs-property">headers</span>.<span class="hljs-title function_">has</span>(<span class="hljs-string">'accept'</span>)){<br>supportsWebp = event.<span class="hljs-property">request</span>.<span class="hljs-property">headers</span><br>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'accept'</span>)<br>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'webp'</span>);<br>}<br></code></pre></td></tr></table></figure><p>如果可以获取到浏览器的Accept头,且头中包含<code>image/webp</code>,即为支持webp,否则为不支持。</p><p>然后就可以进一步处理了,若浏览器支持webp,则进行下一步:</p><figure class="highlight javascript"><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></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">if</span> (supportsWebp) {<br> <span class="hljs-comment">//...</span><br>}<br><span class="hljs-keyword">else</span> {<br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"[SW] Don't support webp image, skip "</span> + requestUrl + <span class="hljs-string">" ."</span>);<br>}<br></code></pre></td></tr></table></figure><p>然后获取请求的文件类型。最开始的脚本只支持<code>png</code>,<code>jpg</code>、<code>jpeg</code>与<code>tiff</code>这四种格式的图片,所以我们也只能篡改这四种格式图片的请求到webp图片上:</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">var</span> imageUrl = requestUrl.<span class="hljs-title function_">split</span>(<span class="hljs-string">"."</span>);<br><span class="hljs-keyword">if</span>(imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>] === <span class="hljs-string">'jpg'</span> || imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>] === <span class="hljs-string">'tif'</span> || imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>] === <span class="hljs-string">'png'</span> || imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>] === <span class="hljs-string">'jpeg'</span>) {<br> <span class="hljs-keyword">var</span> newUrl = requestUrl.<span class="hljs-title function_">replace</span>(imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>], <span class="hljs-string">'webp'</span>);<br> <span class="hljs-comment">//...</span><br>}<br></code></pre></td></tr></table></figure><p><code>newUrl</code>中存储了新的请求地址,接下来对它发起请求即可:</p><figure class="highlight javascript"><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><code class="hljs javascript"><span class="hljs-keyword">var</span> newRequest = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Request</span>(newUrl);<br>event.<span class="hljs-title function_">respondWith</span>(<span class="hljs-title function_">fetch</span>(newRequest));<br><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"[SW] Redirect "</span> + requestUrl + <span class="hljs-string">" to "</span> + newUrl + <span class="hljs-string">" ."</span>);<br></code></pre></td></tr></table></figure><p>当请求完成并图片被完整下载以后,进行缓存,代码如下:</p><figure class="highlight javascript"><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><code class="hljs javascript">event.<span class="hljs-title function_">waitUntil</span>(<br><span class="hljs-title function_">fetch</span>(newRequest).<span class="hljs-title function_">then</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">response</span>) {<br><span class="hljs-keyword">if</span> (!response.<span class="hljs-property">ok</span>) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">"[SW] Failed to load image: "</span> + newUrl);<br>caches.<span class="hljs-title function_">open</span>(<span class="hljs-variable constant_">CACHE_NAME</span>).<span class="hljs-title function_">then</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">cache</span>) {<br>cache.<span class="hljs-title function_">put</span>(newRequest, response);<br>});<br>}).<span class="hljs-title function_">catch</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">error</span>) {<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(error);<br>})<br>);<br></code></pre></td></tr></table></figure><p>若获取失败则提示,成功则缓存。</p><p>最后,要打断之前的请求,避免降低速度,可以调用<code>event.stopImmediatePropagation()</code>方法打断原始请求。</p><p>最后完整代码如下:</p><figure class="highlight javascript"><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></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">if</span>(event.<span class="hljs-property">request</span>.<span class="hljs-property">url</span>.<span class="hljs-title function_">indexOf</span>(<span class="hljs-string">'img.ordchaos.com'</span>) !== -<span class="hljs-number">1</span>) {<br> <span class="hljs-keyword">var</span> requestUrl = event.<span class="hljs-property">request</span>.<span class="hljs-property">url</span>;<br> <span class="hljs-keyword">var</span> supportsWebp = <span class="hljs-literal">false</span>;<br> <span class="hljs-keyword">if</span> (event.<span class="hljs-property">request</span>.<span class="hljs-property">headers</span>.<span class="hljs-title function_">has</span>(<span class="hljs-string">'accept'</span>)){<br> supportsWebp = event.<span class="hljs-property">request</span>.<span class="hljs-property">headers</span><br> .<span class="hljs-title function_">get</span>(<span class="hljs-string">'accept'</span>)<br> .<span class="hljs-title function_">includes</span>(<span class="hljs-string">'webp'</span>);<br> }<br> <span class="hljs-keyword">if</span> (supportsWebp) {<br> <span class="hljs-keyword">var</span> imageUrl = requestUrl.<span class="hljs-title function_">split</span>(<span class="hljs-string">"."</span>);<br> <span class="hljs-keyword">if</span>(imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>] === <span class="hljs-string">'jpg'</span> || imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>] === <span class="hljs-string">'tif'</span> || imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>] === <span class="hljs-string">'png'</span> || imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>] === <span class="hljs-string">'jpeg'</span>){<br> <span class="hljs-keyword">var</span> newUrl = requestUrl.<span class="hljs-title function_">replace</span>(imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>], <span class="hljs-string">'webp'</span>);<br> <span class="hljs-keyword">var</span> newRequest = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Request</span>(newUrl);<br> event.<span class="hljs-title function_">respondWith</span>(<span class="hljs-title function_">fetch</span>(newRequest));<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"[SW] Redirect "</span> + requestUrl + <span class="hljs-string">" to "</span> + newUrl + <span class="hljs-string">" ."</span>);<br> event.<span class="hljs-title function_">waitUntil</span>(<br> <span class="hljs-title function_">fetch</span>(newRequest).<span class="hljs-title function_">then</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">response</span>) {<br> <span class="hljs-keyword">if</span> (!response.<span class="hljs-property">ok</span>) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">"[SW] Failed to load image: "</span> + newUrl);<br> caches.<span class="hljs-title function_">open</span>(<span class="hljs-variable constant_">CACHE_NAME</span>).<span class="hljs-title function_">then</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">cache</span>) {<br> cache.<span class="hljs-title function_">put</span>(newRequest, response);<br> });<br> }).<span class="hljs-title function_">catch</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">error</span>) {<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(error);<br> })<br> );<br> event.<span class="hljs-title function_">stopImmediatePropagation</span>();<br> <span class="hljs-keyword">return</span>;<br> }<br> }<br> <span class="hljs-keyword">else</span> {<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"[SW] Don't support webp image, skip "</span> + requestUrl + <span class="hljs-string">" ."</span>);<br> }<br>}<br></code></pre></td></tr></table></figure><p>你学会了吗?</p><h2 id="测试"><a class="markdownIt-Anchor" href="#测试"></a> 测试</h2><p>进入网站,若一切正常,当加载到一张图片时,控制台(<code>F12</code>打开)会提示<code>[SW] Redirect https://your.image.site/path/to/img.png to https://your.image.site/path/to/img.webp .</code>这样的信息。</p><p>要测试无webp支持的情景,则点击右上角的三个点。</p><p><img src="https://img.ordchaos.com/img/2023/01/01562686a8db1bb30defe61ffa333bd1.png" alt="" /></p><p><img src="https://img.ordchaos.com/img/2023/01/372ab8df519f78c5d59ea93fcd4caf78.png" alt="" /></p><p>选择更多工具,找到“渲染”并点击。</p><p><img src="https://img.ordchaos.com/img/2023/01/6a65c870cbafb3f9f5743d96749c549a.png" alt="" /></p><p>勾选“停用webp”即可。</p><p>此时,加载图片时会提示<code>[SW] Don't support webp image, skip https://your.image.site/path/to/img.png .</code></p><p>可以试试我这里的这张图片:(图片来自CYF大佬的<code>Client Worker</code>项目的文档)</p><p><img src="https://img.ordchaos.com/img/2023/01/9f2975321779cda14980431c4595bb37.jpg" alt="" /></p><p>若浏览器支持webp则会显示<code>Webp Accept!</code>,否则为<code>Webp Reject!This is a jpg file.</code></p><p><strong>(2024.08.03)</strong> 现在支持avif则会优先显示<code>Avif Accept!</code></p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>刚刚放寒假,舒坦。</p><p>但与之对应,九上已经结束,还有一学期就中考。。。</p><p>加油!我可以的!</p><p>那就这样,886!</p><h2 id="20240803-更新"><a class="markdownIt-Anchor" href="#20240803-更新"></a> 2024.08.03 更新</h2><p>看了Heo的<a href="https://blog.zhheo.com/p/6a933575.html">实现全站图片使用avif格式,替代臃肿的webp教程</a>,好吧,再换一下。</p><p>服务器上使用<code>cavif</code>工具转换图片格式,<code>service worker</code>上简单改一下就好。</p><p>参考:</p><p><code>img2webp.sh</code>内容:</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta prompt_">#</span><span class="language-bash">!/bin/bash</span><br><br>convert_to_formats() {<br> local file="$1"<br> local base="${file%.*}"<br><br> if [ ! -f "${base}.webp" ]; then<br> cwebp -q 85 "$file" -o "${base}.webp"<br> fi<br><br> if [ ! -f "${base}.avif" ]; then<br> cavif -Q 80 "$file" -o "${base}.avif"<br> fi<br>}<br><br>find . -type f -iname "*.png" | while read file; do<br> convert_to_formats "$file"<br>done<br><br>find . -type f -iname "*.jpg" | while read file; do<br> convert_to_formats "$file"<br>done<br><br>find . -type f -iname "*.jpeg" | while read file; do<br> convert_to_formats "$file"<br>done<br></code></pre></td></tr></table></figure><p><code>sw.js</code>重定向段:</p><figure class="highlight javascript"><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></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">if</span> (event.<span class="hljs-property">request</span>.<span class="hljs-property">url</span>.<span class="hljs-title function_">indexOf</span>(<span class="hljs-string">'img.ordchaos.com'</span>) !== -<span class="hljs-number">1</span>) {<br> <span class="hljs-keyword">var</span> supportsWebp = <span class="hljs-literal">false</span>;<br> <span class="hljs-keyword">var</span> supportsAvif = <span class="hljs-literal">false</span>;<br> <span class="hljs-keyword">if</span> (event.<span class="hljs-property">request</span>.<span class="hljs-property">headers</span>.<span class="hljs-title function_">has</span>(<span class="hljs-string">'accept'</span>)) {<br> <span class="hljs-keyword">var</span> acceptHeader = event.<span class="hljs-property">request</span>.<span class="hljs-property">headers</span>.<span class="hljs-title function_">get</span>(<span class="hljs-string">'accept'</span>);<br> supportsWebp = acceptHeader.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'webp'</span>);<br> supportsAvif = acceptHeader.<span class="hljs-title function_">includes</span>(<span class="hljs-string">'avif'</span>);<br> }<br><br> <span class="hljs-keyword">var</span> imageUrl = requestUrl.<span class="hljs-title function_">split</span>(<span class="hljs-string">"."</span>);<br> <span class="hljs-keyword">var</span> fileExtension = imageUrl[imageUrl.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>];<br><br> <span class="hljs-keyword">if</span> (fileExtension === <span class="hljs-string">'jpg'</span> || fileExtension === <span class="hljs-string">'png'</span> || fileExtension === <span class="hljs-string">'jpeg'</span>) {<br> <span class="hljs-keyword">var</span> newUrl;<br> <span class="hljs-keyword">if</span> (supportsAvif) {<br> newUrl = requestUrl.<span class="hljs-title function_">replace</span>(fileExtension, <span class="hljs-string">'avif'</span>);<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"[SW] Redirect "</span> + requestUrl + <span class="hljs-string">" to "</span> + newUrl + <span class="hljs-string">" (AVIF)."</span>);<br> } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (supportsWebp) {<br> newUrl = requestUrl.<span class="hljs-title function_">replace</span>(fileExtension, <span class="hljs-string">'webp'</span>);<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"[SW] Redirect "</span> + requestUrl + <span class="hljs-string">" to "</span> + newUrl + <span class="hljs-string">" (WebP)."</span>);<br> } <span class="hljs-keyword">else</span> {<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"[SW] Don't support AVIF or WebP, using original format for "</span> + requestUrl + <span class="hljs-string">"."</span>);<br> newUrl = requestUrl;<br> }<br><br> <span class="hljs-keyword">var</span> newRequest = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Request</span>(newUrl);<br> event.<span class="hljs-title function_">respondWith</span>(<br> <span class="hljs-title function_">fetch</span>(newRequest)<br> .<span class="hljs-title function_">then</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params">response</span>) {<br> <span class="hljs-keyword">if</span> (!response.<span class="hljs-property">ok</span>) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">"[SW] Failed to load image: "</span> + newUrl);<br> <span class="hljs-keyword">return</span> caches.<span class="hljs-title function_">open</span>(<span class="hljs-variable constant_">CACHE_NAME</span>).<span class="hljs-title function_">then</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params">cache</span>) {<br> cache.<span class="hljs-title function_">put</span>(newRequest, response.<span class="hljs-title function_">clone</span>());<br> <span class="hljs-keyword">return</span> response;<br> });<br> })<br> .<span class="hljs-title function_">catch</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params">error</span>) {<br> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(error);<br> <span class="hljs-keyword">return</span> <span class="hljs-title function_">fetch</span>(event.<span class="hljs-property">request</span>);<br> })<br> );<br> <span class="hljs-keyword">return</span>;<br> }<br>}<br></code></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>原本博客用的都是普通图片,就算有懒加载,一堆圈圈一起转也惹人心烦。现在改为了原图/webp的自适应切换,效果好上不少。</p></summary>
<category term="编程" scheme="https://www.ordchaos.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/tags/%E6%95%99%E7%A8%8B/"/>
<category term="优化" scheme="https://www.ordchaos.com/tags/%E4%BC%98%E5%8C%96/"/>
</entry>
<entry>
<title>自托管 E-mail ,宝宝喜欢妈妈爱</title>
<link href="https://www.ordchaos.com/posts/3b90dbec/"/>
<id>https://www.ordchaos.com/posts/3b90dbec/</id>
<published>2022-11-28T13:40:50.000Z</published>
<updated>2024-02-12T21:27:30.000Z</updated>
<content type="html"><![CDATA[<p>本来一直在用阿里云的企业邮箱,但感觉总是不太好,主要每次都需要进<code>https://qiye.aliyun.com</code>登录。于是趁着黑色星期五<a href="https://racknerd.com/">RackNerd</a>的优惠,搞了一台vps来搭电子邮局(如果你想搭建,请确认服务器是否支持rDNS以及是否开启25端口)。</p><span id="more"></span><p>配置如下(年付$10.28)</p><table><thead><tr><th style="text-align:center">硬件</th><th style="text-align:center">配置</th></tr></thead><tbody><tr><td style="text-align:center">CPU</td><td style="text-align:center">1核</td></tr><tr><td style="text-align:center">RAM</td><td style="text-align:center">768MB</td></tr><tr><td style="text-align:center">SSD</td><td style="text-align:center">10GB</td></tr><tr><td style="text-align:center">流量</td><td style="text-align:center">1TB</td></tr></tbody></table><p>还是比较磕碜的,不过价格在这,无所谓了。</p><h2 id="经历"><a class="markdownIt-Anchor" href="#经历"></a> 经历</h2><p>首先,我需要为vps开通rDNS记录到<code>mx.ordchaos.com</code>上。后台可以自主设置,很方便…</p><p><img src="https://img.ordchaos.com/img/2022/11/319d4fa4d25c91e5fd4872d6004fac01.png" alt="bang!" /></p><p>好,很好,我沉得住气。发个工单问一下:</p><p><img src="https://img.ordchaos.com/img/2022/11/497f1f27397c268b35dcccd1fd6c274c.png" alt="工单截图" /></p><p>哦!原来如此!好的,继续交流后,rDNS设置成功,但然而我却发现无法访问?!一番探查之后,发现这样一个事实——被墙啦!</p><p>于是只得继续发工单:</p><p><img src="https://img.ordchaos.com/img/2022/11/132fdf9f0fb03dbdd0298117cc331d30.png" alt="" /></p><p>终于搞定。</p><h2 id="mailuio部署"><a class="markdownIt-Anchor" href="#mailuio部署"></a> Mailu.io部署</h2><h3 id="设置主机名"><a class="markdownIt-Anchor" href="#设置主机名"></a> 设置主机名</h3><p>在vps的bash中输入:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">nano /etc/hosts<br></code></pre></td></tr></table></figure><p>在其中具有服务器ip地址的一行中,将后面的内容改为(假设你的域名是<code>example.com</code>,服务器ip是<code>88.88.88.88</code>):</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">88.88.88.88 mx.example.com mx<br></code></pre></td></tr></table></figure><p>编辑好后,在vps中执行:</p><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><code class="hljs shell">echo "mx" > /etc/hostname<br>hostname -F /etc/hostname<br></code></pre></td></tr></table></figure><p>这样就设置好了主机名,可以通过<code>hostname</code>命令确认是否设置成功:</p><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><code class="hljs shell">hostname<br>hostname -f<br></code></pre></td></tr></table></figure><p>前者只会输出<code>mx</code>,后者则会输出<code>mx.example.com</code>。如果不是,那就是设置错了。</p><h3 id="设置dns解析"><a class="markdownIt-Anchor" href="#设置dns解析"></a> 设置DNS解析</h3><p>去你的域名DNS解析服务商,设置以下DNS解析(假设你的域名是<code>example.com</code>,服务器ip是<code>88.88.88.88</code>):</p><table><thead><tr><th style="text-align:center">主机名</th><th style="text-align:center">解析类型</th><th style="text-align:center">内容</th></tr></thead><tbody><tr><td style="text-align:center">@</td><td style="text-align:center">A</td><td style="text-align:center">(如果已有解析就不管,没有就解析到127.0.0.1,注意不能有CNAME记录)</td></tr><tr><td style="text-align:center">mx</td><td style="text-align:center">A</td><td style="text-align:center">88.88.88.88</td></tr><tr><td style="text-align:center">@</td><td style="text-align:center">MX</td><td style="text-align:center"><a href="http://mx.example.com">mx.example.com</a>(优先级为10)</td></tr><tr><td style="text-align:center">@</td><td style="text-align:center">TXT</td><td style="text-align:center">v=spf1 mx a:mx.example.com ~all</td></tr><tr><td style="text-align:center">_dmarc</td><td style="text-align:center">TXT</td><td style="text-align:center">v=DMARC1; p=reject; <a href="mailto:rua=mailto:admin@example.com">rua=mailto:admin@example.com</a>; <a href="mailto:ruf=mailto:admin@example.com">ruf=mailto:admin@example.com</a>; adkim=s; aspf=s</td></tr><tr><td style="text-align:center"><a href="http://example.com">example.com</a>._report._dmarc</td><td style="text-align:center">TXT</td><td style="text-align:center">v=DMARC1</td></tr></tbody></table><p>然后去vps服务商,设置rDNS(或者叫做PTR)解析,将<code>88.88.88.88</code>解析到<code>mx.example.com</code></p><h3 id="获取配置"><a class="markdownIt-Anchor" href="#获取配置"></a> 获取配置</h3><p>访问Mailu.io的配置生成网页:<a href="https://setup.mailu.io/">https://setup.mailu.io</a></p><p><img src="https://img.ordchaos.com/img/2022/11/f467bf5ab91b12fdef1b84d6e2239b05.png" alt="" /></p><p>写文时最新版本为1.9,保持不变。下方部署方式选择Compose.</p><p><img src="https://img.ordchaos.com/img/2022/11/fb64a5b8475dd80944f74acbd558a224.png" alt="" /></p><ul><li><p>1:在此处填写自己的域名</p></li><li><p>2:自己起个名字(如“序炁的电子邮局”)</p></li><li><p>3:若你的域名为<code>example.com</code>,则在此处填写<code>https://mx.example.com</code></p></li><li><p>4:点击勾选</p></li></ul><p><img src="https://img.ordchaos.com/img/2022/11/85105d9d486d31bb37aa25f69ef7376d.png" alt="" /></p><ul><li><p>1:推荐选择rainloop,更加现代好看</p></li><li><p>2:填写自己vps的ip地址</p></li><li><p>3:若你的域名为<code>example.com</code>,则在此处填写<code>mx.example.com</code></p></li></ul><p>最后,你会看到如下界面:</p><p><img src="https://img.ordchaos.com/img/2022/11/decae2b8f721e07d24f8c7ef1b7ea38c.png" alt="" /></p><p>照着界面的指示,回到vps执行指令:</p><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><code class="hljs shell">mkdir /mailu<br>cd /mailu<br></code></pre></td></tr></table></figure><p>然后回到刚刚的页面,下载配置文件:</p><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><code class="hljs shell">wget http://setup.mailu.io/1.7/file/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/docker-compose.yml<br>wget http://setup.mailu.io/1.7/file/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/mailu.env<br></code></pre></td></tr></table></figure><p>最后执行(假设你的域名是<code>example.com</code>,密码设置为<code>PASSWORD</code>):</p><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><code class="hljs shell">docker-compose -p mailu up -d<br>docker-compose -p mailu exec admin flask mailu admin admin example.com PASSWORD<br></code></pre></td></tr></table></figure><p>就安装完成了。</p><h3 id="配置"><a class="markdownIt-Anchor" href="#配置"></a> 配置</h3><p>在浏览器中访问<code>https://mx.example.com</code>登录您的管理员面板:</p><p><img src="https://img.ordchaos.com/img/2022/11/bb36706e2cf80fc26e6f1baa7bac5636.png" alt="管理员面板" /></p><p>使用账号<code>admin@example.com</code>和密码<code>PASSWORD</code>登录即可(假设你的域名是<code>example.com</code>,密码设置为<code>PASSWORD</code>)。</p><p>然后点击左侧的“邮件域”:</p><p><img src="https://img.ordchaos.com/img/2022/11/0dbf970ce24ab1f18381955949ff2acf.png" alt="" /></p><p>然后点击如下的按钮:</p><p><img src="https://img.ordchaos.com/img/2022/11/ff977f14b7bc7c6775de3dcd3a0538f9.png" alt="" /></p><p>在新界面中点击“生成密钥”,然后复制dkim配置:</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs txt">dkim._domainkey.example.com. 600 IN TXT "v=DKIM1; k=rsa; p=xxxxxxxxxxxxxxxxxxxxxxxxxxxx" "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"<br></code></pre></td></tr></table></figure><p>进行域名解析即可。</p><h3 id="创建账号"><a class="markdownIt-Anchor" href="#创建账号"></a> 创建账号</h3><p>邮件域>用户>添加用户,按需配置即可。</p><h2 id="使用"><a class="markdownIt-Anchor" href="#使用"></a> 使用</h2><p>退出管理员账号,访问<code>https://mx.example.com/webmail</code>,登录即可(选择“登录Webmail”)。</p><p><img src="https://img.ordchaos.com/img/2022/11/bbd43555ba6226a01d53b697174f8742.png" alt="主页面" /></p><h2 id="测试"><a class="markdownIt-Anchor" href="#测试"></a> 测试</h2><p>在<a href="https://www.mail-tester.com/">MailTester</a>上可以进行测试,如下是我测试结果:</p><p><img src="https://img.ordchaos.com/img/2022/11/84baf936fcbe9b4663cabce5a51252e0.png" alt="" /></p><p>很完美了,对吧(</p><p><span class="heimu" title="你知道的太多了">以前没有超过8过</span></p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>完成了很久以前的夙愿。</p><p>欢迎跟着做一遍哦!也欢迎提问!</p><h2 id="2024212-更新"><a class="markdownIt-Anchor" href="#2024212-更新"></a> 2024.2.12 更新</h2><p>用一段时间后服务器会出现403,此时重启docker即可。</p><p>有关于自动重启,参考这篇文章:<a href="https://www.ordchaos.com/posts/e9c784c5/">使用Github Action定时重启邮件服务</a></p>]]></content>
<summary type="html"><p>本来一直在用阿里云的企业邮箱,但感觉总是不太好,主要每次都需要进<code>https://qiye.aliyun.com</code>登录。于是趁着黑色星期五<a href="https://racknerd.com/">RackNerd</a>的优惠,搞了一台vps来搭电子邮局(如果你想搭建,请确认服务器是否支持rDNS以及是否开启25端口)。</p></summary>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/tags/%E6%95%99%E7%A8%8B/"/>
<category term="电子邮件" scheme="https://www.ordchaos.com/tags/%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6/"/>
<category term="vps" scheme="https://www.ordchaos.com/tags/vps/"/>
</entry>
<entry>
<title>船新说说页面—— Memos 初体验</title>
<link href="https://www.ordchaos.com/posts/3386e07f/"/>
<id>https://www.ordchaos.com/posts/3386e07f/</id>
<published>2022-11-26T12:42:15.000Z</published>
<updated>2022-11-26T12:42:15.000Z</updated>
<content type="html"><![CDATA[<p>博客的说说真的是一波三折…</p><span id="more"></span><p>最开始用的是<a href="https://hexoplusplus.js.org">HexoPlusPlus</a>的说说,很好用也很流畅小巧,但是自Hpp停止开发后就用不了了。</p><p>然后改用了<a href="https://immmmm.com/bb-by-wechat-pro/">bber</a>,也很不错,但是<span class="heimu" title="你知道的太多了">辣鸡</span>腾讯云也是离谱,好好的羊毛突然就不让薅了,<span class="heimu" title="你知道的太多了">同时我的twikoo也被迫迁移到了vercel,</span>只得抛弃。</p><p>中途也用过别的说说系统,比如说大名鼎鼎的<a href="https://artitalk.js.org/">Artitalk</a>亦或者是<a href="https://github.com/kkfive/iSpeak/">iSpeak</a>等等,但是都不太满意,而后因为各式各样的原因放弃。</p><p>本来我会一直被这玩意困扰…现在不会了!只因为我发现了它——<a href="https://usememos.com/">Memos</a></p><p>开源,私有部署,这不就是我要的完美的说说系统吗?!</p><h2 id="后端部署"><a class="markdownIt-Anchor" href="#后端部署"></a> 后端部署</h2><p>很简单,首先你要有一台vps,然后装上docker.</p><p>随后一句指令即可搞定:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">docker run -d --name memos -p 5230:5230 -v ${PWD}/.memos/:/var/opt/memos neosmemo/memos:latest<br></code></pre></td></tr></table></figure><p>随后Memos就会被部署到5230端口,觉得不方便也可以反向代理,这个教程有很多,这里就不写了。</p><h2 id="前端"><a class="markdownIt-Anchor" href="#前端"></a> 前端</h2><h3 id="单页"><a class="markdownIt-Anchor" href="#单页"></a> 单页</h3><p>可以看看我的:<a href="https://www.ordchaos.com/talk/">说说</a></p><p>样式完全是自己写的…你知道对一位学C++的初三学生而言css是什么东西吗?!<span class="heimu" title="你知道的太多了">好吧随便写写也不算难</span></p><p>js来自<a href="https://immmmm.com/">immmmm</a>,稍微改了一点点,可以在<a href="https://www.ordchaos.com/js/talk.js">这里</a>看看<span class="heimu" title="你知道的太多了">被压缩了根本看不了</span>。</p><p>总体而言,如果你也想要部署一个和我完全一样的页面,可以用以下html代码:(记得下载js文件)</p><figure class="highlight html"><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></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">'memo-nums'</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">'note note-info memo-nums-text'</span>></span><br> 共有 <span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">'memonums'</span>></span>「数待载之」<span class="hljs-tag"></<span class="hljs-name">span</span>></span> 条说说<br> <span class="hljs-tag"></<span class="hljs-name">p</span>></span><br><span class="hljs-tag"></<span class="hljs-name">div</span>></span><br><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"bber"</span>></span><span class="hljs-tag"></<span class="hljs-name">div</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span>></span><span class="language-javascript"></span><br><span class="language-javascript"> <span class="hljs-keyword">var</span> bbMemos = {</span><br><span class="language-javascript"> memos : <span class="hljs-string">'https://memos.ordchaos.top/'</span>,<span class="hljs-comment">//修改为自己部署Memos的网址,末尾有斜杠</span></span><br><span class="language-javascript"> limit : <span class="hljs-string">''</span>,<span class="hljs-comment">//默认每次显示10条 </span></span><br><span class="language-javascript"> <span class="hljs-attr">creatorId</span>:<span class="hljs-string">'1'</span> ,<span class="hljs-comment">//默认为101用户</span></span><br><span class="language-javascript"> <span class="hljs-attr">domId</span>: <span class="hljs-string">''</span>,<span class="hljs-comment">//默认为bber类</span></span><br><span class="language-javascript"> }</span><br><span class="language-javascript"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"//jsd.ordchaos.top/marked/marked.min.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/js/talk.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br></code></pre></td></tr></table></figure><p>注意这里用了Tag插件,如果用不了记得改改。</p><h3 id="首页轮播"><a class="markdownIt-Anchor" href="#首页轮播"></a> 首页轮播</h3><p>这个就比较简单了,直接在主题的<code>index.ejs</code>里加上以下代码即可:</p><figure class="highlight html"><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></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">'note note-info memo-nums-text'</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"iconfont icon-speakernotes"</span>></span><span class="hljs-tag"></<span class="hljs-name">i</span>></span><span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"memos-index-space"</span>></span> <span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">'memos-t'</span>></span>首页说说轮播加载中...<span class="hljs-tag"></<span class="hljs-name">span</span>></span><br><span class="hljs-tag"></<span class="hljs-name">p</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/js/lately.min.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="language-javascript"></span><br><span class="language-javascript"> <span class="hljs-keyword">let</span> jsonUrl =</span><br><span class="language-javascript"> <span class="hljs-string">"https://memos.ordchaos.top/api/memo?creatorId=1&rowStatus=NORMAL"</span> +</span><br><span class="language-javascript"> <span class="hljs-string">"&t="</span> +</span><br><span class="language-javascript"> <span class="hljs-title class_">Date</span>.<span class="hljs-title function_">parse</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Date</span>());</span><br><span class="language-javascript"></span><br><span class="language-javascript"> <span class="hljs-title function_">fetch</span>(jsonUrl)</span><br><span class="language-javascript"> .<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">res</span>) =></span> res.<span class="hljs-title function_">json</span>())</span><br><span class="language-javascript"> .<span class="hljs-title function_">then</span>(<span class="hljs-function">(<span class="hljs-params">resdata</span>) =></span> {</span><br><span class="language-javascript"> data = resdata.<span class="hljs-property">data</span>,</span><br><span class="language-javascript"> resultIndexMemos = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Array</span>(data.<span class="hljs-property">length</span>);</span><br><span class="language-javascript"> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < data.<span class="hljs-property">length</span>; i++) {</span><br><span class="language-javascript"> <span class="hljs-keyword">var</span> talkTime = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Date</span>(</span><br><span class="language-javascript"> data[i].<span class="hljs-property">createdTs</span> * <span class="hljs-number">1000</span></span><br><span class="language-javascript"> ).<span class="hljs-title function_">toLocaleString</span>();</span><br><span class="language-javascript"> <span class="hljs-keyword">var</span> talkContent = data[i].<span class="hljs-property">content</span>;</span><br><span class="language-javascript"> <span class="hljs-keyword">var</span> newtalkContent = talkContent</span><br><span class="language-javascript"> .<span class="hljs-title function_">replace</span>(<span class="hljs-regexp">/```([\s\S]*?)```[\s]*/g</span>, <span class="hljs-string">" <code>$1</code> "</span>) <span class="hljs-comment">//全局匹配代码块</span></span><br><span class="language-javascript"> .<span class="hljs-title function_">replace</span>(<span class="hljs-regexp">/`([\s\S ]*?)`[\s]*/g</span>, <span class="hljs-string">" <code>$1</code> "</span>) <span class="hljs-comment">//全局匹配内联代码块</span></span><br><span class="language-javascript"> .<span class="hljs-title function_">replace</span>(<span class="hljs-regexp">/<iframe([\s\S ]*?)iframe>[\s]*/g</span>, <span class="hljs-string">"📺"</span>) <span class="hljs-comment">//全局匹配视频</span></span><br><span class="language-javascript"> .<span class="hljs-title function_">replace</span>(<span class="hljs-regexp">/\!\[[\s\S]*?\]\([\s\S]*?\)/g</span>, <span class="hljs-string">"🌅"</span>) <span class="hljs-comment">//全局匹配图片</span></span><br><span class="language-javascript"> .<span class="hljs-title function_">replace</span>(<span class="hljs-regexp">/\[[\s\S]*?\]\([\s\S]*?\)/g</span>, <span class="hljs-string">"🔗"</span>) <span class="hljs-comment">//全局匹配连接</span></span><br><span class="language-javascript"> .<span class="hljs-title function_">replace</span>(</span><br><span class="language-javascript"> <span class="hljs-regexp">/\bhttps?:\/\/(?!\S+(?:jpe?g|png|bmp|gif|webp|jfif|gif))\S+/g</span>,</span><br><span class="language-javascript"> <span class="hljs-string">"🔗"</span></span><br><span class="language-javascript"> ); <span class="hljs-comment">//全局匹配纯文本连接</span></span><br><span class="language-javascript"> <span class="hljs-keyword">if</span>(newtalkContent.<span class="hljs-property">length</span> > <span class="hljs-number">25</span>) {</span><br><span class="language-javascript"> newtalkContent = newtalkContent.<span class="hljs-title function_">substring</span>(<span class="hljs-number">0</span>, <span class="hljs-number">25</span>) + <span class="hljs-string">'...'</span>;</span><br><span class="language-javascript"> }</span><br><span class="language-javascript"> resultIndexMemos[i] = <span class="hljs-string">`<span class="datetime"><span class="hljs-subst">${talkTime}</span></span>: <a href="https://www.ordchaos.com/talk/"><span class="hljs-subst">${newtalkContent}</span></a>`</span>;</span><br><span class="language-javascript"> }</span><br><span class="language-javascript"> });</span><br><span class="language-javascript"></span><br><span class="language-javascript"> <span class="hljs-comment">// 滚动效果</span></span><br><span class="language-javascript"> <span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>;</span><br><span class="language-javascript"> <span class="hljs-built_in">setInterval</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {</span><br><span class="language-javascript"> <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">"memos-t"</span>).<span class="hljs-property">innerHTML</span> = resultIndexMemos[i];</span><br><span class="language-javascript"> <span class="hljs-variable language_">window</span>.<span class="hljs-property">Lately</span> && <span class="hljs-title class_">Lately</span>.<span class="hljs-title function_">init</span>({ <span class="hljs-attr">target</span>: <span class="hljs-string">".datetime"</span> });</span><br><span class="language-javascript"> i++;</span><br><span class="language-javascript"> <span class="hljs-keyword">if</span>(i == resultIndexMemos.<span class="hljs-property">length</span>) i = <span class="hljs-number">0</span>;</span><br><span class="language-javascript"> }, <span class="hljs-number">3000</span>);</span><br><span class="language-javascript"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br></code></pre></td></tr></table></figure><p>Tag仍然是不能用就记得改。代码来自<a href="https://eallion.com/">eallion</a>,仍然是改了一下<span class="heimu" title="你知道的太多了">原本的逻辑怎么看怎么怪</span><span class="heimu" title="你知道的太多了">好吧也可能是我没看懂——总而言之,无意冒犯</span>。</p><p>javascript总算是好些那么一点点,起码与c++还有那么一点像,外加上自己写GDScript的经验,稍稍改点也不算难事<span class="heimu" title="你知道的太多了">改了一小时</span></p><h2 id="效果"><a class="markdownIt-Anchor" href="#效果"></a> 效果</h2><p><span class="heimu" title="你知道的太多了">自己去看看不行吗,动动手指的事</span></p><p><img src="https://img.ordchaos.com/img/2022/11/4ace9417edf03d7d6b4bd95620f27f55.png" alt="说说页面" /></p><p><img src="https://img.ordchaos.com/img/2022/11/598e03e4a296da3866f9c4404977e5fa.png" alt="首页轮播" /></p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>前前后后搞了半个月了,终于是在学习的闲暇时间整完,中途也是收获良多。</p><p>那就这样,886!</p>]]></content>
<summary type="html"><p>博客的说说真的是一波三折…</p></summary>
<category term="编程" scheme="https://www.ordchaos.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="javascript" scheme="https://www.ordchaos.com/tags/javascript/"/>
<category term="css" scheme="https://www.ordchaos.com/tags/css/"/>
<category term="memos" scheme="https://www.ordchaos.com/tags/memos/"/>
<category term="html" scheme="https://www.ordchaos.com/tags/html/"/>
<category term="说说" scheme="https://www.ordchaos.com/tags/%E8%AF%B4%E8%AF%B4/"/>
<category term="前端" scheme="https://www.ordchaos.com/tags/%E5%89%8D%E7%AB%AF/"/>
</entry>
<entry>
<title>Picgo ,我 ...... 我 ......</title>
<link href="https://www.ordchaos.com/posts/28b74a2d/"/>
<id>https://www.ordchaos.com/posts/28b74a2d/</id>
<published>2022-11-04T08:40:50.000Z</published>
<updated>2022-11-04T08:40:50.000Z</updated>
<content type="html"><![CDATA[<p>如题,我要被这个神仙软件气死了。</p><span id="more"></span><h2 id="起因"><a class="markdownIt-Anchor" href="#起因"></a> 起因</h2><p>准备装unity写个游戏,学一学C#,然后就发现C盘爆满飘红。用SpaceSniffer看了一下——好家伙!</p><p>Picgo的日志文件,占了我58.6GB.</p><h2 id="解释"><a class="markdownIt-Anchor" href="#解释"></a> 解释</h2><p>当Picgo上传图片失败时就会开始疯狂写日志,然后文件大小就爆炸。</p><h2 id="解决"><a class="markdownIt-Anchor" href="#解决"></a> 解决</h2><p>删掉日志,从组策略里设置一下日志文件大小限制就好了。</p><p>可以参考这个:<a href="https://jingyan.baidu.com/article/4d58d5413ed1bedcd5e9c010.html">如何在Windows10系统设置日志文件的最大大小</a></p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>就离谱!!!</p>]]></content>
<summary type="html"><p>如题,我要被这个神仙软件气死了。</p></summary>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/tags/%E6%95%99%E7%A8%8B/"/>
<category term="Picgo" scheme="https://www.ordchaos.com/tags/Picgo/"/>
</entry>
<entry>
<title>学习笔记——堆</title>
<link href="https://www.ordchaos.com/posts/fab451a5/"/>
<id>https://www.ordchaos.com/posts/fab451a5/</id>
<published>2022-09-16T19:22:59.000Z</published>
<updated>2022-09-16T19:22:59.000Z</updated>
<content type="html"><![CDATA[<p>马上就是今年的CSP-J了,一想起自己还有那么多数据结构没学就有点头皮发麻…这篇博文里我就来讲一下堆(Heap),一是方便他人,二是给自己巩固思路。</p><span id="more"></span><h2 id="讲解"><a class="markdownIt-Anchor" href="#讲解"></a> 讲解</h2><p>按照惯例<span class="heimu" title="你知道的太多了">哪里来的惯例</span>,还是看一下堆是什么东西:</p><blockquote><p>堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:</p><ul><li>堆中某个结点的值总是不大于或不小于其父结点的值;</li><li>堆总是一棵完全二叉树。</li></ul><p>将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。</p><p>——百度百科 <a href="https://baike.baidu.com/item/%E5%A0%86/20606834">堆</a></p></blockquote><p>很显然,为了储存堆,我们需要一棵完全二叉树。这里很多人就会想到建树,但其实不用。如果你看过我的<a href="https://www.ordchaos.com/posts/340b325e/">学习笔记——二叉树</a>的话,应该会记得完全二叉树的性质之一:</p><blockquote><p>在有n个节点的完全二叉树中,对于编号为i的节点:</p><ul><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>,则其无父节点,为根节点,否则其父节点编号为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mi>l</mi><mi>o</mi><mi>o</mi><mi>r</mi><mrow><mo fence="true">(</mo><mfrac><mi>i</mi><mn>2</mn></mfrac><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">floor\left( \frac{i}{2} \right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.205674em;vertical-align:-0.35001em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.855664em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span></span></span></span>。</li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mi>i</mi><mo>></mo><mi>n</mi></mrow><annotation encoding="application/x-tex">2i>n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69862em;vertical-align:-0.0391em;"></span><span class="mord">2</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span></span></span></span>,则i为叶节点,否则其左孩子的编号为2i。</li><li>若<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mi>i</mi><mo><</mo><mi>n</mi><mo><</mo><mn>2</mn><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2i<n<2i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69862em;vertical-align:-0.0391em;"></span><span class="mord">2</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.74285em;vertical-align:-0.08333em;"></span><span class="mord">2</span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>,则i无右孩子,否则其右孩子的编号为2i+1。</li></ul><p>——序炁 <a href="https://www.ordchaos.com/posts/340b325e/">学习笔记——二叉树</a></p></blockquote><p>所以我们只需要一个数组就可以存储堆了:数组最开始填入根节点,其左右孩子节点便依次为其后面的两个下标,再往后就以此类推。</p><p>那么现在建立一个数据结构用来建堆,很简单,参照下列代码:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">define</span> MAXSIZE 100000</span><br><br><span class="hljs-keyword">struct</span> <span class="hljs-title class_">myHeap</span> {<br> <span class="hljs-type">int</span> value[MAXSIZE];<br> <span class="hljs-type">int</span> length;<br>};<br></code></pre></td></tr></table></figure><p>对于每一个堆都申请一个MAXSIZE大小的数组用于存储,而后用length变量存储目前的总节点数即可。</p><p>那么如何初始化就显而易见,只需要</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-function"><span class="hljs-keyword">inline</span> <span class="hljs-type">void</span> <span class="hljs-title">init</span><span class="hljs-params">(myHeap &heap)</span> </span>{<br> heap.length = <span class="hljs-number">0</span>;<br> <span class="hljs-keyword">return</span>;<br>}<br></code></pre></td></tr></table></figure><p>像这样将length设为0就大功告成。</p><h3 id="插入元素"><a class="markdownIt-Anchor" href="#插入元素"></a> 插入元素</h3><p>如果要往一个堆里插入元素,那我们就要先确定这个堆是小根堆还是大根堆,下面的所有代码均默认是小根堆,大根堆<s>自己改去</s>自己想想吧。</p><p>首先,在堆末尾加入要插入的元素:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">push</span><span class="hljs-params">(myHeap &heap, <span class="hljs-type">int</span> v)</span> </span>{<br> heap.value[heap.length++] = v;<br> <span class="hljs-comment">//...</span><br>}<br></code></pre></td></tr></table></figure><p>length永远指向数组中最后一个存储了数据的位置的下一个位置,所以在<code>value[length]</code>的位置存储数据,然后增加length即可。</p><p>但现在这个堆可能不满足小根堆的性质了,怎么办呢?很简单,进行调整即可。将新节点设为当前节点,如果它大于父节点则结束,若小于则交换,而后将交换后的父节点(没错,还是新插入的数据)设为当前节点,重复这个过程直到其大于父节点或其为根节点则结束。</p><p>听着有些复杂,但用while循环即可轻松实现:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">push</span><span class="hljs-params">(myHeap &heap, <span class="hljs-type">int</span> v)</span> </span>{<br> <span class="hljs-comment">//...</span><br> <span class="hljs-type">int</span> now = length;<br> <span class="hljs-keyword">while</span>(heap.value[now - <span class="hljs-number">1</span>] < heap.value[now / <span class="hljs-number">2</span> - <span class="hljs-number">1</span>] && now != <span class="hljs-number">1</span>) {<br> <span class="hljs-built_in">swap</span>(heap.value[now - <span class="hljs-number">1</span>], heap.value[now / <span class="hljs-number">2</span> - <span class="hljs-number">1</span>]);<br> now /= <span class="hljs-number">2</span>;<br> }<br> <span class="hljs-keyword">return</span>;<br>}<br></code></pre></td></tr></table></figure><p>完事!</p><h3 id="删除元素"><a class="markdownIt-Anchor" href="#删除元素"></a> 删除元素</h3><p>删除元素即出队,会弹出根节点。故而这里的方法是把最后一个节点移到根节点的位置覆盖掉它,再进行调整。</p><p>覆盖很简单:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">pop</span><span class="hljs-params">(myHeap &heap)</span> </span>{<br> heap.value[<span class="hljs-number">0</span>] = heap.value[--heap.length];<br><span class="hljs-comment">//...</span><br>}<br></code></pre></td></tr></table></figure><p>不要忘记将节点数减一即可。这里用了一个小技巧,本来要写成这样:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs cpp">heap.value[<span class="hljs-number">0</span>] = heap.value[heap.length - <span class="hljs-number">1</span>];<br>heap.length--;<br></code></pre></td></tr></table></figure><p>竞赛常考之一,<code>++i</code>与<code>i++</code>的区别。不要觉得没用,比如用在这里就非常合适。包括前面的</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs cpp">heap.value[heap.length++] = v;<br></code></pre></td></tr></table></figure><p>也用了这个方法。</p><p>好了,言归正传,下一步是调整节点。显然,这一次需要从上往下调整:将根节点设为当前节点,与自己左右孩子中较小的一个比较,若小于则结束,否则与其交换位置并将当前节点设为交换好的孩子节点(一样指向同样的数据),重复这个过程直到当前节点为叶节点或当前节点小于自己任何一个孩子为止。</p><p>同样,上代码:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">pop</span><span class="hljs-params">(myHeap &heap)</span> </span>{<br> <span class="hljs-comment">//...</span><br> <span class="hljs-type">int</span> now = <span class="hljs-number">1</span>;<br> <span class="hljs-keyword">while</span>(<span class="hljs-number">2</span> * now <= heap.length) {<br> <span class="hljs-type">int</span> temp = <span class="hljs-number">2</span> * now - <span class="hljs-number">1</span>;<br> <span class="hljs-keyword">if</span>(temp + <span class="hljs-number">2</span> <= heap.length && heap.value[temp] > heap.value[temp + <span class="hljs-number">1</span>]) temp++;<br> <span class="hljs-keyword">if</span>(heap.value[now - <span class="hljs-number">1</span>] > heap.value[temp]) <span class="hljs-built_in">swap</span>(heap.value[now - <span class="hljs-number">1</span>], heap.value[temp]);<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">break</span>;<br> now = temp + <span class="hljs-number">1</span>;<br> }<br> <span class="hljs-keyword">return</span>;<br>}<br></code></pre></td></tr></table></figure><p>需要额外注意的是对当前节点是否为叶节点以及是否拥有右孩子的判断,避免因失误导致数据溢出。</p><h2 id="应用"><a class="markdownIt-Anchor" href="#应用"></a> 应用</h2><p>其实堆的操作也只有插入与删除,不过就是这么简单的东西也可以玩出不同的花样,下面是两个例子。</p><h3 id="洛谷-p1090-noip2004-提高组-合并果子"><a class="markdownIt-Anchor" href="#洛谷-p1090-noip2004-提高组-合并果子"></a> 洛谷 P1090 NOIP2004 提高组 合并果子</h3><p>原题链接:<a href="https://www.luogu.com.cn/problem/P1090">洛谷 P1090 NOIP2004 提高组 合并果子</a></p><h4 id="题目描述"><a class="markdownIt-Anchor" href="#题目描述"></a> 题目描述</h4><p>在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。</p><p>每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。</p><p>因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类 数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。</p><p>例如有3种果子,数目依次为1,2,9. 可以先将1、2堆合并,新堆数目为3,耗费体力为3. 接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力为3+12=15。可以证明15为最小的体力耗费值。</p><h4 id="输入格式"><a class="markdownIt-Anchor" href="#输入格式"></a> 输入格式</h4><p>共两行。</p><p>第一行是一个整数n(1≤n≤10000),表示果子的种类数。</p><p>第二行包含n个整数,用空格分隔,第i个整数a<sub>i</sub>(1≤a<sub>i</sub>≤20000)是第i种果子的数目。</p><h4 id="输出格式"><a class="markdownIt-Anchor" href="#输出格式"></a> 输出格式</h4><p>一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2<sup>31</sup>.</p><h4 id="输入输出样例"><a class="markdownIt-Anchor" href="#输入输出样例"></a> 输入输出样例</h4><p>输入</p><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><code class="hljs shell">3<br>1 2 9<br></code></pre></td></tr></table></figure><p>输出</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">15<br></code></pre></td></tr></table></figure><h4 id="分析"><a class="markdownIt-Anchor" href="#分析"></a> 分析</h4><p>简单的贪心算法,每次从所有果子中取两堆数量最小的合并,然后放回去即可。</p><p>不一定非要用堆,不过如果只是简单的排序的话会超时。不过你同样也可以用优先队列,或者看看洛谷上那些神犇的题解。</p><p>我的方法很简单,只需要建堆,然后从堆中取两个最小值(即小根堆堆顶元素)相加再插回去,直到只剩一个元素即可。其中每一次合并时用一个变量累计总体力,最后输出就行了。</p><p>代码如下:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><bits/stdc++.h></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-meta">#<span class="hljs-keyword">define</span> MAXSIZE 100000</span><br><br><span class="hljs-keyword">struct</span> <span class="hljs-title class_">myHeap</span> {<br> <span class="hljs-type">int</span> value[MAXSIZE];<br> <span class="hljs-type">int</span> length;<br>};<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">push</span><span class="hljs-params">(myHeap &heap, <span class="hljs-type">int</span> v)</span> </span>{<br> heap.value[heap.length++] = v;<br> <span class="hljs-type">int</span> now = heap.length;<br> <span class="hljs-keyword">while</span>(heap.value[now - <span class="hljs-number">1</span>] < heap.value[now / <span class="hljs-number">2</span> - <span class="hljs-number">1</span>] && now != <span class="hljs-number">1</span>) {<br> <span class="hljs-built_in">swap</span>(heap.value[now - <span class="hljs-number">1</span>], heap.value[now / <span class="hljs-number">2</span> - <span class="hljs-number">1</span>]);<br> now /= <span class="hljs-number">2</span>;<br> }<br> <span class="hljs-keyword">return</span>;<br>}<br><br><span class="hljs-function"><span class="hljs-type">void</span> <span class="hljs-title">pop</span><span class="hljs-params">(myHeap &heap)</span> </span>{<br> heap.value[<span class="hljs-number">0</span>] = heap.value[--heap.length];<br> <span class="hljs-type">int</span> now = <span class="hljs-number">1</span>;<br> <span class="hljs-keyword">while</span>(<span class="hljs-number">2</span> * now <= heap.length) {<br> <span class="hljs-type">int</span> temp = <span class="hljs-number">2</span> * now - <span class="hljs-number">1</span>;<br> <span class="hljs-keyword">if</span>(temp + <span class="hljs-number">2</span> <= heap.length && heap.value[temp] > heap.value[temp + <span class="hljs-number">1</span>]) temp++;<br> <span class="hljs-keyword">if</span>(heap.value[now - <span class="hljs-number">1</span>] > heap.value[temp]) <span class="hljs-built_in">swap</span>(heap.value[now - <span class="hljs-number">1</span>], heap.value[temp]);<br> <span class="hljs-keyword">else</span> <span class="hljs-keyword">break</span>;<br> now = temp + <span class="hljs-number">1</span>;<br> }<br> <span class="hljs-keyword">return</span>;<br>}<br><br><span class="hljs-function"><span class="hljs-keyword">inline</span> <span class="hljs-type">int</span> <span class="hljs-title">get</span><span class="hljs-params">(myHeap heap)</span> </span>{<br> <span class="hljs-keyword">return</span> heap.value[<span class="hljs-number">0</span>];<br>}<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">getPop</span><span class="hljs-params">(myHeap &heap)</span> </span>{<br> <span class="hljs-type">int</span> temp = <span class="hljs-built_in">get</span>(heap);<br> <span class="hljs-built_in">pop</span>(heap);<br> <span class="hljs-keyword">return</span> temp;<br>}<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">int</span> n;<br> cin>>n;<br> <span class="hljs-type">int</span> temp;<br> myHeap test;<br> test.length = <span class="hljs-number">0</span>;<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>;i < n;i++) {<br> cin>>temp;<br> <span class="hljs-built_in">push</span>(test, temp);<br> }<br> <span class="hljs-type">int</span> power = <span class="hljs-number">0</span>;<br> <span class="hljs-keyword">while</span>(test.length != <span class="hljs-number">1</span>) {<br> <span class="hljs-type">int</span> quick[<span class="hljs-number">2</span>] = {<span class="hljs-built_in">getPop</span>(test), <span class="hljs-built_in">getPop</span>(test)};<br> power += quick[<span class="hljs-number">0</span>] + quick[<span class="hljs-number">1</span>];<br> <span class="hljs-built_in">push</span>(test, quick[<span class="hljs-number">0</span>] + quick[<span class="hljs-number">1</span>]);<br> }<br> cout<<power<<endl;<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><p>其中<code>get</code>函数用于返回堆顶元素,不要也可以,毕竟很简单。</p><p>对于这一题是可以AC的,没有问题。</p><h3 id="堆排序"><a class="markdownIt-Anchor" href="#堆排序"></a> 堆排序</h3><p>既然小根堆的堆顶元素永远最小,那么只要每次都取出堆顶元素直到堆为空不就可以排序了吗?没错,这就是堆排序,时间复杂度为O(nlogn),十分优秀。</p><p>代码我就不讲了,自己看吧:</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></pre></td><td class="code"><pre><code class="hljs cpp"><span class="hljs-comment">//...</span><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-type">int</span> n;<br> cin>>n;<br> <span class="hljs-type">int</span> temp;<br> myHeap test;<br> test.length = <span class="hljs-number">0</span>;<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>;i < n;i++) {<br> cin>>temp;<br> <span class="hljs-built_in">push</span>(test, temp);<br> }<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>; i < n; i++) cout<<<span class="hljs-built_in">getPop</span>(test)<<<span class="hljs-string">" "</span>;<br> cout<<endl;<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><p>数据量大的时候可以考虑堆排序,因为堆排序的耗时主要在建堆上,建好堆后的调整实际上非常快。</p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>终于写完了…写了我整整三小时啊!</p><p>明天大概也许会有一篇关于图的,以及一篇关于类的。</p><p>886!</p>]]></content>
<summary type="html"><p>马上就是今年的CSP-J了,一想起自己还有那么多数据结构没学就有点头皮发麻…这篇博文里我就来讲一下堆(Heap),一是方便他人,二是给自己巩固思路。</p></summary>
<category term="编程" scheme="https://www.ordchaos.com/categories/%E7%BC%96%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="cpp" scheme="https://www.ordchaos.com/tags/cpp/"/>
</entry>
<entry>
<title>在线写作与博文分享—— NetlifyCMS 与 ShareThis</title>
<link href="https://www.ordchaos.com/posts/8e1b39a3/"/>
<id>https://www.ordchaos.com/posts/8e1b39a3/</id>
<published>2022-09-10T15:10:28.000Z</published>
<updated>2024-02-13T14:05:28.000Z</updated>
<content type="html"><![CDATA[<p>没错,任何正常人都不会把标题里这两样东西联系起来,包括我。</p><span id="more"></span><h2 id="netlifycms"><a class="markdownIt-Anchor" href="#netlifycms"></a> NetlifyCMS</h2><p>最开始看到这玩意是在fluid的官方博客的这一篇博文<a href="https://hexo.fluid-dev.com/posts/hexo-netlify/">Hexo Netlify CMS 在线编辑博客</a>(转载的,原文地址在<a href="https://www.myql.xyz/post/e00ab0f6/">这里</a>),当时就觉得非常不错,但可惜未能按照教程配置成功,只得转投于更贴合于Hexo的HexoPlusPlus<span class="heimu" title="你知道的太多了">Hexo艹</span></p><p>直到<s>前几天</s>上个月看到 @Xingyang 在<a href="https://www.ordchaos.com/posts/10824f12/">一键推流工具——BlogPusher</a>这一篇文章下的<a href="https://www.ordchaos.com/posts/10824f12/#7c90660dd62143d2bd9db227ab9db8a6">评论</a>:</p><blockquote><p>如果静态博客是部署在 Github 上的话可以试试用 Netlify CMS。相当于架设一个能进行 Git Commit 的 Web app,最重要的就是 0 花费,Private Repo 也可以用。我自己的博客也在用(虽然文章数不是很多())</p><p>参考文章:<a href="https://cnly.github.io/2018/04/14/just-3-steps-adding-netlify-cms-to-existing-github-pages-site-within-10-minutes.html">https://cnly.github.io/2018/04/14/just-3-steps-adding-netlify-cms-to-existing-github-pages-site-within-10-minutes.html</a></p></blockquote><p>很好,但是不太符合我的情况。于是随即翻了翻——</p><p><img src="https://img.ordchaos.com/img/2022/09/c9dcce95c9ac5cc0b374d8f6f30977ee.png" alt="" /></p><p>瞳 孔 地 震.jpg</p><p>完全可用!撒花!</p><p>如果你也没有成功配置Netlify CMS的话也可以试试,教程十分甚至九分简单,个人感觉几乎不存在出错的可能性。</p><p>感谢@Xingyang!</p><h2 id="sharethis-2024213更新-已失效"><a class="markdownIt-Anchor" href="#sharethis-2024213更新-已失效"></a> ShareThis (2024.2.13更新 已失效)</h2><p>最开始捣鼓了一阵子分享系统,share.js啊,Social Share Button啊等等都尝试过一遍,但我都不太满意,况且分享也不是刚需,于是就此作罢。</p><p>直到昨天,我妈问我:“你这个博客怎么分享给别人看啊?”</p><p>我突然感觉分享还是有必要的,遂继续开始寻觅,然后就发现了<a href="https://sharethis.com/">ShareThis</a></p><h3 id="注册"><a class="markdownIt-Anchor" href="#注册"></a> 注册</h3><p>非常简单,进入首页:<a href="https://sharethis.com">https://sharethis.com</a></p><p><img src="https://img.ordchaos.com/img/2022/09/d4c3d172f93f30f67583d155923d9356.png" alt="" /></p><p>点击“从分享按钮开始”,然后点击第一个选项:</p><p><img src="https://img.ordchaos.com/img/2022/09/4b1cd38081ce95ec0d3f91679e4fbcc0.png" alt="" /></p><p>不要急着点击下一步,先用滚轮滚动到页面下方,点击“Customize your Inline Share Buttons”按钮。</p><p>在弹出的选项中对按钮进行配置,可以配置包括颜色、媒体、形状等等内容。</p><p><img src="https://img.ordchaos.com/img/2022/09/4f24034eb100769f87e8264232d51d65.png" alt="" /></p><p>最下方的语言记得调整为中文,然后点击下一步,在新页面中注册登录即可。</p><p>随后,你会得到两串代码,分别是js安装代码与按钮引入代码。安装代码放在head中,按钮放在你想插入的地方就好。</p><p>大概如下:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-comment"><!-- 安装 --></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">'text/javascript'</span> <span class="hljs-attr">src</span>=<span class="hljs-string">'https://platform-api.sharethis.com/js/sharethis.js#property=不告诉你&product=inline-share-buttons'</span> <span class="hljs-attr">async</span>=<span class="hljs-string">'async'</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br></code></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-comment"><!-- 按钮插入 --></span><br><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"sharethis-inline-share-buttons"</span>></span><span class="hljs-tag"></<span class="hljs-name">div</span>></span><br></code></pre></td></tr></table></figure><h3 id="效果"><a class="markdownIt-Anchor" href="#效果"></a> 效果</h3><p>滑到这篇文章底下看吧。</p><h2 id="题外话"><a class="markdownIt-Anchor" href="#题外话"></a> 题外话</h2><p>这篇博文算是对近期我对博客的大改动,但是单独发太短,所以就这么整合在一起了。</p><p>那就这样,这篇博文就到这里,886!</p>]]></content>
<summary type="html"><p>没错,任何正常人都不会把标题里这两样东西联系起来,包括我。</p></summary>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="教程" scheme="https://www.ordchaos.com/tags/%E6%95%99%E7%A8%8B/"/>
<category term="Hexo" scheme="https://www.ordchaos.com/tags/Hexo/"/>
</entry>
<entry>
<title>满十四,进十五。愿我青春无悔,不负韶华</title>
<link href="https://www.ordchaos.com/posts/e84bad58/"/>
<id>https://www.ordchaos.com/posts/e84bad58/</id>
<published>2022-08-24T20:00:00.000Z</published>
<updated>2022-08-24T20:00:00.000Z</updated>
<content type="html"><![CDATA[<p>又大了一岁呢…</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/da8138b304fd8dba9eb05ba164be31d0.png" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/b760f4236a451e9d1c3647c2980c05b1.png" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/a99983480ddc5f853f9ab163950badb4.png" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/c6d48548ba4fc1549c53856aabaaf0f1.png" alt="" /></div></div></div><p>令青春无悔,愿韶华不负!</p><p>希望明年的此刻,我能够无愧于自己。</p>]]></content>
<summary type="html">十五岁啦!希望初三及中考顺利!</summary>
<category term="日常" scheme="https://www.ordchaos.com/categories/%E6%97%A5%E5%B8%B8/"/>
<category term="短文" scheme="https://www.ordchaos.com/categories/%E7%9F%AD%E6%96%87/"/>
<category term="生日" scheme="https://www.ordchaos.com/tags/%E7%94%9F%E6%97%A5/"/>
<category term="短文" scheme="https://www.ordchaos.com/tags/%E7%9F%AD%E6%96%87/"/>
</entry>
<entry>
<title>生日当天全款提下第一支(打八折)钟薛糕</title>
<link href="https://www.ordchaos.com/posts/7e920bb4/"/>
<id>https://www.ordchaos.com/posts/7e920bb4/</id>
<published>2022-08-24T17:46:00.000Z</published>
<updated>2022-08-24T17:46:00.000Z</updated>
<content type="html"><![CDATA[<p><s>送给自己的生日礼物</s></p><p>我是大怨种</p><div class="group-image-container"><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/fd9dcb7f65d8d55b1f9c4c4b867a133d.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/30607022e7f945e8b3e24eff393908df.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://assets.ordchaos.com/img/2022/08/669b394060ffca06144d1d7ff6a1f7c7.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/8acba6be590b8d1575c0e211104c809f.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/4361452e2168b0346f0f2966bd2c3712.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/55c2e66f6be83cf83ab994a9aa1469db.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/15016decccaa2c1372e084971822d5cc.jpg" alt="" /></div><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/308549393db11192800f256acfb01202.jpg" alt="" /></div></div><div class="group-image-row"><div class="group-image-wrap"><img src="https://img.ordchaos.com/img/2022/08/d4def032036a47272ad4a4d92386d42e.jpg" alt="" /></div></div></div>]]></content>
<summary type="html">记我的第一支(不知道是不是最后一支)钟薛糕</summary>
<category term="日常" scheme="https://www.ordchaos.com/categories/%E6%97%A5%E5%B8%B8/"/>
<category term="短文" scheme="https://www.ordchaos.com/categories/%E7%9F%AD%E6%96%87/"/>
<category term="生日" scheme="https://www.ordchaos.com/tags/%E7%94%9F%E6%97%A5/"/>
<category term="短文" scheme="https://www.ordchaos.com/tags/%E7%9F%AD%E6%96%87/"/>
</entry>
<entry>
<title>Phigros 版本迁移——从 Google Play 到 Tap Tap</title>
<link href="https://www.ordchaos.com/posts/e8587b82/"/>
<id>https://www.ordchaos.com/posts/e8587b82/</id>
<published>2022-08-21T18:20:50.000Z</published>
<updated>2022-08-21T18:20:50.000Z</updated>
<content type="html"><![CDATA[<h2 id="起因"><a class="markdownIt-Anchor" href="#起因"></a> 起因</h2><p>Google Play的版本更新总是慢一些,不知道你行不行,但是我是忍不了别人都玩上了新曲而我却还不能玩的感觉,遂决定迁移存档。</p><h2 id="过程"><a class="markdownIt-Anchor" href="#过程"></a> 过程</h2><p>大体参考这一篇文章<a href="https://www.bilibili.com/read/cv13597100">Phigros存档跨版本转移教程(免root)</a>即可,在这里稍微提一下我遇到的问题</p><h3 id="解决问题"><a class="markdownIt-Anchor" href="#解决问题"></a> 解决问题</h3><p>在使用abe.jar时,Java报错:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">Error: A JNI error has occurred, please check your installation and try again<br></code></pre></td></tr></table></figure><p>首先在网上查询,找到的第一个方法是删除电脑里共存的JDK,只留下一个,使<code>java -version</code>与<code>javac -version</code>有相同的版本。</p><p>我照做,删除了java8,只留下了openjdk17,但是毫无卵用。</p><p>于是我继续查询,发现在<a href="https://www.bilibili.com/video/av344511919">跨!系!统!转!移!支持安卓和IOS的跨系统存档转移工具!Phigros 存档 IOS 跨系统 备份 还原 转移 同步</a>这一视频中所提供的工具里的abe.jar可用。</p><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h2><p>如果你也遇到了一样的问题,可以参考我的方法看看是否有效。</p><p>若不想下载整个备份工具而只想要abe.jar的话,可以从这里下载:<a href="https://www.lanzoui.com/i4D2S09yzwab">链接</a>(如有侵权,请联系我删除)</p>]]></content>
<summary type="html">Google Play的版本更新总是慢一些,不知道你行不行,但是我是忍不了别人都玩上了新曲而我却还不能玩的感觉,遂决定迁移存档</summary>
<category term="教程" scheme="https://www.ordchaos.com/categories/%E6%95%99%E7%A8%8B/"/>
<category term="Phigros" scheme="https://www.ordchaos.com/categories/Phigros/"/>
<category term="计算机" scheme="https://www.ordchaos.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
<category term="编程" scheme="https://www.ordchaos.com/tags/%E7%BC%96%E7%A8%8B/"/>
<category term="教程" scheme="https://www.ordchaos.com/tags/%E6%95%99%E7%A8%8B/"/>
<category term="adb" scheme="https://www.ordchaos.com/tags/adb/"/>
<category term="手机" scheme="https://www.ordchaos.com/tags/%E6%89%8B%E6%9C%BA/"/>
<category term="phigros" scheme="https://www.ordchaos.com/tags/phigros/"/>
</entry>
</feed>