-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
1203 lines (579 loc) · 765 KB
/
search.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
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Insertion Sort</title>
<link href="/2019/08/23/Insertion-Sort/"/>
<url>/2019/08/23/Insertion-Sort/</url>
<content type="html"><![CDATA[<h1 id="Insertion-Sort"><a href="#Insertion-Sort" class="headerlink" title="Insertion Sort"></a>Insertion Sort</h1><p>标签: 数学</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p><a href="https://codeforces.com/gym/101955/problem/C" target="_blank" rel="noopener">戳这里</a></p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>首先我们可以分$LIS$为$n$和$n-1$两种情况。<br>对于$LIS$为$n$的情况很简单,只能将$1-k$放在前$k$个位置,答案为${A_{k}}^{k}$<br>现在我们来讨论$LIS$为$n-1$的情况。我们可以考虑枚举放在前$k$个位置中的最大值$maxn$<br>1.当$maxn=k$时,那么后$n-k$必须有一个错位,即有一个数不在原来的位置(emmm可以理解为相对位置),通过手画找规律发现这样的方案数为$(n-k-1)^2$<br>2.当$maxn=k+1$时,那么剩下$k-1$个位置有${C_{k+1}}^{k}=k-1$种选法且多出来的那个在后面有$n-k$种插入方式。即方案数为$k*(n-k)$<br>3.当$maxn>k+1$时,此时$k-1$的位置只能选$1,2,3…k-1$且后面全部有序,方案数为$n-k-1$<br>综上所述<br>$Ans = {A_{k}}^{k}+{A_{k}}^{k}(k(n-k)+(n-k-1)+(n-k-1)^2)$</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>ll t<span class="token punctuation">,</span> n<span class="token punctuation">,</span> k<span class="token punctuation">,</span> p<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> ll cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld%lld%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>k<span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> ll fac <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>k<span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> k<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> fac <span class="token operator">=</span> fac <span class="token operator">*</span> i <span class="token operator">%</span> p<span class="token punctuation">;</span> ll ans <span class="token operator">=</span> <span class="token punctuation">(</span>fac <span class="token operator">*</span> k <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">-</span> k<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>n <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> fac <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> ans <span class="token operator">+</span> fac <span class="token operator">+</span> <span class="token punctuation">(</span>fac <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> ans <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Case #%lld: %lld\n"</span><span class="token punctuation">,</span> <span class="token operator">++</span> cnt<span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 数学 </tag>
</tags>
</entry>
<entry>
<title>Codeforces Round 580 (Div. 2) D</title>
<link href="/2019/08/22/Codeforces-Round-580-Div-2-D/"/>
<url>/2019/08/22/Codeforces-Round-580-Div-2-D/</url>
<content type="html"><![CDATA[<h1 id="Codeforces-Round-580-Div-2-D"><a href="#Codeforces-Round-580-Div-2-D" class="headerlink" title="Codeforces Round #580 (Div. 2) D"></a>Codeforces Round #580 (Div. 2) D</h1><p>标签: Floyd 二进制拆分</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p><a href="https://codeforces.com/contest/1206/problem/D" target="_blank" rel="noopener">戳这里</a></p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>首先对于这种涉及二进制的运算我们容易想到二进制拆分,对于每一位我们开一个$vector$,表示有多少个值这一位为$1$,那么对于$vector[i]$里面的所有值互相都可以连边,即为一个完全图。而题目要求最小环,那么如果$vector.size()>=3$,直接输出$3$即可,否则就建边。<br>于是问题就转换成求图中最小环(<del>然后YY了一个dfs的假做法卡到自闭</del>)用$Floyd$算法即可求最小环</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 100010</span><span class="token macro property">#<span class="token directive keyword">define</span> M 1010</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>ll n<span class="token punctuation">,</span> bin <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> maxn<span class="token punctuation">,</span> cnt<span class="token punctuation">,</span> ans<span class="token punctuation">,</span> k<span class="token punctuation">,</span> bid<span class="token punctuation">;</span>ll a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> d<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> vis<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>vector<span class="token operator"><</span>ll<span class="token operator">></span> w<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">;</span>map<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">></span> m<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%I64d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%I64d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> maxn <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> maxn<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">while</span><span class="token punctuation">(</span>bin <span class="token operator"><=</span> maxn<span class="token punctuation">)</span> bin <span class="token operator"><<=</span> <span class="token number">1</span><span class="token punctuation">,</span> cnt <span class="token operator">++</span><span class="token punctuation">;</span> ll b <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> cnt<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">,</span> b <span class="token operator">*</span><span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">&</span> b<span class="token punctuation">)</span> w<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> cnt<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>w<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"3"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token function">memset</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span> <span class="token number">0x3f3f3f3f</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token number">0x3f3f3f3f</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> cnt<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>w<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token keyword">int</span> u <span class="token operator">=</span> w<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> v <span class="token operator">=</span> w<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>m<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">)</span> m<span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">++</span> bid<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>m<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">)</span> m<span class="token punctuation">[</span>v<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">++</span> bid<span class="token punctuation">;</span> d<span class="token punctuation">[</span>m<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>m<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> d<span class="token punctuation">[</span>m<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>m<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span>m<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>m<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>m<span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>m<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> bid<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> <span class="token number">1061109567</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> bid<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> k<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><</span> k<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">==</span> j<span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>ans<span class="token punctuation">,</span> <span class="token punctuation">(</span>ll<span class="token punctuation">)</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> bid<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> bid<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> d<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span><span class="token punctuation">(</span>ans <span class="token operator">==</span> <span class="token number">1061109567</span><span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"-1\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%I64d\n"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>图论的知识好菜啊QAQ</p>]]></content>
<categories>
<category> 图论 </category>
</categories>
<tags>
<tag> floyd </tag>
<tag> 二进制拆分 </tag>
</tags>
</entry>
<entry>
<title>Cubes UVALive - 7708</title>
<link href="/2019/08/18/Cubes-UVALive-7708/"/>
<url>/2019/08/18/Cubes-UVALive-7708/</url>
<content type="html"><![CDATA[<h1 id="Cubes-UVALive-7708"><a href="#Cubes-UVALive-7708" class="headerlink" title="Cubes UVALive - 7708"></a>Cubes UVALive - 7708</h1><p>标签: 搜索</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p><a href="https://nanti.jisuanke.com/t/A1888" target="_blank" rel="noopener">戳这里</a><br>题目大意:给你一个数$n$,要求将$n$分解成$m$个数的立方和,要求$m$最小且输出方案</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>很容易能想到这道题可以用记忆化搜索,设$f[i]$表示数字为$i$时最少分解次数。然后我们就枚举每个数的三次方,可以发现这个数最大不会超过$356$,然后用当前数$x$减去枚举数的三次方$i\ast i\ast i$作为下一层递归的数字,即为$x-i\ast i\ast i$。当发现$f[x]$的值已经存在时,我们就不用递归往下了,可以记录答案了。<br>那么本题最重要的剪枝其实就一个:最优性剪枝。<br>我们每次递归到$f[x]$存在时,就用一个$ans$记录当前已经统计到的答案(不一定最优),在$dfs$时记录一个参数$cnt$,表示当前已经用了$cnt$次,如果你发现$cnt+x/(i\ast i\ast i)>=ans$,那么就可以直接$break$掉了。<br>这里要强调的是,判定式必须用$>=$而不是$>$,虽然看似没什么区别,可能后者会计算次数多一点。但打表发现,当数字较大时,它的分解次数其实会很小,一般只有$4$或$5$次,而$cnt$多一次,递归次数会多大概一个数量级的次数,所以这个时间效率我们不能忽视。<br>eg:<br>对于$44777444$这个数据,如果判定式用$>$,那么程序大概会跑$4$亿次,而如果换成$>=$,程序只用跑$1600$万次。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 46000000</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> ass<span class="token punctuation">;</span><span class="token keyword">int</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> to<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> wo<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> id<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">cmp</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> a <span class="token operator">></span> b<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> y<span class="token punctuation">,</span> <span class="token keyword">int</span> fr<span class="token punctuation">,</span> <span class="token keyword">int</span> c<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>y <span class="token operator">></span> ass<span class="token punctuation">)</span> <span class="token keyword">return</span> N<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>ass <span class="token operator">></span> y <span class="token operator">+</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span> ass <span class="token operator">=</span> y <span class="token operator">+</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">return</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> ans <span class="token operator">=</span> N<span class="token punctuation">,</span> tt<span class="token punctuation">,</span> ww<span class="token punctuation">,</span> dd<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>y <span class="token operator">+</span> <span class="token function">max</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> x <span class="token operator">/</span> <span class="token punctuation">(</span>c <span class="token operator">*</span> c <span class="token operator">*</span>c<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">>=</span> ass<span class="token punctuation">)</span> <span class="token keyword">return</span> N<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> c<span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">*</span> i <span class="token operator">*</span> i <span class="token operator">></span> x<span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token keyword">int</span> w <span class="token operator">=</span> x <span class="token operator">/</span> <span class="token punctuation">(</span>i <span class="token operator">*</span> i <span class="token operator">*</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>y <span class="token operator">+</span> w <span class="token operator">>=</span> ass<span class="token punctuation">)</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">int</span> t <span class="token operator">=</span> <span class="token function">dfs</span><span class="token punctuation">(</span>x <span class="token operator">-</span> <span class="token punctuation">(</span>i <span class="token operator">*</span> i <span class="token operator">*</span> i<span class="token punctuation">)</span><span class="token punctuation">,</span> y <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> fr<span class="token punctuation">,</span> i<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>ans <span class="token operator">></span> t<span class="token punctuation">)</span> ans <span class="token operator">=</span> t<span class="token punctuation">,</span> tt <span class="token operator">=</span> x <span class="token operator">-</span> <span class="token punctuation">(</span>i <span class="token operator">*</span> i <span class="token operator">*</span> i<span class="token punctuation">)</span><span class="token punctuation">,</span> ww <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> dd <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span><span class="token punctuation">(</span>ans <span class="token operator">!=</span> N<span class="token punctuation">)</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> ans<span class="token punctuation">,</span> to<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> tt<span class="token punctuation">,</span> wo<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> ww<span class="token punctuation">,</span> id<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> dd<span class="token punctuation">;</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>to<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>to<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> ass <span class="token operator">=</span> <span class="token number">20</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">356</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> x <span class="token operator">=</span> i <span class="token operator">*</span> i <span class="token operator">*</span> i<span class="token punctuation">;</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> to<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> id<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> wo<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">1e5</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> ass <span class="token operator">=</span> <span class="token number">2000</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">dfs</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> <span class="token number">356</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token constant">EOF</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ass <span class="token operator">=</span> <span class="token number">2000</span><span class="token punctuation">;</span> <span class="token keyword">int</span> ans <span class="token operator">=</span> <span class="token function">dfs</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> n<span class="token punctuation">,</span> <span class="token number">356</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> x <span class="token operator">=</span> n<span class="token punctuation">,</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> b<span class="token punctuation">[</span><span class="token number">20</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> cnt<span class="token punctuation">;</span> i <span class="token operator"><</span> cnt <span class="token operator">+</span> wo<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> b<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> id<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> cnt <span class="token operator">+</span><span class="token operator">=</span> wo<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> x <span class="token operator">=</span> to<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">sort</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> b <span class="token operator">+</span> cnt<span class="token punctuation">,</span> cmp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> cnt<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d "</span><span class="token punctuation">,</span> b<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>有时候往往一个小细节就影响了程序的效率,这主要还是决定于题目的性质,不过我们还是尽量采用高效的方法来写代码,不放过优化的地方。</p>]]></content>
<categories>
<category> 搜索 </category>
</categories>
<tags>
<tag> 搜索 </tag>
</tags>
</entry>
<entry>
<title>uvalive 6902 Three Squares</title>
<link href="/2019/08/18/uvalive-6902-Three-Squares/"/>
<url>/2019/08/18/uvalive-6902-Three-Squares/</url>
<content type="html"><![CDATA[<h1 id="uvalive-6902-Three-Squares"><a href="#uvalive-6902-Three-Squares" class="headerlink" title="uvalive 6902 Three Squares"></a>uvalive 6902 Three Squares</h1><p>标签: 二分 搜索</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p><a href="https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4914" target="_blank" rel="noopener">戳这里</a><br>题目大意:给你n个点,请确定正方形的最小边长使得用三个这样的正方形可以覆盖n个点</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>首先可以发现答案具有单调性,可以二分答案正方形边长$len$,然后就是怎么验证的问题了(<del>考场写了个假贪心浪费半小时</del>)这里题解直接用的搜索,即枚举当前剩余点,确定左上角,右上角,左下角,右下角,那么当前正方形肯定会放在这四个角之一,然后递归搜索即可。复杂度大约为$O(64*nlog(n))$<br>注意回溯时候要取消当前覆盖的点。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 100010</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> l<span class="token punctuation">,</span> r<span class="token punctuation">;</span><span class="token keyword">int</span> re<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> vis<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">struct</span> node<span class="token punctuation">{</span> <span class="token keyword">int</span> x<span class="token punctuation">,</span> y<span class="token punctuation">;</span><span class="token punctuation">}</span>p<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">getmax</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">&</span>x<span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token operator">&</span>y<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1e9</span><span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1e9</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a <span class="token operator"><</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span> a <span class="token operator">=</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator"><</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y<span class="token punctuation">)</span> b <span class="token operator">=</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y<span class="token punctuation">;</span> <span class="token punctuation">}</span> x <span class="token operator">=</span> a<span class="token punctuation">;</span> y <span class="token operator">=</span> b<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">getmin</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">&</span>x<span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token operator">&</span>y<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">1e9</span><span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token number">1e9</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a <span class="token operator">></span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span> a <span class="token operator">=</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">></span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y<span class="token punctuation">)</span> b <span class="token operator">=</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y<span class="token punctuation">;</span> <span class="token punctuation">}</span> x <span class="token operator">=</span> a<span class="token punctuation">;</span> y <span class="token operator">=</span> b<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">modify</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> y<span class="token punctuation">,</span> <span class="token keyword">int</span> xx<span class="token punctuation">,</span> <span class="token keyword">int</span> yy<span class="token punctuation">,</span> <span class="token keyword">int</span> cnt<span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token operator">&</span>tot<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">&&</span> x <span class="token operator"><=</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x <span class="token operator">&&</span> y <span class="token operator"><=</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y<span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x <span class="token operator"><=</span> xx <span class="token operator">&&</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y <span class="token operator"><=</span> yy<span class="token punctuation">)</span> vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> tot <span class="token operator">++</span><span class="token punctuation">,</span> re<span class="token punctuation">[</span>cnt <span class="token operator">+</span> tot<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">/* printf("%d %d", l, r); system("pause"); if(((l + r) >> 1) == 1) { printf("%d %d", cnt, tot); system("pause"); for(int i = cnt + 1; i <= cnt + tot; i ++) printf("%d %d\n", p[re[i]].x, p[re[i]].y); system("pause"); } */</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">cancel</span><span class="token punctuation">(</span><span class="token keyword">int</span> st<span class="token punctuation">,</span> <span class="token keyword">int</span> ed<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> st <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> ed<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> vis<span class="token punctuation">[</span>re<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">bool</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token keyword">int</span> l<span class="token punctuation">,</span> <span class="token keyword">int</span> c<span class="token punctuation">,</span> <span class="token keyword">int</span> cnt<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>c <span class="token operator">></span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> cnt <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>cnt <span class="token operator">==</span> n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> dx<span class="token punctuation">,</span> dy<span class="token punctuation">;</span> <span class="token function">getmax</span><span class="token punctuation">(</span>dx<span class="token punctuation">,</span> dy<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> ddx<span class="token punctuation">,</span> ddy<span class="token punctuation">;</span> <span class="token function">getmin</span><span class="token punctuation">(</span>ddx<span class="token punctuation">,</span> ddy<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//printf("l=%d c=%d cnt=%d", l, c, cnt); system("pause");</span> <span class="token comment" spellcheck="true">//for(int i = 1; i <= n; i ++)</span> <span class="token comment" spellcheck="true">// if(vis[i]) printf("%d %d\n", p[i].x, p[i].y);</span> <span class="token comment" spellcheck="true">//system("pause");</span> <span class="token comment" spellcheck="true">//左下角</span> <span class="token function">modify</span><span class="token punctuation">(</span>ddx<span class="token punctuation">,</span> ddy<span class="token punctuation">,</span> ddx <span class="token operator">+</span> l<span class="token punctuation">,</span> ddy <span class="token operator">+</span> l<span class="token punctuation">,</span> cnt<span class="token punctuation">,</span> tot<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">dfs</span><span class="token punctuation">(</span>l<span class="token punctuation">,</span> c <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> cnt <span class="token operator">+</span> tot<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token function">cancel</span><span class="token punctuation">(</span>cnt<span class="token punctuation">,</span> cnt <span class="token operator">+</span> tot<span class="token punctuation">)</span><span class="token punctuation">;</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//左上角</span> <span class="token function">modify</span><span class="token punctuation">(</span>ddx<span class="token punctuation">,</span> ddy <span class="token operator">-</span> l<span class="token punctuation">,</span> ddx <span class="token operator">+</span> l<span class="token punctuation">,</span> ddy<span class="token punctuation">,</span> cnt<span class="token punctuation">,</span> tot<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">dfs</span><span class="token punctuation">(</span>l<span class="token punctuation">,</span> c <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> cnt <span class="token operator">+</span> tot<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token function">cancel</span><span class="token punctuation">(</span>cnt<span class="token punctuation">,</span> cnt <span class="token operator">+</span> tot<span class="token punctuation">)</span><span class="token punctuation">;</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//右下角</span> <span class="token function">modify</span><span class="token punctuation">(</span>dx <span class="token operator">-</span> l<span class="token punctuation">,</span> ddy<span class="token punctuation">,</span> dx<span class="token punctuation">,</span> ddy <span class="token operator">+</span> l<span class="token punctuation">,</span> cnt<span class="token punctuation">,</span> tot<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">dfs</span><span class="token punctuation">(</span>l<span class="token punctuation">,</span> c <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> cnt <span class="token operator">+</span> tot<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token function">cancel</span><span class="token punctuation">(</span>cnt<span class="token punctuation">,</span> cnt <span class="token operator">+</span> tot<span class="token punctuation">)</span><span class="token punctuation">;</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//右上角</span> <span class="token function">modify</span><span class="token punctuation">(</span>dx <span class="token operator">-</span> l<span class="token punctuation">,</span> dy <span class="token operator">-</span> l<span class="token punctuation">,</span> dx<span class="token punctuation">,</span> dy<span class="token punctuation">,</span> cnt<span class="token punctuation">,</span> tot<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">dfs</span><span class="token punctuation">(</span>l<span class="token punctuation">,</span> c <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> cnt <span class="token operator">+</span> tot<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token function">cancel</span><span class="token punctuation">(</span>cnt<span class="token punctuation">,</span> cnt <span class="token operator">+</span> tot<span class="token punctuation">)</span><span class="token punctuation">;</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> t<span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x<span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y<span class="token punctuation">)</span><span class="token punctuation">;</span> l <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> r <span class="token operator">=</span> <span class="token number">2e9</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//dfs(1, 1, 0);</span> <span class="token keyword">while</span><span class="token punctuation">(</span>l <span class="token operator"><</span> r<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>vis<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>vis<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> mid <span class="token operator">=</span> <span class="token punctuation">(</span>l <span class="token operator">+</span> r<span class="token punctuation">)</span> <span class="token operator">>></span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">dfs</span><span class="token punctuation">(</span>mid<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> r <span class="token operator">=</span> mid<span class="token punctuation">;</span> <span class="token keyword">else</span> l <span class="token operator">=</span> mid <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> r<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre>]]></content>
<categories>
<category> 搜索 </category>
</categories>
<tags>
<tag> 搜索 </tag>
<tag> 二分 </tag>
</tags>
</entry>
<entry>
<title>跑路</title>
<link href="/2019/08/11/%E8%B7%91%E8%B7%AF/"/>
<url>/2019/08/11/%E8%B7%91%E8%B7%AF/</url>
<content type="html"><![CDATA[<h1 id="跑路"><a href="#跑路" class="headerlink" title="跑路"></a>跑路</h1><p>标签(空格分隔): 倍增 Floyd</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p><a href="https://www.luogu.org/problem/P1613" target="_blank" rel="noopener">戳这里</a></p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>这道题如果路径是$2^k$则花费为1,我们可以利用这个性质用Floyd的思想把路径长度为$2^k$的点对处理出来,$dis[i][j][k]$表示$i$到$j$存在一条长度为$2^k$的路径。<br>这个处理出来以后,我们设$f[i][j]$表示$i$到$j$的最小花费,若原来$dis[i][j][k]$存在,则$f[i][j]=1$,否则$f[i][j]=INF$<br>然后对$f$跑一次Folyd即可</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 60</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> m<span class="token punctuation">,</span> u<span class="token punctuation">,</span> v<span class="token punctuation">;</span><span class="token keyword">bool</span> d<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token number">0x3f3f3f3f</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> m<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>u<span class="token punctuation">,</span> <span class="token operator">&</span>v<span class="token punctuation">)</span><span class="token punctuation">;</span> d<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">[</span>v<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> b <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> b <span class="token operator"><=</span> <span class="token number">32</span><span class="token punctuation">;</span> b <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> n<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>b <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&&</span> d<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>b <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> b <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> b <span class="token operator"><=</span> <span class="token number">32</span><span class="token punctuation">;</span> b <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>b<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">// printf("%d %d %d", i, j, b), system("pause");</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> n<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre>]]></content>
<categories>
<category> 图论 </category>
</categories>
<tags>
<tag> 倍增 </tag>
<tag> Floyd </tag>
</tags>
</entry>
<entry>
<title>Sum of the Line</title>
<link href="/2019/08/11/Sum-of-the-Line/"/>
<url>/2019/08/11/Sum-of-the-Line/</url>
<content type="html"><![CDATA[<h1 id="Sum-of-the-Line"><a href="#Sum-of-the-Line" class="headerlink" title="Sum of the Line"></a>Sum of the Line</h1><p>标签: 莫比乌斯反演 数学</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p><a href="https://nanti.jisuanke.com/t/40522" target="_blank" rel="noopener">戳这里</a><br>大意就是给你一个$n$,求在小于$n$里面与$n$互质的数的平方和是多少,即:</p><p>$$\sum_{i=1}^{n}i^{2}[gcd(n,i)==1]$$</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>比赛的时候和队友讨论出容斥的做法,不过想着是$2^p$的复杂度感觉不可行。结果没分析到在$1e8$内一个数的质因数不会超过9个。直接暴力枚举即可。<br>这里提供在wsy大佬以及Acoder的博客点拨下提供一种新的做法:莫比乌斯反演<br>我们设:</p><p>$$f(x)=\sum_{i=1}^{n}i^{2}[gcd(n,i)==1]$$</p><p>$$F(x)=\sum_{x|d}f(d)=\sum_{i=1}^{n}i^2[x|gcd(n,i)]$$</p><p>则:</p><p>$$Ans=f(1)=\sum_{d=1}^{n}u(d)F(d)$$</p><p>把$F(d)$展开后</p><p>$$Ans=\sum_{d|n}u(d)\sum_{i=1}^{\frac{n}{d}}(i*d)^2$$</p><p>把后面的和式展开后化简得:</p><p>$$\frac{n}{6}[2n\sum_{d|n}u(d)\frac{n}{d}+3n\sum_{d|n}u(d)+\sum_{d|n}u(d)d]$$</p><p>而$\sum_{d|n}u(d)\frac{n}{d}=\varphi (n)$, $\sum_{d|n}u(d)d$是一个积性函数,按照定义求即可</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 100010</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">const</span> ll p <span class="token operator">=</span> <span class="token number">998244353</span><span class="token punctuation">;</span><span class="token keyword">int</span> t<span class="token punctuation">,</span> n<span class="token punctuation">,</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>ll <span class="token function">pow_mul</span><span class="token punctuation">(</span>ll a<span class="token punctuation">,</span> ll b<span class="token punctuation">)</span><span class="token punctuation">{</span> ll ans <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">&</span> <span class="token number">1</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> a <span class="token operator">=</span> a <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> b <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span>ll <span class="token function">phi</span><span class="token punctuation">(</span>ll x<span class="token punctuation">)</span><span class="token punctuation">{</span> ll ans <span class="token operator">=</span> x<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span>ll c <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> c <span class="token operator">*</span> c <span class="token operator"><=</span> x<span class="token punctuation">;</span> c <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">%</span> c <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> ans <span class="token operator">-</span><span class="token operator">=</span> ans <span class="token operator">/</span> c<span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>x <span class="token operator">%</span> c <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> x <span class="token operator">/</span><span class="token operator">=</span> c<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> ans <span class="token operator">-</span><span class="token operator">=</span> ans <span class="token operator">/</span> x<span class="token punctuation">;</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span>ll <span class="token function">calc</span><span class="token punctuation">(</span>ll x<span class="token punctuation">)</span><span class="token punctuation">{</span> ll a1 <span class="token operator">=</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> a2 <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span>ll c <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> c <span class="token operator">*</span> c <span class="token operator"><=</span> x<span class="token punctuation">;</span> c <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">%</span> c <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> a2 <span class="token operator">=</span> a2 <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> c <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>x <span class="token operator">%</span> c <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> x <span class="token operator">/</span><span class="token operator">=</span> c<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> a2 <span class="token operator">=</span> a2 <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> x <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token number">3</span> <span class="token operator">*</span> n <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">*</span> a1 <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">+</span> a2<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> ll inv <span class="token operator">=</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">,</span> p <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> ll t <span class="token operator">=</span> n <span class="token operator">*</span> inv <span class="token operator">%</span> p<span class="token punctuation">;</span> ll ans <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> n <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token function">phi</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// printf("%lld", ans); system("pause");</span> ans <span class="token operator">=</span> <span class="token punctuation">(</span>ans <span class="token operator">+</span> <span class="token function">calc</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// printf("%lld", ans); system("pause");</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> t <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld\n"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>会数论的人就是可以为所欲为 orz</p>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 数学 </tag>
<tag> 莫比乌斯反演 </tag>
</tags>
</entry>
<entry>
<title>[AHOI2009]中国象棋</title>
<link href="/2019/07/09/AHOI2009-%E4%B8%AD%E5%9B%BD%E8%B1%A1%E6%A3%8B/"/>
<url>/2019/07/09/AHOI2009-%E4%B8%AD%E5%9B%BD%E8%B1%A1%E6%A3%8B/</url>
<content type="html"><![CDATA[<h1 id="AHOI2009-中国象棋"><a href="#AHOI2009-中国象棋" class="headerlink" title="[AHOI2009]中国象棋"></a>[AHOI2009]中国象棋</h1><p>标签: 动态规划 棋盘型</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧!</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式:"><a href="#输入格式:" class="headerlink" title="输入格式:"></a>输入格式:</h3><p>一行包含两个整数N,M,之间由一个空格隔开。</p><h3 id="输出格式:"><a href="#输出格式:" class="headerlink" title="输出格式:"></a>输出格式:</h3><p>总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果。</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1:<br>1 3</p><p>输出样例#1:<br>7</p><h2 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h2><p>分析题目性质可得,每一行每一列的炮不能超过两个。(三个及其以上肯定会攻击到)<br>因此我们可以枚举每一行,看如何放炮:<br>放0个,放1个,放两个,以及放的位置。<br>可知,当我们放炮时,放炮的合法性会受到列的影响(不能超过三个),因此我们需要把每列炮的数量这个状态记录下来。<br>设f[i][j][k]表示第i行有j列有一个炮,k列有两个炮,m-j-k列没有炮的方案数。<br>那么转移的话分类讨论即可。</p><pre class=" language-cpp"><code class="language-cpp">f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//不放 </span><span class="token comment" spellcheck="true">//放一个 </span><span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token punctuation">(</span>m <span class="token operator">-</span> j <span class="token operator">-</span> k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//放到没有炮的那一列中 </span><span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator"><</span> m <span class="token operator">&&</span> k <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token punctuation">(</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//放到一个炮的那一列中</span><span class="token comment" spellcheck="true">//放两个 </span><span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token function">C</span><span class="token punctuation">(</span>m <span class="token operator">-</span> j <span class="token operator">-</span> k <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//两个炮放到只有一个炮的列中 </span><span class="token keyword">if</span><span class="token punctuation">(</span>k <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> j <span class="token operator">*</span> <span class="token punctuation">(</span>m <span class="token operator">-</span> j <span class="token operator">-</span> k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//两个炮分别放到0炮的列中和1炮的列中 </span><span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator">+</span> <span class="token number">2</span> <span class="token operator"><=</span> m <span class="token operator">&&</span> k <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token function">C</span><span class="token punctuation">(</span>j <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//两个炮分别放到一炮的那一列中</span></code></pre><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 110</span><span class="token macro property">#<span class="token directive keyword">define</span> p 9999973</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> m<span class="token punctuation">;</span>ll f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll <span class="token function">C</span><span class="token punctuation">(</span>ll x<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span>x <span class="token operator">*</span> <span class="token punctuation">(</span>x <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> m<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator">+</span> j <span class="token operator"><=</span> m<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//不放 </span> <span class="token comment" spellcheck="true">//放一个 </span> <span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token punctuation">(</span>m <span class="token operator">-</span> j <span class="token operator">-</span> k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//放到没有炮的那一列中 </span> <span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator"><</span> m <span class="token operator">&&</span> k <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token punctuation">(</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//放到一个炮的那一列中</span> <span class="token comment" spellcheck="true">//放两个 </span> <span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token function">C</span><span class="token punctuation">(</span>m <span class="token operator">-</span> j <span class="token operator">-</span> k <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//两个炮放到只有一个炮的列中 </span> <span class="token keyword">if</span><span class="token punctuation">(</span>k <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> j <span class="token operator">*</span> <span class="token punctuation">(</span>m <span class="token operator">-</span> j <span class="token operator">-</span> k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//两个炮分别放到0炮的列中和1炮的列中 </span> <span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator">+</span> <span class="token number">2</span> <span class="token operator"><=</span> m <span class="token operator">&&</span> k <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token function">C</span><span class="token punctuation">(</span>j <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//两个炮分别放到一炮的那一列中 </span> <span class="token punctuation">}</span> ll ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> m<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator">+</span> j <span class="token operator"><=</span> m<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> ans <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">,</span> ans <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 棋盘型 </tag>
</tags>
</entry>
<entry>
<title>[SCOI2007]排列</title>
<link href="/2019/07/09/SCOI2007-%E6%8E%92%E5%88%97/"/>
<url>/2019/07/09/SCOI2007-%E6%8E%92%E5%88%97/</url>
<content type="html"><![CDATA[<h1 id="SCOI2007-排列"><a href="#SCOI2007-排列" class="headerlink" title="[SCOI2007]排列"></a>[SCOI2007]排列</h1><p>标签:动态规划 状态压缩 </p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0)。例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式:"><a href="#输入格式:" class="headerlink" title="输入格式:"></a>输入格式:</h3><p>输入第一行是一个整数T,表示测试数据的个数,以下每行一组s和d,中间用空格隔开。s保证只包含数字0, 1<br>, 2, 3, 4, 5, 6, 7, 8, 9.</p><h3 id="输出格式:"><a href="#输出格式:" class="headerlink" title="输出格式:"></a>输出格式:</h3><p>每个数据仅一行,表示能被d整除的排列的个数。</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1:<br>7<br>000 1<br>001 1<br>1234567890 1<br>123434 2<br>1234 7<br>12345 17<br>12345678 29</p><p>输出样例#1:<br>1<br>3<br>3628800<br>90<br>3<br>6<br>1398</p><p>HINT<br>在前三个例子中,排列分别有1, 3, 3628800种,它们都是1的倍数。</p><h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>100%的数据满足:s的长度不超过10, 1<=d<=1000, 1<=T<=15</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>首先看到s很小,所以我们可以把s的状态压缩起来,题目还涉及是d的倍数,所以还需要一维记录余数。<br>设f[i][j]表示状态为i时余数为j的方案数。<br>那么每次枚举一个数,如果这个数没在i中出现过,就把他放到末尾(也可以放到首位,不过处理起来相对麻烦一些),并更新状态。</p><pre class=" language-cpp"><code class="language-cpp">f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> k<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">(</span>j <span class="token operator">*</span> <span class="token number">10</span> <span class="token operator">+</span> num<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> d<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span></code></pre><p>需要注意的是,因为数字有重复现象,所以我们最后答案要对每一个数字除以cnt[i]!<br>cnt[i]表示数字i出现的个数<br>当然这道题数据太小以至于可以用搜索。在此就不过多赘述了。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 2010</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">char</span> s<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> t<span class="token punctuation">,</span> d<span class="token punctuation">;</span><span class="token keyword">int</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> num<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> cnt<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">calc</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> ans <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> x<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> ans <span class="token operator">*</span><span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s%d"</span><span class="token punctuation">,</span> s<span class="token punctuation">,</span> <span class="token operator">&</span>d<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> len <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>cnt<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>cnt<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> len<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> num<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">-</span> <span class="token string">'0'</span><span class="token punctuation">;</span> cnt<span class="token punctuation">[</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">-</span> <span class="token string">'0'</span><span class="token punctuation">]</span> <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> len<span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> d<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator"><</span> len<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span>i <span class="token operator">&</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> k<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> k<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">(</span>j <span class="token operator">*</span> <span class="token number">10</span> <span class="token operator">+</span> num<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> d<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> len<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">/</span><span class="token operator">=</span> <span class="token function">calc</span><span class="token punctuation">(</span>cnt<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> len<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>一般涉及倍数或者余数的问题,都要新开一维来记录状态。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 状态压缩 </tag>
</tags>
</entry>
<entry>
<title>邦邦的大合唱站队</title>
<link href="/2019/07/08/%E9%82%A6%E9%82%A6%E7%9A%84%E5%A4%A7%E5%90%88%E5%94%B1%E7%AB%99%E9%98%9F/"/>
<url>/2019/07/08/%E9%82%A6%E9%82%A6%E7%9A%84%E5%A4%A7%E5%90%88%E5%94%B1%E7%AB%99%E9%98%9F/</url>
<content type="html"><![CDATA[<h1 id="邦邦的大合唱站队"><a href="#邦邦的大合唱站队" class="headerlink" title="邦邦的大合唱站队"></a>邦邦的大合唱站队</h1><p>标签: 动态规划 状态压缩</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>$N(1<=N<=10^5)$个偶像排成一列,他们来自$M(1<=M<=20)$个不同的乐队。每个团队至少有一个偶像。</p><p>现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起。重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的偶像一个个归队到原来的空位,归队的位置任意。</p><p>请问最少让多少偶像出列?</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式:"><a href="#输入格式:" class="headerlink" title="输入格式:"></a>输入格式:</h3><p>第一行2个整数N,M。<br>接下来N个行,每行一个整数$ai$($1≤ai≤M)$,表示队列中第i个偶像的团队编号。</p><h3 id="输出格式:"><a href="#输出格式:" class="headerlink" title="输出格式:"></a>输出格式:</h3><p>一个整数,表示答案</p><h3 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h3><p>输入样例#1:<br>12 4<br>1<br>3<br>2<br>4<br>2<br>1<br>2<br>3<br>1<br>1<br>3<br>4</p><p>输出样例#1:<br>7</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>看到M这么小,容易联想到状态压缩。有一个性质是,对于两个偶像编号相同的人来说,他们是等价的。(emmmm…就是这两人没区别)<br>因此我们逆向思考:设计一种偶像团队编号的排列方式,使得尽可能多的人站在属于自己偶像编号位置上。(就是使得尽可能多的人不用出列换位置)<br>我们设f[i]表示偶像编号排列状态为i时,最大的不用换位置的偶像数。<br>转移方程:</p><pre class=" language-cpp"><code class="language-cpp"><span class="token function">ass_max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> sum<span class="token punctuation">[</span>g<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> cnt<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">-</span> sum<span class="token punctuation">[</span>g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>其中g[i]表示状态为i时的总人数。cnt[j]表示偶像编号为j的总人数<br>sum[i][j]表示前i个人编号为j的人数。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 100010</span><span class="token macro property">#<span class="token directive keyword">define</span> M 20</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> m<span class="token punctuation">;</span><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> cnt<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">,</span> sum<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">,</span> g<span class="token punctuation">[</span><span class="token number">1</span> <span class="token operator"><<</span> M<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">1</span> <span class="token operator"><<</span> M<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">ass_max</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">&</span>a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span>a <span class="token operator">=</span> a <span class="token operator">></span> b <span class="token operator">?</span> a <span class="token operator">:</span> b<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> sum<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">++</span><span class="token punctuation">;</span> cnt<span class="token punctuation">[</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> m<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> sum<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> sum<span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> m<span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><=</span> i<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">&</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> cnt<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> m<span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> m<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span>i <span class="token operator">&</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">&&</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">ass_max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> sum<span class="token punctuation">[</span>g<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> cnt<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">-</span> sum<span class="token punctuation">[</span>g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> n <span class="token operator">-</span> f<span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> m<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>有时候逆向思考问题可以得到很不错的结果啊。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 状态压缩 </tag>
</tags>
</entry>
<entry>
<title>[USACO12MAR]摩天大楼里的奶牛</title>
<link href="/2019/07/08/USACO12MAR-%E6%91%A9%E5%A4%A9%E5%A4%A7%E6%A5%BC%E9%87%8C%E7%9A%84%E5%A5%B6%E7%89%9B/"/>
<url>/2019/07/08/USACO12MAR-%E6%91%A9%E5%A4%A9%E5%A4%A7%E6%A5%BC%E9%87%8C%E7%9A%84%E5%A5%B6%E7%89%9B/</url>
<content type="html"><![CDATA[<h1 id="USACO12MAR-摩天大楼里的奶牛"><a href="#USACO12MAR-摩天大楼里的奶牛" class="headerlink" title="[USACO12MAR]摩天大楼里的奶牛"></a>[USACO12MAR]摩天大楼里的奶牛</h1><p>标签: 动态规划 状态压缩</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>A little known fact about Bessie and friends is that they love stair climbing races. A better known fact is that cows really don’t like going down stairs. So after the cows finish racing to the top of their favorite skyscraper, they had a problem. Refusing to climb back down using the stairs, the cows are forced to use the elevator in order to get back to the ground floor.</p><p>The elevator has a maximum weight capacity of W (1 <= W <= 100,000,000) pounds and cow i weighs C_i (1 <= C_i <= W) pounds. Please help Bessie figure out how to get all the N (1 <= N <= 18) of the cows to the ground floor using the least number of elevator rides. The sum of the weights of the cows on each elevator ride must be no larger than W.</p><p>题目翻译:给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组。(n<=18)</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h3><ul><li><p>Line 1: N and W separated by a space.</p></li><li><p>Lines 2..1+N: Line i+1 contains the integer C_i, giving the weight of one of the cows.</p></li></ul><h3 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h3><ul><li>A single integer, R, indicating the minimum number of elevator rides needed.<br>one of the R trips down the elevator. </li></ul><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1:</p><p>4 10<br>5<br>6<br>3<br>7 </p><p>输出样例#1:<br>3 </p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>遇到有关背包容量的问题,我们可以把方程设计为在某个状态下剩余容量最大,则答案最后只需判定一下即可。<br>设f[i][j]表示放入物品状态为i时需要j个背包,当前背包的剩余最大体积。<br>那么对于每一个物品,看它的体积是否超过当前最大体积,如果没有则装入,否则新开一个背包装入。</p><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 20</span><span class="token macro property">#<span class="token directive keyword">define</span> M (1 << 18)</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> w<span class="token punctuation">,</span> ans<span class="token punctuation">;</span><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>w<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> w <span class="token operator">-</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> n<span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> n<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token punctuation">(</span>i <span class="token operator">&</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">&&</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">>=</span> a<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">-</span> a<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">else</span> f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> w <span class="token operator">-</span> a<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> n<span class="token punctuation">;</span> j <span class="token operator">>=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> n<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> j<span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 状态压缩 </tag>
</tags>
</entry>
<entry>
<title>[USACO08NOV]奶牛混合起来</title>
<link href="/2019/07/08/USACO08NOV-%E5%A5%B6%E7%89%9B%E6%B7%B7%E5%90%88%E8%B5%B7%E6%9D%A5/"/>
<url>/2019/07/08/USACO08NOV-%E5%A5%B6%E7%89%9B%E6%B7%B7%E5%90%88%E8%B5%B7%E6%9D%A5/</url>
<content type="html"><![CDATA[<h1 id="USACO08NOV-奶牛混合起来"><a href="#USACO08NOV-奶牛混合起来" class="headerlink" title="[USACO08NOV]奶牛混合起来"></a>[USACO08NOV]奶牛混合起来</h1><p>标签: 状态压缩 动态规划</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>约翰家有N(4<=N<=16)头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的。这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍。在一只混乱的队 伍中,相邻奶牛的编号之差均超过K。比如当K = 1时,1, 3, 5, 2, 6, 4就是一支混乱的队伍, 而1, 3, 6, 5, 2, 4不是,因为6和5只差1。请数一数,有多少种队形是混乱的呢?</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h2 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h2><ul><li><p>Line 1: Two space-separated integers: N and K</p></li><li><p>Lines 2: N+1: Line i+1 contains a single integer that is the serial number of cow i: S_i</p><h2 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h2></li><li>Line 1: A single integer that is the number of ways that N cows can be ‘Mixed Up’. The answer is guaranteed to fit in a 64 bit integer.<h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2></li></ul><p>输入样例#1:<br>4 1<br>3<br>4<br>2<br>1 </p><p>输出样例#1:<br>2 </p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>题目中有两个要求:<br>1.必须将奶牛排成一列。<br>2.相邻奶牛绝对值不能超过K。<br>并且总头数很少,因此可以想到把奶牛排列状态压缩起来。<br>设f[i][j]表示奶牛排列状态为i时末尾为j的奶牛。<br>转移也就一目了然了。</p><pre class=" language-cpp"><code class="language-cpp">f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span></code></pre><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 20</span><span class="token macro property">#<span class="token directive keyword">define</span> M (1 << 16)</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> m<span class="token punctuation">;</span>ll a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n <span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> n<span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">&</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> n<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">abs</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">-</span> a<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">></span> m <span class="token operator">&&</span> <span class="token operator">!</span><span class="token punctuation">(</span>i <span class="token operator">&</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">// printf("f[%d][%d]=%d %d %d", i | (1 << (k - 1)), k, f[i | (1 << (k - 1))][k], i, j), system("pause");</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> ans <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> n<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/*16 389 65 5 78 41 22 33 6 9 10 14 93 22 57 84 1017 159 87 54 63 22 21 85*/</span></code></pre>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 状态压缩 </tag>
</tags>
</entry>
<entry>
<title>区间DP总结</title>
<link href="/2019/06/01/%E5%8C%BA%E9%97%B4DP%E6%80%BB%E7%BB%93/"/>
<url>/2019/06/01/%E5%8C%BA%E9%97%B4DP%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h1 id="区间DP总结"><a href="#区间DP总结" class="headerlink" title="区间DP总结"></a>区间DP总结</h1><p>标签: 总结</p><hr><h2 id="序"><a href="#序" class="headerlink" title="序"></a>序</h2><p>总结一下区间DP的解题套路吧。</p><h2 id="核心思想"><a href="#核心思想" class="headerlink" title="核心思想"></a>核心思想</h2><p>区间DP顾名思义是通过以“区间”来进行转移。主要是通过小区间合并成大区间,最终得到全局的最优值。一般来说,这类DP具有比较明显的“区间性”,即可以选择区间这个状态进行转移,并且不同区间转移会获得不同的结果。<br>(口胡成分较多,可以忽略上述描述….)。</p><h2 id="转移类型"><a href="#转移类型" class="headerlink" title="转移类型"></a>转移类型</h2><p>因为是区间DP,所以肯定需要二维来存储区间状态:<br>$dp[i][j]$表示从i到j的最优值(当然通常是这样的,对于不同的题目我们也需要增加其他状态,这就需要我们仁者见仁了。)<br>下面来说说常见的几种转移类型:</p><h3 id="1-枚举断点型"><a href="#1-枚举断点型" class="headerlink" title="1.枚举断点型"></a>1.枚举断点型</h3><p>这类DP主要是可以通过划分不同的断点,来得到不同的值。他们彼此之间的小区间是互不关联的,$[i,j]$可以划分为$[i,k]$和$[k,j]$,并且这两段小区间不会相互影响。经典题目就是石子合并,能量项链等等。<br>代码模板:</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> len <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> len <span class="token operator"><=</span> n<span class="token punctuation">;</span> len <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举长度</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n <span class="token operator">-</span> len <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举起点</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> j <span class="token operator">=</span> i <span class="token operator">+</span> len <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//得到终点</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> i<span class="token punctuation">;</span> k <span class="token operator"><</span> j<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举断点</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//转移</span> <span class="token punctuation">}</span></code></pre><p>那么推荐题目:<br><a href="https://isecloud.github.io/2019/05/24/USACO16OPEN-248/">[USACO16OPEN]248</a><br><a href="https://isecloud.github.io/2019/05/22/Outer-space-invaders/">Outer space invaders</a><br><a href="https://isecloud.github.io/2019/05/20/HAOI2008-%E7%8E%A9%E5%85%B7%E5%8F%96%E5%90%8D/">[HAOI2008]玩具取名</a></p><h3 id="2-逐个转移类"><a href="#2-逐个转移类" class="headerlink" title="2.逐个转移类"></a>2.逐个转移类</h3><p>这类DP主要是挨个挨个转移,也像是由小区间慢慢延伸到大区间。由$[i+1,j]$转移到$[i,j]$或者$[i,j+1]$转移到$[i,j]$。这类题目的性质可能是涉及区间的嵌套问题,不能通过枚举断点来实现;或者是逐个转移时候转移方程比较简单,容易实现;或者是题目描述具有较强的“单个操作”这类意思。<br>代码模板:</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> len <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> len <span class="token operator"><=</span> n<span class="token punctuation">;</span> len <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> l <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> l <span class="token operator"><=</span> n <span class="token operator">-</span> len <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> l <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> r <span class="token operator">=</span> l <span class="token operator">+</span> len <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">}</span></code></pre><p>经典题目有:括号匹配,最长回文子序列等。<br>推荐题目:<br><a href="https://isecloud.github.io/2019/05/20/Palindrome-subsequence/">Palindrome subsequence</a></p><h3 id="3-整体划分型"><a href="#3-整体划分型" class="headerlink" title="3.整体划分型"></a>3.整体划分型</h3><p>感觉这类DP题意比较明显,一般是给你一段区间,然后给你一种操作,然后用这种操作把区间划分成m段小区间,然后得到某种权值.<br>这类DP状态设计与前面有所不同:<br>$dp[i][j]$表示前i个元素划分成j段的最优值,通常是这样转移:</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举长度 </span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> m<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举划分段数 </span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator"><</span> i<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举划分点 </span> dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>dp<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> dp<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token function">value</span><span class="token punctuation">(</span>k<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><p>经典题目:乘积最大,hdu3480 Division(需要用四边形不等式)<br>当然,上面的解法并不是独立的,有的题目可能使得上述解法相互嵌套,比如此题:<a href="https://isecloud.github.io/2019/05/20/String-painter/">String painter</a>。而且区间DP的解法也不仅限于上述解法,还有许多精巧的DP思想和方程(如:<a href="https://isecloud.github.io/2019/05/24/P3147-USACO16OPEN-262144/">USACO16OPEN 262144</a>),这就需要多多积累构造方程的思想了。</p><h2 id="四边形不等式"><a href="#四边形不等式" class="headerlink" title="四边形不等式"></a>四边形不等式</h2><p>提到区间DP,肯定也要介绍一下关于它的优化——四边形不等式。不过博主才疏学浅<del>(low得一逼)</del>,实在是没有怎么学好这个思想,只会套套板子,这里就无法进行总结,只能贴个链接了:<a href="https://blog.csdn.net/noiau/article/details/72514812" target="_blank" rel="noopener">四边形不等式</a></p><h2 id="最后的话"><a href="#最后的话" class="headerlink" title="最后的话"></a>最后的话</h2><p>总结解题套路是为了加强对这个DP思想的理解,但是却不能被固有的思想禁锢,DP这类题目是灵活多变的,遇到题目还是得分析题目性质,思考如何表示状态,如何转移。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 背包DP </tag>
</tags>
</entry>
<entry>
<title>子序列子序列子序列...</title>
<link href="/2019/05/25/%E5%AD%90%E5%BA%8F%E5%88%97%E5%AD%90%E5%BA%8F%E5%88%97%E5%AD%90%E5%BA%8F%E5%88%97/"/>
<url>/2019/05/25/%E5%AD%90%E5%BA%8F%E5%88%97%E5%AD%90%E5%BA%8F%E5%88%97%E5%AD%90%E5%BA%8F%E5%88%97/</url>
<content type="html"><![CDATA[<h1 id="子序列子序列子序列…"><a href="#子序列子序列子序列…" class="headerlink" title="子序列子序列子序列…"></a>子序列子序列子序列…</h1><p>标签: 动态规划 背包DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定 n,m,再给一个含有 n个正整数的序列 a1,a2,…,an问序列 a有多少个非空子序列(子序列的定义为能从原序列中去除任意个位置上的元素后得到的序列)是完美的。<br>一个由正整数组成的序列是完美的,当且仅当它的每个非空子序列中的整数之和m的倍数。<br>在本题中,两个子序列只要除去的元素中至少有一个的位置不同,就算不同。观看提示中的样例解释可能可以帮助你更了解题意。<br>题目来源:<a href="https://www.cometoj.com/contest/38/problems" target="_blank" rel="noopener">comet oj #3</a></p><h2 id="输出描述"><a href="#输出描述" class="headerlink" title="输出描述"></a>输出描述</h2><p>第一行有 2 个由空格分隔的整数 n,m。<br>第二行有 n 个由空格分隔的整数a1,a2,…,an表示给定的序列。<br>数据满足 1≤n≤5000,2≤m≤5000,0 < ai < m。</p><h2 id="输出描述-1"><a href="#输出描述-1" class="headerlink" title="输出描述"></a>输出描述</h2><p>输出一个数,表示答案对 1000000007取模后的结果。</p><h2 id="样例"><a href="#样例" class="headerlink" title="样例"></a>样例</h2><p>样例输入 1<br>3 8<br>1 2 3<br>样例输出 1<br>2</p><p>样例输入 2<br>3 2<br>1 1 1<br>样例输出 2<br>4</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>通过一些简单的组合数学我们可以知道,一个子序列的和为:<br>$$2^{n-1}\ast (a_{k1}+a_{k2}+….a_{kn})$$<br>于是我们可以把m拆为$m=2^{r}\ast d$,然后我们枚举n,则只要保证$(a_{k1}+a_{k2}+….a_{kn})$是$m1=2^{max(0,r-n+1)}\ast d$的倍数就可以了。<br>首先来分析状态设计,因为必须是m的倍数,所以我们肯定需要一位状态记录数字和是多少。则:<br>$f[i][j][k]$表示前$i$个数字,选$j$个和为$k$(mod $ m^{‘}$意义下,不然肯定爆空间嘛, $m^{‘}=m/2^{j-1}$ )的方案数,于是我们就可以用背包的思想,即选或者不选两种决策进行转移。当然,这只记录了一部分,个数超过$r$并且和为$m$倍数也是合法方案。<br>因此设$g[i][k]$表示前$i$个数字,选了至少$r+1$个数字,和为$k$的方案数,可以发现在后期转移的时候$g$和$f$数组可以合并到一起。<br>不过这样设计状态仍然会超空间,我们发现每次状态只和前一项有关,因此可以滚动优化掉第一位。<br>并且随着$j$的增大,$k$这一维也在逐渐减小,总复杂度为$O(nm\ast (1+1/2+1/4+….)=2*nm)$</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 5010</span><span class="token macro property">#<span class="token directive keyword">define</span> p 1000000007</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> m<span class="token punctuation">,</span> ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">15</span><span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> m1 <span class="token operator">=</span> m<span class="token punctuation">,</span> t <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>m1 <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> t <span class="token operator">++</span><span class="token punctuation">,</span> m1 <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> l <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> l <span class="token operator"><=</span> n<span class="token punctuation">;</span> l <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> t<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> m1 <span class="token operator">=</span> m <span class="token operator">/</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token function">max</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> m2 <span class="token operator">=</span> m <span class="token operator">/</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> j<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator"><</span> m1<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">(</span>k <span class="token operator">+</span> a<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> m2<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">(</span>k <span class="token operator">+</span> a<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> m2<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> m2 <span class="token operator">=</span> m <span class="token operator">/</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token punctuation">(</span>t <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator"><</span> m2<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">(</span>k <span class="token operator">+</span> a<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> m2<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">^</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">(</span>k <span class="token operator">+</span> a<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> m2<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>t<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> i <span class="token operator">^</span><span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> t<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> <span class="token punctuation">(</span>ans <span class="token operator">+</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>看来有关倍数问题的DP总有一维是记录前j个数和为m的余数的状态。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 背包DP </tag>
</tags>
</entry>
<entry>
<title>[USACO16OPEN]262144</title>
<link href="/2019/05/24/P3147-USACO16OPEN-262144/"/>
<url>/2019/05/24/P3147-USACO16OPEN-262144/</url>
<content type="html"><![CDATA[<h1 id="USACO16OPEN-262144"><a href="#USACO16OPEN-262144" class="headerlink" title="[USACO16OPEN]262144"></a>[USACO16OPEN]262144</h1><p>标签:动态规划 区间DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>Bessie喜欢在手机上下游戏玩(……),然而她蹄子太大,很难在小小的手机屏幕上面操作。<br>她被她最近玩的一款游戏迷住了,游戏一开始有n个正整数,(2<=n<=262144),范围在1-40。在一步中,贝西可以选相邻的两个相同的数,然后合并成一个比原来的大一的数(例如两个7合并成一个8),目标是使得最大的数最大,请帮助Bessie来求最大值。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h3><p>The first line of input contains N, and the next N lines give the sequence of N numbers at the start of the game.</p><h3 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h3><p>Please output the largest integer Bessie can generate.</p><h3 id="样例"><a href="#样例" class="headerlink" title="样例"></a>样例</h3><p>输入样例#1:<br>4<br>1<br>1<br>1<br>2</p><p>输出样例#1:<br>3</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>那么此题和<a href="https://www.luogu.org/problemnew/show/P3146" target="_blank" rel="noopener">[USACO16OPEN]248</a>题面是一样的,唯一不同的是这数据量达到了20w,因此肯定不能用原来n^3的算法了。<br>不过有一条性质依旧没变:两段区间如果要合并,那么必须满足两段区间分别合并得到的数字相同。<br>并且分析此题的数据,可以发现,最后合并的数字绝对不会超过58。因此,我们是可以记录能合并到的数字的状态的。<br>于是我们设f[i][j]表示以j为起点,能合并到i数字的终点。(这神仙状态设计…实在是巧妙)<br>然后我们可以用一种倍增的思想进行转移:<br>$$f[i][j]=f[i-1][f[i-1][j]]$$<br>于是我们只需要第一层枚举能合成的数字,第二层枚举数组长度就可以了,复杂度为$O(58*n)$</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 300010</span><span class="token macro property">#<span class="token directive keyword">define</span> M 60</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> x<span class="token punctuation">,</span> ans <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token keyword">int</span> f<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>ans<span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">58</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>ans<span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>这倍增的思想着实巧妙啊,多多积累。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 区间DP </tag>
</tags>
</entry>
<entry>
<title>[USACO16OPEN]248</title>
<link href="/2019/05/24/USACO16OPEN-248/"/>
<url>/2019/05/24/USACO16OPEN-248/</url>
<content type="html"><![CDATA[<h1 id="USACO16OPEN-248"><a href="#USACO16OPEN-248" class="headerlink" title="[USACO16OPEN]248"></a>[USACO16OPEN]248</h1><p>标签:动态规划 区间DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-40),问最大能合出多少。注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h3><p>The first line of input contains N, and the next N lines give the sequence<br>of N numbers at the start of the game.</p><h3 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h3><p>Please output the largest integer Bessie can generate.</p><h2 id="样例"><a href="#样例" class="headerlink" title="样例"></a>样例</h2><p>输入样例#1:<br>4<br>1<br>1<br>1<br>2</p><p>输出样例#1:<br>3</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>首先两个数字相同才能合成,所以如果想让两段数字合并的话,比如首先满足每段数字能合成一个数字,并且这两段合成的数字相同。<br>因此,这就引出了区间DP的思想了。<br>设f[i][j]表示区间[i,j]合成一个数字的值,若无法合成便等于-1。所以我们初始化所有f[i][j]值为-1.<br>则转移方程:<br>$$f[i][j] = max(f[i][j], f[i][k] + 1(f[i][k] == f[k + 1][j]))$$<br>$$ans=max(ans,f[i][j])$$<br>注意我们不能把f[i][j]不合法标志设为0,否则当f[i][k]==0并且f[k][j]==0,那么此时他们两个可以合成为1,但其实这是不合法的。<br>这里可以设置一组HACK数据,大家可以尝试一下:<br>12<br>1 2 1 2 1 2 1 2 1 2 1 2</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 510</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> x<span class="token punctuation">,</span> ans <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token keyword">int</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>ans<span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> len <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> len <span class="token operator"><=</span> n<span class="token punctuation">;</span> len <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n <span class="token operator">-</span> len <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> j <span class="token operator">=</span> i <span class="token operator">+</span> len <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> i<span class="token punctuation">;</span> k <span class="token operator"><</span> j<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">==</span> f<span class="token punctuation">[</span>k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">&&</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>ans<span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 区间DP </tag>
</tags>
</entry>
<entry>
<title>Outer space invaders</title>
<link href="/2019/05/22/Outer-space-invaders/"/>
<url>/2019/05/22/Outer-space-invaders/</url>
<content type="html"><![CDATA[<h1 id="CERC2014-Outer-space-invaders"><a href="#CERC2014-Outer-space-invaders" class="headerlink" title="[CERC2014]Outer space invaders"></a>[CERC2014]Outer space invaders</h1><p>标签:动态规划 区间DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>题目描述 来自外太空的外星人(最终)入侵了地球。保卫自己,或者解体,被他们同化,或者成为食物。迄今为止,我们无法确定。<br>外星人遵循已知的攻击模式。有N个外星人进攻,第i个进攻的外星人会在时间ai出现,距离你的距离为di ,它必须在时间bi前被消灭,否则被消灭的会是你。<br>你的武器是一个区域冲击波器,可以设置任何给定的功率。如果被设置了功率R,它会瞬间摧毁与你的距离在R以内的所有外星人(可以等于),同时它也会消耗R单位的燃料电池。<br>求摧毁所有外星人的最低成本(消耗多少燃料电池),同时保证自己的生命安全。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><p>输入格式:<br>第一行输入一个数T,表示有T组数据<br>每组数据的第一行为外星人的数量n(1<=n<=300)<br>接下来n+1行,每行有三个数ai,bi,di,表示这个外星人在时间ai出现,距离你di,在bi前时刻死亡<br>输出格式<br>每组输出摧毁所有外星人的最低成本</p><h2 id="样例"><a href="#样例" class="headerlink" title="样例"></a>样例</h2><p>输入样例#1:<br>1<br>3<br>1 4 4<br>4 7 5<br>3 4 7</p><p>输出样例#1:<br>7</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>思考这样这样一个问题:如果某些外星人的出现时间段全都包含于某一段小区间,那我们在这小区间的任意一个时间点选择这些外星人中距离我们最远的距离D开炮,那么他们可以全部被消灭。<br>所以我们有这样一个策略:在时间区间[l,r]中选择距离我们最远的外星人a(因为最远的我们总是需要开一炮),那么他的时间区间假设为[la,ra](l<=la<=ra<=r)我们可以枚举在[la,ra]中任意一个时间点pi开炮,那么如果剩下的某些外星人的时间区间经过了pi,那么这些外星人一定会被消灭了。因此,我们把这个大区间又分割为了两个小区间[l,p-1]与[p+1,r];<br>看样子这就很符合区间DP的意味了,我们采用区间合并的方式。<br>设f[i][j]消灭以i,j为开区间的所有外星人的最小值<br>(这里需要采用开区间,因为可以避免处理一些边界问题)<br>那么我们枚举(i,j)中离我们最远的外星人的时间k,以k作为分割点:</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> la<span class="token punctuation">;</span> k <span class="token operator"><=</span> ra<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> dis_max<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 1010</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> t<span class="token punctuation">;</span><span class="token keyword">int</span> num<span class="token punctuation">[</span>N <span class="token operator">*</span> <span class="token number">10</span><span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">struct</span> node<span class="token punctuation">{</span><span class="token keyword">int</span> s<span class="token punctuation">,</span> t<span class="token punctuation">,</span> d<span class="token punctuation">;</span><span class="token punctuation">}</span>p<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> tot <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> maxn <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>num<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>num<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token number">0x3f3f3f</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>t<span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>d<span class="token punctuation">)</span><span class="token punctuation">;</span> num<span class="token punctuation">[</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">]</span> <span class="token operator">=</span> num<span class="token punctuation">[</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>t<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> maxn <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>maxn<span class="token punctuation">,</span> <span class="token function">max</span><span class="token punctuation">(</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">,</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>t<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> maxn<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>num<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> num<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> tot <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>s <span class="token operator">=</span> num<span class="token punctuation">[</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">]</span><span class="token punctuation">,</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>t <span class="token operator">=</span> num<span class="token punctuation">[</span>p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>t<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> len <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> len <span class="token operator"><=</span> tot<span class="token punctuation">;</span> len <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> tot <span class="token operator">-</span> len<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> j <span class="token operator">=</span> len <span class="token operator">+</span> i<span class="token punctuation">;</span> <span class="token keyword">int</span> mx <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> l<span class="token punctuation">,</span> r<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> n<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>p<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>s <span class="token operator">></span> i <span class="token operator">&&</span> p<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>t <span class="token operator"><</span> j <span class="token operator">&&</span> p<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>d <span class="token operator">></span> mx<span class="token punctuation">)</span> mx <span class="token operator">=</span> p<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>d<span class="token punctuation">,</span> l <span class="token operator">=</span> p<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">,</span> r <span class="token operator">=</span> p<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>t<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>mx <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">continue</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token comment" spellcheck="true">//printf("%d %d %d %d %d", i, j, l, r, mx); system("pause");</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> l<span class="token punctuation">;</span> k <span class="token operator"><=</span> r<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> mx<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>tot<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 区间DP </tag>
</tags>
</entry>
<entry>
<title>[HAOI2008]玩具取名</title>
<link href="/2019/05/20/HAOI2008-%E7%8E%A9%E5%85%B7%E5%8F%96%E5%90%8D/"/>
<url>/2019/05/20/HAOI2008-%E7%8E%A9%E5%85%B7%E5%8F%96%E5%90%8D/</url>
<content type="html"><![CDATA[<h1 id="HAOI2008-玩具取名"><a href="#HAOI2008-玩具取名" class="headerlink" title="[HAOI2008]玩具取名"></a>[HAOI2008]玩具取名</h1><p>标签:动态规划 区间DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。</p><p>现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h3><p>第一行四个整数W、I、N、G。表示每一个字母能由几种两个字母所替代。<br>接下来W行,每行两个字母,表示W可以用这两个字母替代。<br>接下来I行,每行两个字母,表示I可以用这两个字母替代。<br>接下来N行,每行两个字母,表示N可以用这两个字母替代。<br>接下来G行,每行两个字母,表示G可以用这两个字母替代。<br>最后一行一个长度不超过Len的字符串。表示这个玩具的名字。</p><h3 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h3><p>一行字符串,该名字可能由哪些字母变形而得到。(按照WING的顺序输出)</p><p>如果给的名字不能由任何一个字母变形而得到则输出“The name is wrong!”</p><h3 id="样例"><a href="#样例" class="headerlink" title="样例"></a>样例</h3><p>输入样例#1:<br>1 1 1 1<br>II<br>WW<br>WW<br>IG<br>IIII<br>输出样例#1:<br>IN</p><h3 id="Hint"><a href="#Hint" class="headerlink" title="Hint"></a>Hint</h3><p>30%数据满足Len<=20,W、I、N、G<=6<br>100%数据满足Len<=200,W、I、N、G<=16</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>题意是由一个字母变成一段字母区间,问这个字母是什么。那我们不妨反过来思考,这一段区间能否变成一个字母。状态也就随之而来了。<br>f[i][j][k]表示[i,j]这段区间是否可以合成k这个字符。<br>转移肯定采用区间合并法。<br>小trick:在读入的是否我们可以用一个g[i][j][k]数组表示i字符和j字符能否组成k字符。<br>转移方程:</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> i<span class="token punctuation">;</span> k <span class="token operator"><</span> j<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举断点</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> a <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> a <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举字符</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> b <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> b <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> b <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举字符</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> c <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> c <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> c <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举字符</span> <span class="token keyword">if</span><span class="token punctuation">(</span>g<span class="token punctuation">[</span>a<span class="token punctuation">]</span><span class="token punctuation">[</span>b<span class="token punctuation">]</span><span class="token punctuation">[</span>c<span class="token punctuation">]</span> <span class="token operator">&&</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">&&</span> f<span class="token punctuation">[</span>k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>c<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//如果全部合法,则可以转移</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>a<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span></code></pre><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 210</span><span class="token macro property">#<span class="token directive keyword">define</span> M 20</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">char</span> s<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> c<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'K'</span><span class="token punctuation">,</span> <span class="token string">'W'</span><span class="token punctuation">,</span> <span class="token string">'I'</span><span class="token punctuation">,</span> <span class="token string">'N'</span><span class="token punctuation">,</span> <span class="token string">'G'</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">,</span> g<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">modify</span><span class="token punctuation">(</span><span class="token keyword">char</span> x<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token string">'W'</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token string">'I'</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token string">'N'</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">3</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token string">'G'</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">4</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span><span class="token punctuation">;</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token function">modify</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token function">modify</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span> s <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> n <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span>s <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token function">modify</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> l <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> l <span class="token operator"><=</span> n<span class="token punctuation">;</span> l <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n <span class="token operator">-</span> l <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> j <span class="token operator">=</span> l <span class="token operator">+</span> i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> i<span class="token punctuation">;</span> k <span class="token operator"><</span> j<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> a <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> a <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> b <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> b <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> b <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> c <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> c <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> c <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>g<span class="token punctuation">[</span>a<span class="token punctuation">]</span><span class="token punctuation">[</span>b<span class="token punctuation">]</span><span class="token punctuation">[</span>c<span class="token punctuation">]</span> <span class="token operator">&&</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">&&</span> f<span class="token punctuation">[</span>k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>c<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>a<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">bool</span> flag <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">4</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%c"</span><span class="token punctuation">,</span> c<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> flag <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>flag<span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"The name is wrong!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>有时候逆向思考问题会得到不错的想法啊。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 区间DP </tag>
</tags>
</entry>
<entry>
<title>String painter</title>
<link href="/2019/05/20/String-painter/"/>
<url>/2019/05/20/String-painter/</url>
<content type="html"><![CDATA[<h1 id="String-painter"><a href="#String-painter" class="headerlink" title="String painter"></a>String painter</h1><p>标签: 区间DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>There are two strings A and B with equal length. Both strings are made up of lower case letters. Now you have a powerful string painter. With the help of the painter, you can change a segment of characters of a string to any other character you want. That is, after using the painter, the segment is made up of only one kind of character. Now your task is to change A to B using string painter. What’s the minimum number of operations?</p><h2 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h2><p>Input contains multiple cases. Each case consists of two lines:<br>The first line contains string A.<br>The second line contains string B.<br>The length of both strings will not be greater than 100.</p><h2 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h2><p>A single line contains one integer representing the answer.</p><h2 id="样例"><a href="#样例" class="headerlink" title="样例"></a>样例</h2><p>Sample Input<br>zzzzzfzzzzz<br>abcdefedcba<br>abababababab<br>cdcdcdcdcdcd</p><p>Sample Output<br>6<br>7</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>一句话概括题目:每次可以选择一段区间涂色,问将一段颜色序列变成另一颜色序列最少多少次。<br>首先来思考一个简单版本:假设所有位置对应颜色都不同。(比如初始颜色序列为空白)<br>考虑涂色的性质,如果在最终序列中两个位置颜色相同,s[i]==s[j],则我们在染j的时候可以顺便把i也染色了。即可以考虑逐次转移法:<br>f[i,j]表示将[i,j]颜色完全不同染成最终相同颜色的最少次数。<br>由[i+1,j]推到[i,j],不过我们要判断[i+1,j]中是否有颜色与s[i]相等,因此还要再[i+1,j]中枚举断点:</p><pre class=" language-cpp"><code class="language-cpp">f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//假设没有相等的,如果有的话下面也会取min值</span><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> m <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> m <span class="token operator"><=</span> j<span class="token punctuation">;</span> m <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>m<span class="token punctuation">]</span> <span class="token operator">==</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>m<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>m <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>接着考虑初始序列可能与最终序列某些位置相同的情况,我们假设f[1,i]表示[1,i]将初始序列染成最终序列颜色的最少次数<br>如果s1[i]==s2[i],则f[1][i]=f[1][i-1],因为不需要染色了,否则枚举断点:</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> s2<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><</span> i<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 110</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> cnt<span class="token punctuation">;</span><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">char</span> s<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> s2<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span> s2 <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token constant">EOF</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span> s <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> len <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span>s <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> len<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> len<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1e9</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> len<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> len<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> len <span class="token operator">-</span> k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> j <span class="token operator">=</span> k <span class="token operator">+</span> i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> m <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> m <span class="token operator"><=</span> j<span class="token punctuation">;</span> m <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>m<span class="token punctuation">]</span> <span class="token operator">==</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>m<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>m <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> tmp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> len<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> s2<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> tmp <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><</span> i<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>len<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 区间DP </tag>
</tags>
</entry>
<entry>
<title>Palindrome subsequence</title>
<link href="/2019/05/20/Palindrome-subsequence/"/>
<url>/2019/05/20/Palindrome-subsequence/</url>
<content type="html"><![CDATA[<h1 id="HDU4632-Palindrome-subsequence"><a href="#HDU4632-Palindrome-subsequence" class="headerlink" title="HDU4632 Palindrome subsequence"></a>HDU4632 Palindrome subsequence</h1><p>标签: 区间DP 容斥原理</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>In mathematics, a subsequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements. For example, the sequence A, B, D is a subsequence of A, B, C, D, E, F.</p><p>Given a string S, your task is to find out how many different subsequence of S is palindrome. Note that for any two subsequence X = Sx1, Sx2, …, Sxk and Y = Sy1, Sy2, …, Syk , if there exist an integer i (1<=i<=k) such that xi != yi, the subsequence X and Y should be consider different even if Sxi = Syi. Also two subsequences with different length should be considered different.</p><h2 id="输入描述"><a href="#输入描述" class="headerlink" title="输入描述"></a>输入描述</h2><p>The first line contains only one integer T (T<=50), which is the number of test cases. Each test case contains a string S, the length of S is not greater than 1000 and only contains lowercase letters.</p><h2 id="输出描述"><a href="#输出描述" class="headerlink" title="输出描述"></a>输出描述</h2><p>For each test case, output the case number first, then output the number of different subsequence of the given string, the answer should be module 10007.</p><h2 id="样例"><a href="#样例" class="headerlink" title="样例"></a>样例</h2><p>Sample Input<br>4<br>a<br>aaaaa<br>goodafternooneveryone<br>welcometoooxxourproblems</p><p>Sample Output<br>Case 1: 1<br>Case 2: 31<br>Case 3: 421<br>Case 4: 960</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>基础的区间DP,这里转移模式采用逐个转移。</p><pre class=" language-cpp"><code class="language-cpp">f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">-</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span></code></pre><p>注意中间会被重复统计,所以应该减去。<br>那么如果两端字符相等,则</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span></code></pre><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdio></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstring></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdlib></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><algorithm></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 1100</span><span class="token macro property">#<span class="token directive keyword">define</span> p 10007</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> t<span class="token punctuation">;</span>ll f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">char</span> s<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> a <span class="token operator"><=</span> t<span class="token punctuation">;</span> a <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%s"</span><span class="token punctuation">,</span> s<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> len <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> len<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> l <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> l <span class="token operator"><=</span> len<span class="token punctuation">;</span> l <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> len <span class="token operator">-</span> l <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> j <span class="token operator">=</span> i <span class="token operator">+</span> l <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">-</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>s<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> s<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Case %d: %lld\n"</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>len <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>感觉跟回文序列有关的区间DP都可以采用逐次转移法(纯口胡莫信…溜了溜了)</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 容斥原理 </tag>
<tag> 区间DP </tag>
</tags>
</entry>
<entry>
<title>tsy's number</title>
<link href="/2019/04/24/tsy-s-number/"/>
<url>/2019/04/24/tsy-s-number/</url>
<content type="html"><![CDATA[<h1 id="tsy’s-number"><a href="#tsy’s-number" class="headerlink" title="tsy’s number"></a>tsy’s number</h1><p>标签: 数学 莫比乌斯反演</p><hr><h1 id="tsy’s-number-1"><a href="#tsy’s-number-1" class="headerlink" title="tsy’s number"></a>tsy’s number</h1><p>标签: 数学 莫比乌斯反演</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>Tsy as a math enthusiast and the favorite thing is to get the sum of function, one day he was studying the Euler function, while writing a formula<br>$$\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}\frac{\varphi (i)\varphi (j^2)\varphi (k^3)}{\varphi (i)\varphi (j)\varphi (k)}\varphi (gcd(i,j,k))$$<br>After had written,tsy took it to his friend zxy for solution but zxy Zxy don’t know any Math at all. As the friends of Zxy, can you help him ?</p><p>the result need to 2^30modulo</p><h2 id="Input"><a href="#Input" class="headerlink" title="Input"></a>Input</h2><p>multiple testcase<br>a single T in the first line represents the number of groups (T≤10000)and T lines follows each line has a number n(1≤n≤10^7)</p><h2 id="Output"><a href="#Output" class="headerlink" title="Output"></a>Output</h2><p>For each set of data, output a number to represent the result</p><h2 id="Examples"><a href="#Examples" class="headerlink" title="Examples"></a>Examples</h2><p>样例输入<br>3<br>2<br>4<br>6<br>样例输出<br>30<br>1291<br>12715</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>看到$\sum $和$gcd$很容易联想到莫比乌斯反演。第一步还是先化简式子:<br>根据唯一分解定理:$n=p_{1}^{k1}p_{2}^{k2}…p_{m}^{km}$和欧拉函数的性质,可得<br>$\varphi (n)=\prod_{i=1}^{m}(p_{i}-1)p^{ki-1}$<br>$\varphi (n^2)=\prod_{i=1}^{m}(p_{i}-1)p^{2ki-1}$<br>$\varphi (n^3)=\prod_{i=1}^{m}(p_{i}-1)p^{3ki-1}$<br>则原式化简为:<br>$$\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}j\ast k^2\ast \varphi (gcd(i,j,k))$$<br>老套路,我们枚举$gcd$,则<br>$$\sum_{x=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}j\ast k^2\ast \varphi (x)[gcd(i,j,k)==x]$$<br>将$\varphi (x)$提前,则:<br>$$\sum_{x=1}^{n}\varphi (x)\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}j\ast k^2\ast [gcd(i,j,k)==x]$$<br>化简到这里我们就比较熟悉了,我们设以下函数:<br>$$f(x)=\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}j\ast k^2\ast [gcd(i,j,k)==x]$$<br>$$F(x)=\sum_{x|d}f(d)=\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}j\ast k^2\ast [x|gcd(i,j,k)]$$<br>更换枚举项,枚举x的倍数,则<br>$$F(x)=x^3\ast a\ast \frac{a\ast (a+1)}{2}\frac{a\ast (a+1)\ast (2a+1)}{6}$$<br>其中$a=\frac{n}{x}$<br>于是:<br>$$Ans=\sum_{x=1}^{n}\varphi (x)f(x)=\sum_{x=1}^{n}\varphi (x)\sum_{x|d}u(\frac{d}{x})F(d)$$<br>考虑枚举x的倍数,则<br>$$Ans=\sum_{d=1}^{n}d^3\ast a\ast \frac{a\ast (a+1)}{2}\frac{a\ast (a+1)\ast (2a+1)}{6}\sum_{x|d}\varphi (x)u(\frac{d}{x})$$<br>其中$a=\frac{n}{d}$<br>不妨设$g(a)=a\ast \frac{a\ast (a+1)}{2}\frac{a\ast (a+1)\ast (2a+1)}{6}$<br>那么原式为:<br>$$\sum_{d=1}^{n}d^3g(\left \lfloor \frac{n}{d} \right \rfloor)\sum_{x|d}\varphi (x)u(\frac{d}{x})$$<br>后面的和式我们可以预处理,函数$g$我们也可以预处理,最后用数论分块就可以完成这道题啦<br>PS:对于和式$\sum_{x|d}\varphi (x)u(\frac{d}{x})$我们需要用线性筛,用暴力的埃式筛法会T…<br>这里推荐一篇很好的<a href="https://www.cnblogs.com/zhoushuyu/p/8275530.html" target="_blank" rel="noopener">线性筛积性函数</a>博客<br>最后感谢<a href="https://blog.csdn.net/FSAHFGSADHSAKNDAS" target="_blank" rel="noopener">王大佬</a>的对我在此题的指点(考试中敢开这道题还A了的人,我除了%还能干什么…)</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 10000020</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long </span><span class="token macro property">#<span class="token directive keyword">define</span> debug system("pause") </span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">const</span> ll p <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">int</span> t<span class="token punctuation">,</span> n<span class="token punctuation">,</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> pri<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> low<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll g<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> h<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">bool</span> vis<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> h<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">int</span> t <span class="token operator">=</span> N <span class="token operator">-</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">;</span> low<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> pri<span class="token punctuation">[</span><span class="token operator">++</span> cnt<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> cnt <span class="token operator">&&</span> i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator"><=</span> t<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> vis<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">%</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> low<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> low<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">==</span> low<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">==</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> h<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">else</span> h<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> low<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span><span class="token operator">=</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> h<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> h<span class="token punctuation">[</span>i <span class="token operator">/</span> low<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">*</span> h<span class="token punctuation">[</span>low<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> h<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> h<span class="token punctuation">[</span>pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> low<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>i <span class="token operator">*</span> i<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">*</span> i<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> h<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> ll x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> y <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> z <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> x <span class="token operator">+</span><span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> y <span class="token operator">+</span><span class="token operator">=</span> i<span class="token punctuation">;</span> z <span class="token operator">+</span><span class="token operator">=</span> i <span class="token operator">*</span> i<span class="token punctuation">;</span> x <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> y <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> z <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>x <span class="token operator">*</span> y<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span> <span class="token operator">*</span> z<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> ll ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> l <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> r<span class="token punctuation">;</span> l <span class="token operator"><=</span> n<span class="token punctuation">;</span> l <span class="token operator">=</span> r <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> r <span class="token operator">=</span> n <span class="token operator">/</span> <span class="token punctuation">(</span>n <span class="token operator">/</span> l<span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> ans <span class="token operator">+</span> <span class="token punctuation">(</span>g<span class="token punctuation">[</span>n <span class="token operator">/</span> l<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token punctuation">(</span>h<span class="token punctuation">[</span>r<span class="token punctuation">]</span> <span class="token operator">-</span> h<span class="token punctuation">[</span>l <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld\n"</span><span class="token punctuation">,</span> ans <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 数学 </tag>
<tag> 莫比乌斯反演 </tag>
</tags>
</entry>
<entry>
<title>MORE XOR</title>
<link href="/2019/04/23/MORE-XOR/"/>
<url>/2019/04/23/MORE-XOR/</url>
<content type="html"><![CDATA[<h1 id="MORE-XOR"><a href="#MORE-XOR" class="headerlink" title="MORE XOR"></a>MORE XOR</h1><p>标签: 思维 位运算</p><hr><p>Given a sequence of nnn numbers $a1,a2,⋯ ,an$ and three functions.<br>Define a function $f(l,r)$ which returns $⊕a[x]$ The $⊕$presents exclusive OR.</p><p>Define a function $g(l,r)$which returns$⊕f(x,y)(l≤x≤y≤r)$.</p><p>Define a function $w(l,r)$ which returns$⊕g(x,y)(l≤x≤y≤r)$.</p><p>You are also given a number of xor-queries. A xor-query is a pair (i,j) (1≤i≤j≤n). For each xor-query (i,j), you have to answer the result of function $w(l,r)$.<br>Problem From:<a href="https://www.jisuanke.com/contest/2290?view=challenges" target="_blank" rel="noopener">The Preliminary Contest for ICPC China Nanchang National Invitational</a></p><h2 id="Input"><a href="#Input" class="headerlink" title="Input"></a>Input</h2><p>Line 1: $t$ (1≤t≤20).</p><p>For each test case:</p><p>Line 1: $n$ (1≤n≤100000).</p><p>Line 2: numbers $a1,a2,⋯ ,an$ (1≤ai<=10^9).</p><p>Line 3: $q$(1≤q≤100000) the number of xor-queries.</p><p>In the next q lines, each line contains 2 numbers i,j representing a xor-query (1≤i≤j≤n).</p><p>It is guaranteed that sum of n and q≤10^6</p><h2 id="Output"><a href="#Output" class="headerlink" title="Output"></a>Output</h2><p>For each xor-query (i,j), print the result of function $w(i,j)$ in a single line.</p><h2 id="样例输入"><a href="#样例输入" class="headerlink" title="样例输入"></a>样例输入</h2><p>1<br>5<br>1 2 3 4 5<br>5<br>1 3<br>1 5<br>1 4<br>4 5<br>3 5</p><h2 id="样例输出"><a href="#样例输出" class="headerlink" title="样例输出"></a>样例输出</h2><p>2<br>4<br>0<br>1<br>4</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>感觉比较恶心的一道找规律题,当时在考场没有找全规律(不过看其他大佬一会儿就找出来了,可能是我找答案的方法不够清奇吧orz)<br>首先这道题一看都跟前缀异或和有关。<br>f[l,r]就不用说了,和普通前缀和一样<br>g[l,r]怎么理解呢,可以看做是一个从(l,l)到(l,r)到(r,r)组成的上三角平面的f[x,y]的点全部异或起来。<br>你会发现如果把(1,1)到(r,r)这条线上的点全部异或起来答案等于sum[r](从a1到ar的前缀和)<br>按照这个思想我们继续思考从(1,2)到(r,r-1)的规律,(1,3)到(r,r-2)等等<br>可以发现:<br>当n为奇数时:g[1,n] = sum2[n];(sum2[i]是sum[i]的前缀和)<br>当n为偶数时:g[1,n] = 0;<br>可以用容斥原理继续计算g[l,r],有如下规律<br>当l+r为偶数时:g[l,r] = sum2[r] ^ sum2[l - 2]<br>当l+r为奇数时:g[l,r] = 0<br>接着我们用相同的想法思考w[l,r]<br>发现在(l,l),(l,r),(r,r)这个区域中,有贡献的点(x,y)必须满足x + y是偶数<br>于是单独考虑x+y为奇数的斜线,最后发现w[l,r]是一个关于sum2[i]数组的以四为单位的前缀和与后缀和<br>就是大概这样:<br>sum3_1[n] = sum2[n] + sum2[n - 4] + sum2[n - 8]…<br>sum3_2[n] = sum2[n] + sum2[n + 4] + sum2[n + 8]…<br>具体的规律有些抽象,这里就不描述了(不知道如何描述..)</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 1000010</span><span class="token macro property">#<span class="token directive keyword">define</span> debug system("pause") </span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> t<span class="token punctuation">,</span> m<span class="token punctuation">,</span> l<span class="token punctuation">,</span> r<span class="token punctuation">;</span><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> sum<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> sum2<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> sum3q<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> sum3h<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>sum<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>sum<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>sum2<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>sum<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>sum3q<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>sum<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>sum3h<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>sum<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> sum<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sum<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">^</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> sum2<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sum2<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">^</span> sum<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">>=</span> <span class="token number">4</span><span class="token punctuation">)</span> sum3q<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sum3q<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">^</span> sum2<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">else</span> sum3q<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sum2<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> n<span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">+</span> <span class="token number">4</span> <span class="token operator"><=</span> n<span class="token punctuation">)</span> sum3h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sum2<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">^</span> sum3h<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">else</span> sum3h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sum2<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> m<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>l<span class="token punctuation">,</span> <span class="token operator">&</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>l <span class="token operator">==</span> r<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> a<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">continue</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">int</span> t <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> x<span class="token punctuation">;</span> <span class="token keyword">int</span> a <span class="token operator">=</span> r <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">,</span> a2 <span class="token operator">=</span> r <span class="token operator">-</span> <span class="token number">3</span><span class="token punctuation">;</span> <span class="token keyword">int</span> b <span class="token operator">=</span> l<span class="token punctuation">,</span> b2 <span class="token operator">=</span> l <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> x <span class="token operator">=</span> <span class="token punctuation">(</span>a <span class="token operator">-</span> <span class="token punctuation">(</span>l <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> t <span class="token operator">=</span> t <span class="token operator">^</span> sum3q<span class="token punctuation">[</span>a<span class="token punctuation">]</span> <span class="token operator">^</span> sum3q<span class="token punctuation">[</span>a <span class="token operator">-</span> x <span class="token operator">*</span> <span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> x <span class="token operator">=</span> <span class="token punctuation">(</span>a2 <span class="token operator">-</span> <span class="token punctuation">(</span>l <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> t <span class="token operator">=</span> t <span class="token operator">^</span> sum3q<span class="token punctuation">[</span>a2<span class="token punctuation">]</span> <span class="token operator">^</span> sum3q<span class="token punctuation">[</span>a2 <span class="token operator">-</span> x <span class="token operator">*</span> <span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> x <span class="token operator">=</span> <span class="token punctuation">(</span>r <span class="token operator">-</span> b<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> t <span class="token operator">=</span> t <span class="token operator">^</span> sum3h<span class="token punctuation">[</span>b<span class="token punctuation">]</span> <span class="token operator">^</span> sum3h<span class="token punctuation">[</span>b <span class="token operator">+</span> x <span class="token operator">*</span> <span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> x <span class="token operator">=</span> <span class="token punctuation">(</span>r <span class="token operator">-</span> b2<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> t <span class="token operator">=</span> t <span class="token operator">^</span> sum3h<span class="token punctuation">[</span>b2<span class="token punctuation">]</span> <span class="token operator">^</span> sum3h<span class="token punctuation">[</span>b2 <span class="token operator">+</span> x <span class="token operator">*</span> <span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>感觉当时在考场上比较慌,最后规律没找全,看来考试的时候还是要稳住心态,找规律时候也不要慌,打表找规律也是一种不错方法的。</p>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 思维 </tag>
<tag> 位运算 </tag>
</tags>
</entry>
<entry>
<title>Two Teams</title>
<link href="/2019/04/23/Two-Teams/"/>
<url>/2019/04/23/Two-Teams/</url>
<content type="html"><![CDATA[<h1 id="Two-Teams"><a href="#Two-Teams" class="headerlink" title="Two Teams"></a>Two Teams</h1><p>标签:思维 线段树</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>There are nstudents standing in a row. Two coaches are forming two teams — the first coach chooses the first team and the second coach chooses the second team.</p><p>The i-th student has integer programming skill ai. All programming skills are distinct and between 1 and n, inclusive.</p><p>Firstly, the first coach will choose the student with maximum programming skill among all students not taken into any team, and kclosest students to the left of him and k closest students to the right of him (if there are less than k students to the left or to the right, all of them will be chosen). All students that are chosen leave the row and join the first team. Secondly, the second coach will make the same move (but all students chosen by him join the second team). Then again the first coach will make such move, and so on. This repeats until the row becomes empty (i. e. the process ends when each student becomes to some team).</p><p>Your problem is to determine which students will be taken into the first team and which students will be taken into the second team.</p><h2 id="Input"><a href="#Input" class="headerlink" title="Input"></a>Input</h2><p>The first line of the input contains two integers n<br>and k (1≤k≤n≤2⋅10^5) — the number of students and the value determining the range of chosen students during each move, respectively.</p><p>The second line of the input contains n<br>integers a1,a2,…,an (1≤ai≤n), where ai is the programming skill of the i-th student. It is guaranteed that all programming skills are distinct.</p><h2 id="Output"><a href="#Output" class="headerlink" title="Output"></a>Output</h2><p>Print a string of n characters; i-th character should be 1 if i-th student joins the first team, or 2 otherwise.</p><h2 id="Examples"><a href="#Examples" class="headerlink" title="Examples"></a>Examples</h2><p>Input<br>5 2<br>2 4 5 3 1<br>Output<br>11111</p><p>Input<br>5 1<br>2 1 3 5 4<br>Output<br>22111</p><p>Input<br>7 1<br>7 2 1 3 5 4 6<br>Output<br>1121122</p><p>Input<br>5 1<br>2 4 5 3 1<br>Output<br>21112</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>题目大意:每次从全部人中选一个最大的人,并向左向右扩展至k位(若遇到边界则停下),然后标号并删去这些人,重复操作直至所有人都被标号。<br>一个简单的想法,每次线段树查到1-n里最大的值的地址pos,然后区间修改[pos - k, pos + k]为0,顺便标号。但是会发现一个问题,就是我们每次向左向右扩展的时候可能是O(n)的(这里扩展k为是指的有效人数,那些已经被标记过的人就不会算进去了),因此我们要处理出一个Left[N]和Right[N],Left[i]i表示从i开始向左到Left[i]这之间所有人都被标记过,Right[i]同理。所以到时候遍历时每次跳Left[i]和Right[i]就可以了<br>说道这里,这道题也就被解决了。不过题目中还有一个性质我们没用:所有人的值是一个n的全排列的一种。所以考虑这个性质我们完全不用线段树。<br>第一次最大值肯定为n,进行标号操作时我们可以把每个人的所对应权值全部标记为false,然后从n-1到1找到第一个值为true的人,这个人的权值肯定为当前区间最大的,重复上述操作即可。不用线段树可以大大降低代码量</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token comment" spellcheck="true">//线段树版</span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdio></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstring></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdlib></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cmath></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><algorithm></span></span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token macro property">#<span class="token directive keyword">define</span> N 200010</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span>m<span class="token punctuation">,</span>p<span class="token punctuation">,</span>x<span class="token punctuation">,</span>y<span class="token punctuation">,</span>k<span class="token punctuation">,</span>tl<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> tr<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span>b<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">struct</span> node<span class="token punctuation">{</span><span class="token keyword">int</span> sum<span class="token punctuation">,</span>l<span class="token punctuation">,</span>r<span class="token punctuation">,</span>p<span class="token punctuation">,</span>res<span class="token punctuation">;</span><span class="token punctuation">}</span> t<span class="token punctuation">[</span>N<span class="token operator">*</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">rd</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">&</span>ans<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> f<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>ans<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">char</span> x<span class="token operator">=</span><span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>x<span class="token operator">></span><span class="token string">'9'</span> <span class="token operator">||</span> x<span class="token operator"><</span><span class="token string">'0'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">if</span><span class="token punctuation">(</span>x<span class="token operator">==</span><span class="token string">'-'</span><span class="token punctuation">)</span> f<span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>x<span class="token operator">=</span><span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">while</span><span class="token punctuation">(</span>x<span class="token operator">>=</span><span class="token string">'0'</span> <span class="token operator">&&</span> x<span class="token operator"><=</span><span class="token string">'9'</span><span class="token punctuation">)</span> ans<span class="token operator">=</span>ans<span class="token operator">*</span><span class="token number">10</span><span class="token operator">+</span>x<span class="token operator">-</span><span class="token string">'0'</span><span class="token punctuation">,</span>x<span class="token operator">=</span><span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ans<span class="token operator">*</span><span class="token operator">=</span>f<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">built</span><span class="token punctuation">(</span><span class="token keyword">int</span> l<span class="token punctuation">,</span><span class="token keyword">int</span> r<span class="token punctuation">,</span><span class="token keyword">int</span> x<span class="token punctuation">)</span><span class="token punctuation">{</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>l<span class="token operator">=</span>l<span class="token punctuation">,</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>r<span class="token operator">=</span>r<span class="token punctuation">,</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>l<span class="token operator">==</span>r<span class="token punctuation">)</span><span class="token punctuation">{</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token operator">=</span>a<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">;</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>res<span class="token operator">=</span>l<span class="token punctuation">;</span><span class="token keyword">return</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">int</span> mid<span class="token operator">=</span><span class="token punctuation">(</span>l<span class="token operator">+</span>r<span class="token punctuation">)</span><span class="token operator">>></span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token function">built</span><span class="token punctuation">(</span>l<span class="token punctuation">,</span>mid<span class="token punctuation">,</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">built</span><span class="token punctuation">(</span>mid<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>r<span class="token punctuation">,</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token operator">></span>t<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token punctuation">)</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum <span class="token operator">=</span> t<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token punctuation">,</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>res <span class="token operator">=</span> t<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> x<span class="token punctuation">]</span><span class="token punctuation">.</span>res<span class="token punctuation">;</span> <span class="token keyword">else</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum <span class="token operator">=</span> t<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> x <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token punctuation">,</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>res <span class="token operator">=</span> t<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> x <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>res<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">put</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span><span class="token keyword">int</span> num<span class="token punctuation">)</span><span class="token punctuation">{</span> t<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> t<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> t<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>t<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">change</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span><span class="token keyword">int</span> l<span class="token punctuation">,</span><span class="token keyword">int</span> r<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>l<span class="token operator">></span>r <span class="token operator">||</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>r<span class="token operator"><</span>l<span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>l<span class="token operator">>=</span>l <span class="token operator">&&</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>r<span class="token operator"><=</span>r<span class="token punctuation">)</span><span class="token punctuation">{</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>l<span class="token operator">!=</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>r <span class="token operator">&&</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token punctuation">)</span> <span class="token function">put</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">change</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token punctuation">,</span>l<span class="token punctuation">,</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">change</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>l<span class="token punctuation">,</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token operator">></span>t<span class="token punctuation">[</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token punctuation">)</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum <span class="token operator">=</span> t<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token punctuation">,</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>res <span class="token operator">=</span> t<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> x<span class="token punctuation">]</span><span class="token punctuation">.</span>res<span class="token punctuation">;</span> <span class="token keyword">else</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>sum <span class="token operator">=</span> t<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> x <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sum<span class="token punctuation">,</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>res <span class="token operator">=</span> t<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> x <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>res<span class="token punctuation">;</span><span class="token punctuation">}</span>node <span class="token function">query</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span><span class="token keyword">int</span> l<span class="token punctuation">,</span><span class="token keyword">int</span> r<span class="token punctuation">)</span><span class="token punctuation">{</span> node mm<span class="token punctuation">;</span> mm<span class="token punctuation">.</span>sum <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>l<span class="token operator">></span>r <span class="token operator">||</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>r<span class="token operator"><</span>l<span class="token punctuation">)</span> <span class="token keyword">return</span> mm<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>l<span class="token operator">>=</span>l <span class="token operator">&&</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>r<span class="token operator"><=</span>r<span class="token punctuation">)</span> <span class="token keyword">return</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>l<span class="token operator">!=</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>r <span class="token operator">&&</span> t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token punctuation">)</span> <span class="token function">put</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>t<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">.</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> node t1 <span class="token operator">=</span> <span class="token function">query</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token punctuation">,</span>l<span class="token punctuation">,</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span> node t2 <span class="token operator">=</span> <span class="token function">query</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>l<span class="token punctuation">,</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>t1<span class="token punctuation">.</span>sum <span class="token operator">></span> t2<span class="token punctuation">.</span>sum<span class="token punctuation">)</span> <span class="token keyword">return</span> t1<span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">return</span> t2<span class="token punctuation">;</span><span class="token punctuation">}</span>node <span class="token function">work</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> t<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> sum <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> l<span class="token punctuation">,</span> r<span class="token punctuation">;</span> <span class="token keyword">int</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> node cas<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span>l <span class="token operator">=</span> x <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> l <span class="token operator">>=</span> <span class="token number">1</span> <span class="token operator">&&</span> tot <span class="token operator"><</span> k<span class="token punctuation">;</span> l <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>b<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span> b<span class="token punctuation">[</span>l<span class="token punctuation">]</span> <span class="token operator">=</span> t<span class="token punctuation">,</span> tot <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>tr<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span> l <span class="token operator">=</span> tr<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> sum <span class="token operator">+</span><span class="token operator">=</span> tot<span class="token punctuation">;</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span>r <span class="token operator">=</span> x <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> r <span class="token operator"><=</span> n <span class="token operator">&&</span> tot <span class="token operator"><</span> k<span class="token punctuation">;</span> r <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>b<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">)</span> b<span class="token punctuation">[</span>r<span class="token punctuation">]</span> <span class="token operator">=</span> t<span class="token punctuation">,</span> tot <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>tl<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">)</span> r <span class="token operator">=</span> tl<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> sum <span class="token operator">+</span><span class="token operator">=</span> tot<span class="token punctuation">;</span> b<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> t<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//printf("%d %d %d %d %d", x, t, l, r, k); system("pause");</span> cas<span class="token punctuation">.</span>l <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>l <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> cas<span class="token punctuation">.</span>r <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>r <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">,</span> cas<span class="token punctuation">.</span>sum <span class="token operator">=</span> sum<span class="token punctuation">;</span> tl<span class="token punctuation">[</span>cas<span class="token punctuation">.</span>l<span class="token punctuation">]</span> <span class="token operator">=</span> cas<span class="token punctuation">.</span>r<span class="token punctuation">;</span> tr<span class="token punctuation">[</span>cas<span class="token punctuation">.</span>r<span class="token punctuation">]</span> <span class="token operator">=</span> cas<span class="token punctuation">.</span>l<span class="token punctuation">;</span> <span class="token keyword">return</span> cas<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">rd</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">rd</span><span class="token punctuation">(</span>k<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>i<span class="token operator"><=</span>n<span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">rd</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">built</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>n<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> sss <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>tot <span class="token operator"><</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> p <span class="token operator">=</span> <span class="token function">query</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">.</span>res<span class="token punctuation">;</span> node s<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>sss <span class="token operator">%</span> <span class="token number">2</span><span class="token punctuation">)</span> s <span class="token operator">=</span> <span class="token function">work</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">else</span> s <span class="token operator">=</span> <span class="token function">work</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">change</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> s<span class="token punctuation">.</span>l<span class="token punctuation">,</span> s<span class="token punctuation">.</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span> sss <span class="token operator">++</span><span class="token punctuation">;</span> tot <span class="token operator">+</span><span class="token operator">=</span> s<span class="token punctuation">.</span>sum<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> b<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre><pre class=" language-cpp"><code class="language-cpp"><span class="token comment" spellcheck="true">//不用线段树版</span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdio></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstring></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdlib></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cmath></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><algorithm></span></span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token macro property">#<span class="token directive keyword">define</span> N 200010</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> k<span class="token punctuation">;</span><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> b<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> to<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> tl<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> tr<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> vis<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">work</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> j<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> l<span class="token punctuation">,</span> r<span class="token punctuation">;</span> <span class="token keyword">int</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> t <span class="token operator">=</span> <span class="token punctuation">(</span>j <span class="token operator">%</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token number">1</span> <span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span>l <span class="token operator">=</span> x <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> l <span class="token operator">>=</span> <span class="token number">1</span> <span class="token operator">&&</span> tot <span class="token operator"><</span> k<span class="token punctuation">;</span> l <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>b<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span> b<span class="token punctuation">[</span>l<span class="token punctuation">]</span> <span class="token operator">=</span> t<span class="token punctuation">,</span> tot <span class="token operator">++</span><span class="token punctuation">,</span> vis<span class="token punctuation">[</span>a<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>tr<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">)</span> l <span class="token operator">=</span> tr<span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span>r <span class="token operator">=</span> x <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> r <span class="token operator"><=</span> n <span class="token operator">&&</span> tot <span class="token operator"><</span> k<span class="token punctuation">;</span> r <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>b<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">)</span> b<span class="token punctuation">[</span>r<span class="token punctuation">]</span> <span class="token operator">=</span> t<span class="token punctuation">,</span> tot <span class="token operator">++</span><span class="token punctuation">,</span> vis<span class="token punctuation">[</span>a<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>tl<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">)</span> r <span class="token operator">=</span> tl<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> vis<span class="token punctuation">[</span>a<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> b<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> t<span class="token punctuation">;</span> tl<span class="token punctuation">[</span>l <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> r <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> tr<span class="token punctuation">[</span>r <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> l <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>k<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> to<span class="token punctuation">[</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> n<span class="token punctuation">,</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token punctuation">;</span> i <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> j <span class="token operator">++</span><span class="token punctuation">,</span> <span class="token function">work</span><span class="token punctuation">(</span>to<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> j<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> b<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>这道题考场没调出来,主要是选择了一种繁琐的(线段树)方法,所以我们看问题到多方面思考,最大化利用题目中的性质,往往可以得到出其不意的效果.</p>]]></content>
<categories>
<category> 数据结构 </category>
</categories>
<tags>
<tag> 思维 </tag>
<tag> 线段树 </tag>
</tags>
</entry>
<entry>
<title>Serval and Rooted Tree</title>
<link href="/2019/04/23/Serval-and-Rooted-Tree/"/>
<url>/2019/04/23/Serval-and-Rooted-Tree/</url>
<content type="html"><![CDATA[<h1 id="Serval-and-Rooted-Tree"><a href="#Serval-and-Rooted-Tree" class="headerlink" title="Serval and Rooted Tree"></a>Serval and Rooted Tree</h1><p>标签: 动态规划 树形DP 树形结构</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>Now Serval is a junior high school student in Japari Middle School, and he is still thrilled on math as before.<br>As a talented boy in mathematics, he likes to play with numbers. This time, he wants to play with numbers on a rooted tree.<br>A tree is a connected graph without cycles. A rooted tree has a special vertex called the root. A parent of a node v is the last different from v vertex on the path from the root to the vertex v. Children of vertex v are all nodes for which v is the parent. A vertex is a leaf if it has no children.<br>The rooted tree Serval owns has n nodes, node 1 is the root. Serval will write some numbers into all nodes of the tree. However, there are some restrictions. Each of the nodes except leaves has an operation max or min written in it, indicating that the number in this node should be equal to the maximum or minimum of all the numbers in its sons, respectively.<br>Assume that there are k leaves in the tree. Serval wants to put integers 1,2,…,k to the k leaves (each number should be used exactly once). He loves large numbers, so he wants to maximize the number in the root. As his best friend, can you help him?</p><h2 id="Input"><a href="#Input" class="headerlink" title="Input"></a>Input</h2><p>The first line contains an integer n (2≤n≤3⋅105), the size of the tree.<br>The second line contains n integers, the i-th of them represents the operation in the node i. 0 represents min and 1 represents max. If the node is a leaf, there is still a number of 0 or 1, but you can ignore it.<br>The third line contains n−1 integers f2,f3,…,fn (1≤fi≤i−1), where fi represents the parent of the node i.</p><h2 id="Output"><a href="#Output" class="headerlink" title="Output"></a>Output</h2><p>Output one integer — the maximum possible number in the root of the tree.</p><h2 id="Example"><a href="#Example" class="headerlink" title="Example"></a>Example</h2><p>Input<br>6<br>1 0 1 1 0 1<br>1 2 2 2 2<br>Output<br>1</p><p>Input<br>5<br>1 0 1 0 1<br>1 1 1 1<br>Output<br>4</p><p>Input<br>8<br>1 0 0 1 0 1 1 0<br>1 1 2 2 3 3 3<br>Output<br>4</p><p>Input<br>9<br>1 1 0 0 1 0 1 0 1<br>1 1 2 2 3 3 4 4</p><p>Output<br>5</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>可以发现,我们如果知道叶子结点的值以后,我们直接遍历下去就可以的得到答案了。但我们不能枚举每个节点选什么值对吧,于是来看这max和min操作,其实就是得到儿子节点最大或最小那个,递归下去,反映的就是得到叶子结点的某一排名。<br>于是我们设dp[i]表示i节点通过操作后能得到叶子结点的最大排名。<br>转移方程:<br>若为max:<code>dp[i] = max(dp[e[i].to])</code><br>若为min:<code>dp[i] = sum(dp[e[i].to])</code><br>最后<code>ans = n - dp[1] + 1;</code></p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 300010</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> x<span class="token punctuation">,</span> sum <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> head<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">struct</span> node<span class="token punctuation">{</span><span class="token keyword">int</span> to<span class="token punctuation">,</span> next<span class="token punctuation">;</span><span class="token punctuation">}</span>e<span class="token punctuation">[</span>N <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> u<span class="token punctuation">,</span> <span class="token keyword">int</span> v<span class="token punctuation">)</span><span class="token punctuation">{</span> e<span class="token punctuation">[</span><span class="token operator">++</span> k<span class="token punctuation">]</span><span class="token punctuation">.</span>next <span class="token operator">=</span> head<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">;</span> e<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>to <span class="token operator">=</span> v<span class="token punctuation">;</span> head<span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">=</span> k<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>head<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>sum <span class="token operator">++</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> head<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> i<span class="token punctuation">;</span> i <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>next<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">dfs</span><span class="token punctuation">(</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">else</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">!</span>f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">?</span> f<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span> <span class="token operator">:</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">//printf("%d %d", x, f[x]); system("pause");</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>x<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">add</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> sum <span class="token operator">-</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p> 这道题当时考场没做出来,主要是模型转换的思维不够,还是要多积累,多刷题。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 树形结构 </tag>
<tag> 树形DP </tag>
</tags>
</entry>
<entry>
<title>树形DP总结</title>
<link href="/2019/04/21/%E6%A0%91%E5%BD%A2DP%E6%80%BB%E7%BB%93/"/>
<url>/2019/04/21/%E6%A0%91%E5%BD%A2DP%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h1 id="树形DP总结"><a href="#树形DP总结" class="headerlink" title="树形DP总结"></a>树形DP总结</h1><p>标签: 总结</p><hr><h2 id="序"><a href="#序" class="headerlink" title="序"></a>序</h2><p>做了一段时间的树形DP了,还是总结一下这类DP的套路吧,以便以后的复习与理解。</p><h2 id="核心思想"><a href="#核心思想" class="headerlink" title="核心思想"></a>核心思想</h2><p>树形DP的核心思想就是利用DFS进行递归求解。即通过DFS一直递归直到叶子结点,然后一层一层的处理并返回最优值。</p><h2 id="题目类型"><a href="#题目类型" class="headerlink" title="题目类型"></a>题目类型</h2><h3 id="一-基础树规"><a href="#一-基础树规" class="headerlink" title="一.基础树规"></a>一.基础树规</h3><p>这类题转移较为明显,一般能较快设计出状态,然后按照DFS一层一层转移即可。</p><h3 id="二-树的最小支配集,最小点覆盖与最大独立集"><a href="#二-树的最小支配集,最小点覆盖与最大独立集" class="headerlink" title="二.树的最小支配集,最小点覆盖与最大独立集"></a>二.树的最小支配集,最小点覆盖与最大独立集</h3><h4 id="最小支配集:"><a href="#最小支配集:" class="headerlink" title="最小支配集:"></a>最小支配集:</h4><p>从V中选取尽量少的点组成一个集合,让V中剩余的点都与取出来的点有边相连。<br>(点)</p><h4 id="最小点覆盖:"><a href="#最小点覆盖:" class="headerlink" title="最小点覆盖:"></a>最小点覆盖:</h4><p>从V中选取尽量少的点组成一个集合V1,让所有边(u,v)中要么u属于V1,要么v属于V1<br>(边)</p><h4 id="最大独立集:"><a href="#最大独立集:" class="headerlink" title="最大独立集:"></a>最大独立集:</h4><p>从V中选取尽量多的点组成一个集合,让这些点中间没有边项链,也就是说对于任何一条边,u,v不能同时属于集合V1.<br>关于解法详见<a href="https://www.cnblogs.com/joeylee97/p/7488710.html" target="_blank" rel="noopener">joeylee97</a>和<a href="https://www.cnblogs.com/Ash-ly/p/5783877.html" target="_blank" rel="noopener">Ashly</a>两位大佬的博客</p><h3 id="三-换根DP"><a href="#三-换根DP" class="headerlink" title="三.换根DP"></a>三.换根DP</h3><p>这类题目一般做法是要枚举所有点作为根节点,对每个根节点取最大(最小)值才能得到答案。<br>不过肯定要超时,所以我们这里采用:换根法+二次扫描法。<br>大概步骤:<br>1.任取一个点为根节点(如:1),然后进行一次DP得到以1为根节点的最优值。<br>2.再以1为根节点往下遍历,遍历到任意一个节点x后,把x当做根节点,然后把x的父亲及其以外的节点当做x一颗子树进行转移。<br>下面来看一道例题:</p><p>最大疯子树<br>【题目描述】<br>给定一棵 n 个结点的树,结点编号为 1~n,i 号结点的权重记为 wi(每个点的权值各不相同)。我们定义一个“疯子树”为:<br>1 是一个联通子图。<br>2 我们将子图内的点按照权重从小到大排序后序列为 b1,b2,…,bm,对于任意的i,bi到 bi+1最短路径(不含 bi和 bi+1)上的结点的权值都小于等于w<sub>bi</sub> 。<br>输出包含结点最多的“疯子树”的结点数。<br>【输入格式】<br>数据有多组 case,文件以 EOF 结束,每组第一行输入一个 n 表示树的节点数;<br>接下来一行包含 n 个整数,第 i 个数表示 i 号结点的权重 wi;接下行 n-1 行,第<br>i 行包含 2 个整数 ui, vi,表示 ui和 vi有一条边。<br>【输出格式】<br>对于每组 case 输出一行,包含一个整数,表示包含结点最多的“疯子树”<br> 的结点数。<br> 【样例输入】<br> 5<br> 1 4 2 3 5<br> 1 2<br> 2 3<br> 3 4<br> 4 5<br> 5<br> 2 5 4 1 3<br> 1 2<br> 2 3<br> 3 4<br> 4 5<br> 【样例输出】<br> 4<br> 4<br> 【数据范围】<br> 对于 10%的数据有所有组的 n 之和 n≤20。<br> 对于 30%的数据有所有组的 n 之和 n≤2000。<br> 对于 100%的数据有所有组的 n 之和 n≤200000,0 < wi≤100000000,n 为正整数。<br>这道题似乎是电子科大的春令营考试题目(当时去考试,没记错应该是爆0了…)<br>首先考虑一条链的情况,可以发现我们选取的这段区间必须满足先降序后升序的情况,也可以这样理解,以点x为分割点,x往左边和往右边都是升序的情况。(上里及下面所说的升序降序都是不严格的)<br>在纸上画一下大概是凹形那种样子…<br>然后我们再来考虑树,如果以节点x为分割点,那么以x为根节点,往下遍历的合法点必须是升序的。<br>所以得到一个n^2的算法,枚举每一个点为根节点,往下遍历所能得到的最大升序子图。</p><pre class=" language-cpp"><code class="language-cpp">f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> head<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> i<span class="token punctuation">;</span> i <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>next<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to <span class="token operator">==</span> fa<span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token function">dfs</span><span class="token punctuation">(</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>w<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span> <span class="token operator">>=</span> w<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>然后我们考虑优化:用换根法+二次扫描法<br>第一次以1为根节点得到f[x]表示以x为根节点的子树的最优值。<br>第二次再从1出发,当遍历到x节点时,把x节点当做根,父亲及相连的节点当做另一颗子树,那么如果w[x]<=w[fa],那么f[x]+=f[fa],否则不做处理。这样我们就换根成功了。<br>相关题目:<br><a href="http://poj.org/problem?id=3585" target="_blank" rel="noopener">POJ3585 Accumulation Degree</a><br><a href="http://acm.hdu.edu.cn/showproblem.php?pid=2196" target="_blank" rel="noopener">hdu2196 Computer</a></p><h3 id="四-树形背包DP"><a href="#四-树形背包DP" class="headerlink" title="四.树形背包DP"></a>四.树形背包DP</h3><p>待更新<br>树形依赖背包的优化方法:<a href="https://www.cnblogs.com/ezyzy/p/8505528.html#4135310" target="_blank" rel="noopener">https://www.cnblogs.com/ezyzy/p/8505528.html#4135310</a></p><h3 id="五-虚树"><a href="#五-虚树" class="headerlink" title="五.虚树"></a>五.虚树</h3><p>还没学,待更新。<br><img src="https://s2.ax1x.com/2019/04/21/EFsLP1.gif" alt="绝对不会鸽"></p><h2 id="最后的话"><a href="#最后的话" class="headerlink" title="最后的话"></a>最后的话</h2><p>树形DP还是有很多类型的,以后遇到还是要多总结,特别是一些反套路的题目,就要根据题目性质来设计转移状态了。</p>]]></content>
<categories>
<category> 总结 </category>
</categories>
<tags>
<tag> 总结 </tag>
</tags>
</entry>
<entry>
<title>[JSOI2008]魔兽地图</title>
<link href="/2019/04/21/JSOI2008-%E9%AD%94%E5%85%BD%E5%9C%B0%E5%9B%BE/"/>
<url>/2019/04/21/JSOI2008-%E9%AD%94%E5%85%BD%E5%9C%B0%E5%9B%BE/</url>
<content type="html"><![CDATA[<h1 id="JSOI2008-魔兽地图"><a href="#JSOI2008-魔兽地图" class="headerlink" title="[JSOI2008]魔兽地图"></a>[JSOI2008]魔兽地图</h1><p>标签: 动态规划 树形结构 树形DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allstars。</p><p>DotR里面的英雄只有一个属性——力量。他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄的力量值等于它购买的所有装备的力量值之和。装备分为基本装备和高级装备两种。基本装备可以直接从商店里面用金币购买,而高级装备需要用基本装备或者较低级的高级装备来合成,合成不需要附加的金币。装备的合成路线可以用一棵树来表示。</p><p>比如,Sange and Yasha的合成需要Sange,Yasha和Sange and Yasha Recipe Scroll三样物品。其中Sange又要用Ogre Axe, Belt of Giant Strength和 Sange Recipe Scroll合成。每件基本装备都有数量限制,这限制了你不能无限制地合成某些性价比很高的装备。</p><p>现在,英雄Spectre有M个金币,他想用这些钱购买装备使自己的力量值尽量高。你能帮帮他吗?他会教你魔法Haunt(幽灵附体)作为回报的。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h3><p>第一行包含两个整数,N (1 <= n <= 51) 和 m (0 <= m <= 2,000)。分别表示装备的种类数和金币数。装备用1到N的整数编号。<br>接下来的N行,按照装备1到装备n的顺序,每行描述一种装备。<br>每一行的第一个非负整数表示这个装备贡献的力量值。<br>接下来的非空字符表示这种装备是基本装备还是高级装备,A表示高级装备,B表示基本装备。如果是基本装备,紧接着的两个正整数分别表示它的单价(单位为金币)和数量限制(不超过100)。如果是高级装备,后面紧跟着一个正整数C,表示这个高级装备需要C种低级装备。后面的2C个数,依次描述某个低级装备的种类和需要的个数。</p><h3 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h3><p>第一行包含一个整数S,表示最多可以提升多少点力量值。</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1:<br>10 59<br>5 A 3 6 1 9 2 10 1<br>1 B 5 3<br>1 B 4 3<br>1 B 2 3<br>8 A 3 2 1 3 1 7 1<br>1 B 5 3<br>5 B 3 3<br>15 A 3 1 1 5 1 4 1<br>1 B 3 5<br>1 B 4 3<br>输出样例#1:<br>33</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>此题很明显是一个tree dp。但是看出来也没什么用,主要是状态转移真的不好想。<br>很容易想到这样一个转移方程:dp[i][j][k]表示以i为根,第i个节点购买j件,共分配k元给它所得到的最大收益。<br>但一转移就出锅了(其实当时我还是坚信这个方程是对的…直到调出shit来以后才意识到有什么不对)<br>为什么这样转移会出问题呢,其实主要是我们不知道他到底会有几件是用作合成的。就是儿子与父亲是有联系的,或者说儿子决定了父亲(因为有合成的限制嘛)<br>所以需要<strong><del>抄题解</del></strong>换一个角度设计方程:dp[i][j][k]表示以i为根,第i个节点共有j件用于合成,共分配k元给它所得到的最大收益。<br>你看这样设计方程,便得到了儿子与父亲的联系。(其实状态中我们不用关注儿子到底购买了几件,因为除了合成购买件数所花费的钱以外剩下的钱它想干啥干啥,只要收益最大就可以了)<br>我们首先最外层枚举一个l表示当前节点要合成l件。<br>为了转移方便,我们还需要一个g[tot][j]表示前tot个儿子分配j元并且满足此时父亲所需要件数(l * need[son]件)所得到的最大收益。<br>然后先转移g,就可以得到任意金币数下得到的最大收益。<br>最后再通过g再来转移f。<br>需要注意的是,最后可能是一个森林,所以最后还要做一个泛化背包</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 60</span><span class="token macro property">#<span class="token directive keyword">define</span> M 2010</span><span class="token macro property">#<span class="token directive keyword">define</span> debug system("pause")</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">char</span> cc<span class="token punctuation">,</span> c<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> m<span class="token punctuation">,</span> p<span class="token punctuation">,</span> x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> num<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> v<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> w<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> ans<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">,</span> head<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> g<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">,</span> dp<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">,</span> d<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> vis<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">struct</span> node<span class="token punctuation">{</span><span class="token keyword">int</span> to<span class="token punctuation">,</span> next<span class="token punctuation">;</span><span class="token punctuation">}</span>e<span class="token punctuation">[</span>N <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> u<span class="token punctuation">,</span> <span class="token keyword">int</span> v<span class="token punctuation">)</span><span class="token punctuation">{</span> e<span class="token punctuation">[</span><span class="token operator">++</span> k<span class="token punctuation">]</span><span class="token punctuation">.</span>next <span class="token operator">=</span> head<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">;</span> e<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>to <span class="token operator">=</span> v<span class="token punctuation">;</span> head<span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">=</span> k<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>head<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> num<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> i<span class="token punctuation">;</span> j <span class="token operator"><=</span> num<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">*</span> v<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>j <span class="token operator">-</span> i<span class="token punctuation">)</span> <span class="token operator">*</span> w<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> max_num <span class="token operator">=</span> <span class="token number">1e9</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> head<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> i<span class="token punctuation">;</span> i <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>next<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">dfs</span><span class="token punctuation">(</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">)</span><span class="token punctuation">;</span> max_num <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>max_num<span class="token punctuation">,</span> num<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span> <span class="token operator">/</span> d<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> v<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> v<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span> <span class="token operator">*</span> d<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> num<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>max_num<span class="token punctuation">,</span> m <span class="token operator">/</span> v<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> l <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> l <span class="token operator"><=</span> num<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> l <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>g<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0x3f3f3f</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>g<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//这里需要初始化,否则倒序枚举l </span> g<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> tot <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> head<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> i<span class="token punctuation">;</span> i <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>next<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> to <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">;</span> tot <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> m<span class="token punctuation">;</span> j <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> j<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> g<span class="token punctuation">[</span>tot<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>g<span class="token punctuation">[</span>tot<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> g<span class="token punctuation">[</span>tot <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>to<span class="token punctuation">]</span><span class="token punctuation">[</span>l <span class="token operator">*</span> d<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>to<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> l<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> m<span class="token punctuation">;</span> j <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">--</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> g<span class="token punctuation">[</span>tot<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token punctuation">(</span>l <span class="token operator">-</span> i<span class="token punctuation">)</span> <span class="token operator">*</span> w<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0x3f3f3f</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%c%c"</span><span class="token punctuation">,</span> <span class="token operator">&</span>w<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">&</span>cc<span class="token punctuation">,</span> <span class="token operator">&</span>c<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>c<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">'A'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> p<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>x<span class="token punctuation">,</span> <span class="token operator">&</span>y<span class="token punctuation">)</span><span class="token punctuation">;</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> y<span class="token punctuation">;</span> <span class="token function">add</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span> vis<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>v<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">&</span>num<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> num<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>num<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> m <span class="token operator">/</span> v<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">dfs</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> cnt <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> m<span class="token punctuation">;</span> j<span class="token punctuation">;</span> j <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> j<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> ans<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>ans<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> ans<span class="token punctuation">[</span>j <span class="token operator">-</span> k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> ans<span class="token punctuation">[</span>m<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>感觉tree dp有时候不按套路来啊,还是需要具体问题具体分析,找到题目的性质才是重要的。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 树形结构 </tag>
<tag> 树形DP </tag>
</tags>
</entry>
<entry>
<title>[HAOI2015]树上染色</title>
<link href="/2019/04/21/HAOI2015-%E6%A0%91%E4%B8%8A%E6%9F%93%E8%89%B2/"/>
<url>/2019/04/21/HAOI2015-%E6%A0%91%E4%B8%8A%E6%9F%93%E8%89%B2/</url>
<content type="html"><![CDATA[<h1 id="HAOI2015-树上染色"><a href="#HAOI2015-树上染色" class="headerlink" title="[HAOI2015]树上染色"></a>[HAOI2015]树上染色</h1><p>标签: 动态规划 树形结构 树形DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>有一棵点数为 N 的树,树边有边权。给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 。 将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的距离的和的受益。问受益最大值是多少。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h3><p>第一行包含两个整数 N, K 。接下来 N-1 行每行三个正整数 fr, to, dis , 表示该树中存在一条长度为 dis 的边 (fr, to) 。输入保证所有点之间是联通的。</p><h3 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h3><p>输出一个正整数,表示收益的最大值。</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1:<br>3 1<br>1 2 1<br>1 3 2<br>输出样例#1:<br>3</p><h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>对于 100% 的数据, 0<=K<=N <=2000</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>此题乍一看似乎不像一般tree dp的套路,因为当这个节点染色以后,会产生与其他节点的作用。<br>很容易想到的方程:dp[i][j]表示节点为i时,以i为根染j个节点为白色的最大值。但是我们这样设方程无法计算以i为根以外产生的贡献。所以我们要换个角度,从“大局”出发<br>设dp[i][j]表示节点为i时,以i为根染j个节点为白色的对答案的最大贡献,就是考虑节点i与儿子直接相连的边产生的贡献+儿子产生的贡献。<br>那么转移方程也就可以得到了:</p><pre class=" language-cpp"><code class="language-cpp">ll w <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>w <span class="token operator">*</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> <span class="token punctuation">(</span>m <span class="token operator">-</span> k<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>son<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span> <span class="token operator">-</span> k<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">-</span> m <span class="token operator">-</span> son<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span> <span class="token operator">+</span> k<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> w<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>就是以边为对象,分别计算对黑色和白色产生的贡献</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 2010</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> m<span class="token punctuation">,</span> x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> son<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> head<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> z<span class="token punctuation">;</span><span class="token keyword">struct</span> node<span class="token punctuation">{</span><span class="token keyword">int</span> to<span class="token punctuation">,</span> next<span class="token punctuation">;</span> ll w<span class="token punctuation">;</span><span class="token punctuation">}</span>e<span class="token punctuation">[</span>N <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> u<span class="token punctuation">,</span> <span class="token keyword">int</span> v<span class="token punctuation">,</span> ll w<span class="token punctuation">)</span><span class="token punctuation">{</span> e<span class="token punctuation">[</span><span class="token operator">++</span> k<span class="token punctuation">]</span><span class="token punctuation">.</span>next <span class="token operator">=</span> head<span class="token punctuation">[</span>u<span class="token punctuation">]</span><span class="token punctuation">;</span> e<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token operator">=</span> v<span class="token punctuation">;</span> e<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span>w <span class="token operator">=</span> w<span class="token punctuation">;</span> head<span class="token punctuation">[</span>u<span class="token punctuation">]</span> <span class="token operator">=</span> k<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">ss</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> fa<span class="token punctuation">)</span><span class="token punctuation">{</span> son<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> head<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> i<span class="token punctuation">;</span> i <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>next<span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to <span class="token operator">!=</span> fa<span class="token punctuation">)</span> <span class="token function">ss</span><span class="token punctuation">(</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">,</span> son<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> son<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> fa<span class="token punctuation">)</span><span class="token punctuation">{</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> head<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> i<span class="token punctuation">;</span> i <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>next<span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to <span class="token operator">!=</span> fa<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">dfs</span><span class="token punctuation">(</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> son<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> j <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> t <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>j<span class="token punctuation">,</span> son<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> t<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//注意k的枚举顺序需要为正序,否则会使得f[x][j]有初值 </span> <span class="token punctuation">{</span> ll w <span class="token operator">=</span> e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>w <span class="token operator">*</span> <span class="token punctuation">(</span>k <span class="token operator">*</span> <span class="token punctuation">(</span>m <span class="token operator">-</span> k<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>son<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span> <span class="token operator">-</span> k<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">-</span> m <span class="token operator">-</span> son<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span> <span class="token operator">+</span> k<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k<span class="token punctuation">]</span> <span class="token operator">+</span> f<span class="token punctuation">[</span>e<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>to<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> w<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">0x7f7f7f</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//需要有这个初始化,因为此题由于状态转移的特殊,不能使用未被更新的状态 </span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>x<span class="token punctuation">,</span> <span class="token operator">&</span>y<span class="token punctuation">,</span> <span class="token operator">&</span>z<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">add</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> y<span class="token punctuation">,</span> z<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">add</span><span class="token punctuation">(</span>y<span class="token punctuation">,</span> x<span class="token punctuation">,</span> z<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">ss</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>m<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>如果从常用套路得不到答案时,往往可以换一个角度思考,大胆假设一种全新的方程定义。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 树形结构 </tag>
<tag> 树形DP </tag>
</tags>
</entry>
<entry>
<title>1007. Red-black Tree</title>
<link href="/2019/04/21/1007-Red-black-Tree/"/>
<url>/2019/04/21/1007-Red-black-Tree/</url>
<content type="html"><![CDATA[<h1 id="1007-Red-black-Tree"><a href="#1007-Red-black-Tree" class="headerlink" title="1007. Red-black Tree"></a>1007. Red-black Tree</h1><p>标签: 动态规划 树形结构</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>There is a kind of binary tree named red-black tree in the data structure. It has the following 5 properties:</p><p>(1) Every node is either red or black.<br>(2) The root is black.<br>(3) All the leaves are NULL nodes and are colored black.<br>(4) Each red node must have 2 black descends (may be NULL).<br>(5) All simple paths from any node x to a descendant leaf have the same number of black nodes.</p><p>We call a non-NULL node an internal node. From property (5) we can define the black-height of a red-black tree as the number of nodes on the simple path from the root (excluding the root itself) to any NULL leaf (including the NULL leaf). And we can derive that a red-black tree with black height H has at least 2H-1 internal nodes.</p><p>Here comes the question: given a positive N, how many distinct red-black trees are there that consist of exactly N internal nodes?</p><h2 id="Input-Specification"><a href="#Input-Specification" class="headerlink" title="Input Specification:"></a>Input Specification:</h2><p>Each input file contains one test case which gives a positive integer N (<= 500).</p><h2 id="Output-Specification"><a href="#Output-Specification" class="headerlink" title="Output Specification:"></a>Output Specification:</h2><p>For each case, print in a line the number of distinct red-black tees with N internal nodes. Since the answer may be very large, output the remainder of it divided by 1000000007 please.</p><h2 id="Sample-Input"><a href="#Sample-Input" class="headerlink" title="Sample Input:"></a>Sample Input:</h2><p>5</p><h2 id="Sample-Output"><a href="#Sample-Output" class="headerlink" title="Sample Output:"></a>Sample Output:</h2><p>8</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>题目大意:给你一颗含有n个节点的红黑树,问有多少种方案数。(如果不知道啥是红黑树,右转百度)</p><p>最开始我的想法用dfs+组合数学,因为必须满足高度相等,所以我枚举上一层高度含有多少个黑色和白色节点,用组合数计算,不过其实枚举了很多重复的状态,所以最后T了一个点。<br>正解是DP:<br>设f[0/1][i][j]表示高度为i含有j个节点,当前节点为黑色/白色。<br>其实状态建立好了,转移方程就很明显了:</p><pre class=" language-cpp"><code class="language-cpp"><span class="token comment" spellcheck="true">//当前节点是黑色 </span>f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span>f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">2</span> <span class="token operator">%</span> p<span class="token punctuation">;</span>f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span>f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//红色 </span>f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span>f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span></code></pre><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token comment" spellcheck="true">//DP版 </span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 600</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token macro property">#<span class="token directive keyword">define</span> p 1000000007</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>ll n<span class="token punctuation">,</span> h<span class="token punctuation">;</span>ll Log<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> Log<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> Log<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> Log<span class="token punctuation">[</span>i <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span> h <span class="token operator">=</span> Log<span class="token punctuation">[</span>n<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> h<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator"><</span> j<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//当前节点是黑色 </span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">2</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//红色 </span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> k <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> ll ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> h<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> ans <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> ans <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><pre class=" language-cpp"><code class="language-cpp"><span class="token comment" spellcheck="true">//递归版 </span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 1100</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token macro property">#<span class="token directive keyword">define</span> p 1000000007</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">,</span> m<span class="token punctuation">;</span>ll ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>ll c<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> bin<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">pre</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> bin<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">20</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> bin<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> bin<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">int</span> t <span class="token operator">=</span> <span class="token number">510</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> c<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> c<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><</span> i<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> c<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>c<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> c<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token keyword">int</span> b<span class="token punctuation">,</span> <span class="token keyword">int</span> d<span class="token punctuation">,</span> <span class="token keyword">int</span> D<span class="token punctuation">,</span> <span class="token keyword">int</span> x<span class="token punctuation">,</span> ll sum<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> cnt <span class="token operator">=</span> <span class="token number">2</span> <span class="token operator">*</span> b<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//红色必须有黑节点承担 </span> <span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>d <span class="token operator">==</span> D <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ans <span class="token operator">=</span> ans <span class="token operator">+</span> sum <span class="token operator">*</span> c<span class="token punctuation">[</span>cnt<span class="token punctuation">]</span><span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> ans <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> cnt<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//枚举红色节点 </span> <span class="token punctuation">{</span> ll q <span class="token operator">=</span> c<span class="token punctuation">[</span>cnt<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token function">dfs</span><span class="token punctuation">(</span>cnt <span class="token operator">+</span> i<span class="token punctuation">,</span> d <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> D<span class="token punctuation">,</span> x <span class="token operator">-</span> <span class="token punctuation">(</span>cnt <span class="token operator">+</span> <span class="token number">2</span> <span class="token operator">*</span> i<span class="token punctuation">)</span><span class="token punctuation">,</span> sum <span class="token operator">*</span> q <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">pre</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">20</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>bin<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">></span> n<span class="token punctuation">)</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>n <span class="token operator">>=</span> bin<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token operator">&&</span> n <span class="token operator"><=</span> bin<span class="token punctuation">[</span><span class="token number">2</span> <span class="token operator">*</span> i<span class="token punctuation">]</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> i<span class="token punctuation">,</span> n <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> <span class="token number">20</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>n <span class="token operator">==</span> bin<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> ans <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> ans <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>根据题目性质设计状态,往往可以得到一个不错的状态转移。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 树形结构 </tag>
</tags>
</entry>
<entry>
<title>股票市场Stock Market</title>
<link href="/2019/03/26/%E8%82%A1%E7%A5%A8%E5%B8%82%E5%9C%BAStock-Market/"/>
<url>/2019/03/26/%E8%82%A1%E7%A5%A8%E5%B8%82%E5%9C%BAStock-Market/</url>
<content type="html"><![CDATA[<h1 id="股票市场Stock-Market"><a href="#股票市场Stock-Market" class="headerlink" title="股票市场Stock Market"></a>股票市场Stock Market</h1><p>标签: 动态规划 背包DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>尽管奶牛天生谨慎,它们仍然在住房抵押信贷市场中大受打击,现在它们准备在股市上碰碰运气。贝西有内部消息,她知道S只股票在今后D天内的价格。<br>假设在一开始,她筹集了M元钱,那么她该怎样操作才能赚到最多的钱呢?贝西在每天可以买卖多只股票,也可以多次买卖同一只股票,交易单位必须是整数,数量不限。举一个牛市的例子:<br>假设贝西有 10 元本金,股票价格如下:<br>股票 今天的价格 明天的价格 后天的价格<br>A 10 15 15<br>B 13 11 20</p><p>最赚钱的做法是:今天买入 A股 1 张,到明天把它卖掉并且买入 B 股 1 张,在后天卖掉 B股,这样贝西就有 24 元了。</p><h2 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h2><p>第一行:三个整数 S,D 和 M,$2≤S≤50 ; 2≤D≤10 ; 1≤M≤200000 $<br>第二行到第 S + 1 行:第 i + 1 行有 D 个整数: Pi;1到 Pi;D表示第 i种股票在第一天到最后一天的售价,对所有 $1 ≤ j ≤ D,1≤Pi;j≤1000$</p><h2 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h2><p>单个整数:表示奶牛可以获得的最大钱数,保证这个数不会超过 500000</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1:<br>2 3 10<br>10 15 15<br>13 11 20<br>输出样例#1:<br>24 </p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>一个很简单的思想便是在i天时,枚举1到i-1天,然后枚举股票种类数,枚举持钱数分别转移,但这样转移肯定会超时。分析题目性质,如果我们从第一天买入A股,第三天卖出,完全等价于第一天买入A股,第二天卖出A股,第二天买入A股,第三天卖出A股。(感觉很像放屁…)<br>我们这样思考的话就可以发现,每天的利润只和前一天有关,因此我们只用顺序枚举天数即可挨个转移了,而且题目还有限制:保证奶牛最多不会超过500000的钱,这相当于就是在暗示我们状态设计了(然鹅我太弱并没有开出来…)<br>设F[i][j]表示在i天持有j钱所获得的最大利润,这里j就相当于容量,利润就相当于价值,并且股票可以无限买,所以就转换成完全背包问题了,每次所获得利润加上本钱就构成了下一天的本钱(容量)<br>由于只和状态前一天有关,所以可以滚动为一维</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span> </span><span class="token macro property">#<span class="token directive keyword">define</span> N 55</span><span class="token macro property">#<span class="token directive keyword">define</span> M 500010</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">read</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">&</span>ans<span class="token punctuation">)</span><span class="token punctuation">{</span> ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">int</span> f <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">char</span> x <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token string">'9'</span> <span class="token operator">||</span> x <span class="token operator"><</span> <span class="token string">'0'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">if</span><span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token string">'-'</span><span class="token punctuation">)</span> f <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> x <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">while</span><span class="token punctuation">(</span>x <span class="token operator">>=</span> <span class="token string">'0'</span> <span class="token operator">&&</span> x <span class="token operator"><=</span> <span class="token string">'9'</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> <span class="token number">10</span> <span class="token operator">+</span> x <span class="token operator">-</span> <span class="token string">'0'</span><span class="token punctuation">,</span> x <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">*</span><span class="token operator">=</span> f<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> s<span class="token punctuation">,</span> d<span class="token punctuation">,</span> m<span class="token punctuation">,</span> tmp<span class="token punctuation">;</span> <span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>M<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>s<span class="token punctuation">,</span> <span class="token operator">&</span>d<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">register</span> <span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> s<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">register</span> <span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> d<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> tmp <span class="token operator">=</span> m<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">register</span> <span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> d<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">register</span> <span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> s<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">register</span> <span class="token keyword">int</span> k <span class="token operator">=</span> a<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> k <span class="token operator"><=</span> tmp<span class="token punctuation">;</span> k <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator"><</span> f<span class="token punctuation">[</span>k <span class="token operator">-</span> a<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">+</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">-</span> a<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>k <span class="token operator">-</span> a<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">+</span> a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">-</span> a<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> tmp <span class="token operator">=</span> f<span class="token punctuation">[</span>tmp<span class="token punctuation">]</span> <span class="token operator">+</span> tmp<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> tmp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>感觉对题目划分阶段很重要啊,并且要注意题目的特殊限制或者条件,往往这就是突破口。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 背包DP </tag>
</tags>
</entry>
<entry>
<title>购买饲料Buying Feed</title>
<link href="/2019/03/26/%E8%B4%AD%E4%B9%B0%E9%A5%B2%E6%96%99Buying-Feed/"/>
<url>/2019/03/26/%E8%B4%AD%E4%B9%B0%E9%A5%B2%E6%96%99Buying-Feed/</url>
<content type="html"><![CDATA[<h1 id="购买饲料Buying-Feed"><a href="#购买饲料Buying-Feed" class="headerlink" title="购买饲料Buying Feed"></a>购买饲料Buying Feed</h1><p>标签: 动态规划 背包DP</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>约翰开车来到镇上,他要带KKK吨饲料回家。运送饲料是需要花钱的,如果他的车上有X吨饲料,每公里就要花费$X^2$元,开车D公里就需要$D×X^2$元。约翰可以从N家商店购买饲料,所有商店都在一个坐标轴上,第iii家店的位置是$Xi$,饲料的售价为每吨$Ci$元,库存为$Fi$。</p><p>约翰从坐标$X=0$开始沿坐标轴正方向前进,他家在坐标$X=E$上。为了带$K$吨饲料回家,约翰最少的花费是多少呢?假设所有商店的库存之和不会少于$K$。</p><p>举个例子,假设有三家商店,情况如下所示:<br>坐标 $X=1 X=3 X=4 E=5$<br>库存 1 1 1<br>售价 1 2 2</p><p>如果$K=2$,约翰的最优选择是在离家较近的两家商店购买饲料,则花在路上的钱是$1+4=5$,花在商店的钱是$2+2=4$,共需要$9$元。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><p>输入格式:</p><p>第1行:三个整数K,E,N 第2..N+1行:第i+1行的三个整数代表,Xi,Fi,Ci</p><p>输出格式:<br>一个整数,代表最小花费</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1<br>2 5 3<br>3 1 2<br>4 1 2<br>1 1 1<br>输出样例#1<br>9</p><h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>$1≤K≤10000,1≤E≤500,1≤N≤500$<br>$0<Xi<E,1≤Fi≤10000,1≤Ci≤10^7$</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>这道题用多重背包没什么说的,写在这里向强调的是在多重背包二进制优化的时候,我们必须转移以前的状态后才能转移当前二进制处理过的状态,比如这样</p><pre class=" language-cpp"><code class="language-cpp"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> V<span class="token punctuation">;</span> k <span class="token operator">>=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//不买</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> cnt<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//买</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> V<span class="token punctuation">;</span> k <span class="token operator">>=</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">;</span> k <span class="token operator">--</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">]</span> <span class="token operator">+</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>v<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//多重背包要先转移前面的状态在二进制转换接下来的状态 </span><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> V<span class="token punctuation">;</span> k <span class="token operator">>=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator">--</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> k <span class="token operator">*</span> k <span class="token operator">*</span> <span class="token punctuation">(</span>d<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><bits/stdc++.h></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 510</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>ll V<span class="token punctuation">,</span> e<span class="token punctuation">,</span> n<span class="token punctuation">,</span> x<span class="token punctuation">,</span> y<span class="token punctuation">;</span>ll f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N <span class="token operator">*</span> <span class="token number">20</span><span class="token punctuation">]</span><span class="token punctuation">,</span> d<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> cnt<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">struct</span> node<span class="token punctuation">{</span>ll s<span class="token punctuation">,</span> v<span class="token punctuation">;</span><span class="token punctuation">}</span>p<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">20</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">struct</span> node2<span class="token punctuation">{</span>ll d<span class="token punctuation">,</span> x<span class="token punctuation">,</span> y<span class="token punctuation">;</span><span class="token punctuation">}</span>P<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">cmp</span><span class="token punctuation">(</span>node2 a<span class="token punctuation">,</span> node2 b<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> a<span class="token punctuation">.</span>d <span class="token operator"><</span> b<span class="token punctuation">.</span>d<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld%lld%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>V<span class="token punctuation">,</span> <span class="token operator">&</span>e<span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> V<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1e18</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld%lld%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>P<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>d<span class="token punctuation">,</span> <span class="token operator">&</span>P<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y<span class="token punctuation">,</span> <span class="token operator">&</span>P<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">sort</span><span class="token punctuation">(</span>P <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> P <span class="token operator">+</span> n <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> cmp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> P<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>d<span class="token punctuation">;</span> ll x <span class="token operator">=</span> P<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>x<span class="token punctuation">,</span> y <span class="token operator">=</span> P<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>y<span class="token punctuation">;</span> <span class="token keyword">int</span> bin <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>bin <span class="token operator"><=</span> y<span class="token punctuation">)</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token operator">++</span> cnt<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>s <span class="token operator">=</span> bin<span class="token punctuation">,</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>cnt<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>v <span class="token operator">=</span> bin <span class="token operator">*</span> x<span class="token punctuation">,</span> y <span class="token operator">-</span><span class="token operator">=</span> bin<span class="token punctuation">,</span> bin <span class="token operator"><<=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>y <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token operator">++</span> cnt<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>s <span class="token operator">=</span> y<span class="token punctuation">,</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>cnt<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>v <span class="token operator">=</span> y <span class="token operator">*</span> x<span class="token punctuation">;</span> <span class="token punctuation">}</span> d<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> d<span class="token punctuation">[</span>n <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> e<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> V<span class="token punctuation">;</span> k <span class="token operator">>=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//不买</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> cnt<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">//买</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> V<span class="token punctuation">;</span> k <span class="token operator">>=</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">;</span> k <span class="token operator">--</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>s<span class="token punctuation">]</span> <span class="token operator">+</span> p<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span>v<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//多重背包要先转移前面的状态在二进制转换接下来的状态 </span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> V<span class="token punctuation">;</span> k <span class="token operator">>=</span> <span class="token number">1</span><span class="token punctuation">;</span> k <span class="token operator">--</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> k <span class="token operator">*</span> k <span class="token operator">*</span> <span class="token punctuation">(</span>d<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">[</span>V<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>要注意转移的顺序和状态</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 背包DP </tag>
</tags>
</entry>
<entry>
<title>关于一类LIS转LCS的问题</title>
<link href="/2019/03/25/%E5%85%B3%E4%BA%8E%E4%B8%80%E7%B1%BBLIS%E8%BD%ACLCS%E7%9A%84%E9%97%AE%E9%A2%98/"/>
<url>/2019/03/25/%E5%85%B3%E4%BA%8E%E4%B8%80%E7%B1%BBLIS%E8%BD%ACLCS%E7%9A%84%E9%97%AE%E9%A2%98/</url>
<content type="html"><![CDATA[<h1 id="关于一类LIS转LCS的问题"><a href="#关于一类LIS转LCS的问题" class="headerlink" title="关于一类LIS转LCS的问题"></a>关于一类LIS转LCS的问题</h1><p>标签: 总结 动态规划 序列DP</p><hr><h2 id="1-序"><a href="#1-序" class="headerlink" title="1.序"></a>1.序</h2><p>LIS:最长上升子序列,众所周知有n^2的算法,不过由于效率较低所以现在一般都是nlogn的算法(单调栈,树状数组解决),具体方法在此就不过多叙述。<br>LCS:最长公共子序列,即求两个序列的最长的相同子序列。现在所知解决这一类问题的方法只有n^2的动态规划。<br>而今天在这里讨论的便是一类特殊的LCS问题,通过一些转换可变成nlogn的LIS问题。</p><h2 id="2-引入"><a href="#2-引入" class="headerlink" title="2.引入"></a>2.引入</h2><p>我们可以先想一想LIS与LCS如何联系起来。LIS一般就是单个元素的问题,而LCS是涉及二元组(两个元素相同嘛)的问题。<br>先来思考这样一个问题,给你一串二元组(x,y),要你选取二元组序列使得x,y分别递增,问长度最大。<br>eg:(1,2),(3,4),(5,6)便是一个合法的递增二元组<br>如何解决呢?<br>其实我们只需要对x排序以后,对y按照LIS的方法解决就可以了对吧。因为对x排序以后我们就保证x是递增的了,于是接下来只需满足y递增就行了。</p><h2 id="3-转换"><a href="#3-转换" class="headerlink" title="3.转换"></a>3.转换</h2><p>现在思考LCS,我们最长公共子序列子序列也可以看成一些二元组(i1,j1),(i2,j2)…..(in,jn)<br>满足a[i1]=b[j1], a[i2]=b[j2],….,a[in]=b[jn]<br>并且i1 < i2 <….< in; j1 < j2 <…< jn;<br>诶似乎到这里问题就变得明朗起来了,我们只需要对A序列的每个字符c,得到在B序列出现的位置,然后组成二元组用上述方法便可以解决了。<br>不过怎么统计在B中出现的位置呢,每个每个统计又变成n^2的复杂度了。<br>所以我们才说这个方法是处理一类“特殊”LCS问题嘛。<br>一般这类问题每个字符出现的范围很少(比如只有小写字母),或者每个字符出现次数有限(比如A,B序列都是一个N的全排列的一种),于是我们就可以开一个数组映射就好了。<br>还有一个问题,如果A序列的一个字符在B中出现多次怎么办,比如 A:abbbccc B: bbccaaa<br>这里a在B中5 6 7位置均出现过。即(1,5),(1,6),(1,7)<br>但这三个只能选一个咋整<img src="http://dingyue.nosdn.127.net/nnGLVe2NHLhtI2q0s3czM87wsNqPRRSTXmrSEFjck9ZPn1534322907172.jpeg" alt=""><br>全选肯定是不行的,所以排序的时候若x相同则要按照y从大到小排序,那么这样就保证只会选到一个了</p><h2 id="4-相关题目"><a href="#4-相关题目" class="headerlink" title="4.相关题目"></a>4.相关题目</h2><p><a href="https://www.luogu.org/problemnew/show/P1439" target="_blank" rel="noopener">洛谷P1439</a><br><a href="https://www.luogu.org/problemnew/show/P4303" target="_blank" rel="noopener">AHOI2006基因匹配</a></p><h2 id="5-最后的话"><a href="#5-最后的话" class="headerlink" title="5.最后的话"></a>5.最后的话</h2><p>get到一个新技巧辣~~~以后有新题目或者思想也会及时更新的。</p>]]></content>
<categories>
<category> 动态规划 </category>
</categories>
<tags>
<tag> 动态规划 </tag>
<tag> 序列DP </tag>
</tags>
</entry>
<entry>
<title>Polya总结</title>
<link href="/2019/03/18/Polya%E6%80%BB%E7%BB%93/"/>
<url>/2019/03/18/Polya%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h1 id="Polya总结"><a href="#Polya总结" class="headerlink" title="Polya总结"></a>Polya总结</h1><p>标签: 总结</p><hr><h2 id="1-序"><a href="#1-序" class="headerlink" title="1.序"></a>1.序</h2><p>Polya定理主要是解决一类翻转染色问题,即本质不同的种类数。(看到题目问题问本质不同的什么什么…就可以联想到Polya定理了)</p><h2 id="2-重要定理"><a href="#2-重要定理" class="headerlink" title="2.重要定理"></a>2.重要定理</h2><p>这个算法有两个最重要的定理,只要知道这个定理就可以直接套公式辣~~</p><h3 id="(1)Burnside-引理"><a href="#(1)Burnside-引理" class="headerlink" title="(1)Burnside 引理"></a>(1)Burnside 引理</h3><p>$$\frac{1}{\left | G \right |}\sum_{i=1}^{n}D(a_{i})$$<br>其中G表示置换种类(需要记住的是不变置换也算一种置换)<br>$D(a_{i})$表示在i置换下不动点的个数(这里的“点”可以理解一种方案,比如涂色方案)</p><h3 id="(2)Polya-定理"><a href="#(2)Polya-定理" class="headerlink" title="(2)Polya 定理"></a>(2)Polya 定理</h3><p>$$\frac{1}{\left | G \right |}\sum_{i=1}^{n}m^{c(g_{i})}$$<br>其中m表示染色种类,$c(g_{i})$表示在第i种置换下的循环节个数<br>我们可以从Burnside引理来理解,Burnside引理是求每个置换下的不动点,而每种置换可以当前目标分割成一个一个的循环节,那么只要对每个循环节内部染上相同颜色,则就相当于构造出不动点了撒</p><h2 id="3-方法总结"><a href="#3-方法总结" class="headerlink" title="3.方法总结"></a>3.方法总结</h2><p>几乎可以一句话总结:找循环节!只要找到就可以套公式辣。当然这里是对于颜色无限使用的情况下,如果颜色数量有限制的话我们就只能用Burnside引理了(比如找出循环节然后对每个循环节分配颜色,就相当于背包DP之类的)<br>当然还有一类题是就同构图,即二元组的polya定理(这个是我自己口胡的,感觉很形象~~)详见<a href="https://isecloud.github.io/2019/02/22/SHOI2006-%E6%9C%89%E8%89%B2%E5%9B%BE/">这里</a></p><h2 id="4-最后的话"><a href="#4-最后的话" class="headerlink" title="4.最后的话"></a>4.最后的话</h2><p>对Polya定理总结大概就这样吧,以后遇到新题型也会及时更新的~~</p>]]></content>
<categories>
<category> 总结 </category>
</categories>
<tags>
<tag> 总结 </tag>
</tags>
</entry>
<entry>
<title>莫比乌斯反演总结</title>
<link href="/2019/03/02/%E8%8E%AB%E6%AF%94%E4%B9%8C%E6%96%AF%E5%8F%8D%E6%BC%94%E6%80%BB%E7%BB%93/"/>
<url>/2019/03/02/%E8%8E%AB%E6%AF%94%E4%B9%8C%E6%96%AF%E5%8F%8D%E6%BC%94%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h1 id="莫比乌斯反演总结"><a href="#莫比乌斯反演总结" class="headerlink" title="莫比乌斯反演总结"></a>莫比乌斯反演总结</h1><p>标签: 总结</p><hr><h2 id="1-序"><a href="#1-序" class="headerlink" title="1.序"></a>1.序</h2><p>做了一段时间的莫比乌斯反演题目,决定还是总结一下莫比乌斯反演做题方法(套路)吧。便于以后的复习与理解</p><h2 id="2-莫比乌斯函数"><a href="#2-莫比乌斯函数" class="headerlink" title="2.莫比乌斯函数"></a>2.莫比乌斯函数</h2><p>莫比乌斯函数本质是一个容斥函数,它的定义如下:<br>当$d=1$时$u(d)=1$<br>当$d=\prod_{i=1}^{n}pi$时$u(d)=(-1)^n$(pi为质数)<br>当d的任何一个质因子次数>1,$u(d)=0$<br>通俗意思就是当d质因数分解以后,所有的质因子次数都为1的话,那么$u(d)=(-1)^{n}$(n为质因数个数,d=1可以理解为质因数为0)</p><h3 id="相关性质"><a href="#相关性质" class="headerlink" title="相关性质"></a>相关性质</h3><p>$$1.\sum_{d|n}u(d)=[n==1]$$<br>$$2.\sum_{d|n}\frac{u(d)}{d}=\frac{\varphi (n)}{n}$$<br>1公式表示的意思就是只有当n=1的时候左边式子才会为1,否则为0,可以用二项式定理和莫比乌斯函数定义证明<br>2公式需要用狄利克雷函数证明</p><h2 id="3-莫比乌斯反演"><a href="#3-莫比乌斯反演" class="headerlink" title="3.莫比乌斯反演"></a>3.莫比乌斯反演</h2><p>定理:在非负整数域上存在两个函数$F(n)$和$f(n)$,并且满足以下条件:<br>$$F(n)=\sum_{d|n}f(d)$$<br>则<br>$$f(n)=\sum_{d|n}u(d)F(\frac{n}{d})$$<br>以下给出一个简单的证明:<br>$$\sum_{d|n}u(d)F(\frac{n}{d})=\sum_{d|n}u(d)\sum_{i|\frac{n}{d}}f(i)=\sum_{i|n}f(i)\sum_{d|\frac{n}{i}}u(d)=f(n)$$<br>第一个等式利用第一直接变换<br>第二个等式是枚举项的转换,因为两个等式其实就等价于这个:<br>$$\sum_{(i*d)|n}f(i)u(d)$$<br>可以自己举一个栗子更好理解,比如n=12的时候<br>第三个等式就是利用莫比乌斯函数的第一条性质<br>当然,在做题的时候我们更倾向于用下列式子:<br>$$F(n)=\sum_{n|d}f(d)$$<br>$$f(n)=\sum_{n|d}u(\frac{d}{n})F(d)$$<br>这个证明的话需要用狄利克雷卷积,直观理解就是一个为枚举约数,一个枚举倍数</p><h2 id="4-等式变换技巧"><a href="#4-等式变换技巧" class="headerlink" title="4.等式变换技巧"></a>4.等式变换技巧</h2><p>想要做莫比乌斯反演的题目,一般都是需要对原式子进行和式的变换,然后再开始反演;或者是先设$f(x)$和$F(x)$函数对原式反演后在进行和式的变换</p><h3 id="1-求和式子中的位置变换"><a href="#1-求和式子中的位置变换" class="headerlink" title="1.求和式子中的位置变换"></a>1.求和式子中的位置变换</h3><p>对于求和式多项式中一些与枚举无关的变量可以提前:<br>$$\sum_{i=1}^{n}\sum_{j=1}^{m}f(i)g(j)=\sum_{i=1}^{n}f(i)\sum_{j=1}^{m}g(j)$$</p><h3 id="2-更改枚举项"><a href="#2-更改枚举项" class="headerlink" title="2.更改枚举项"></a>2.更改枚举项</h3><p>有时候在化简的时更改枚举项会使得和式变得更简单:<br>比如我们求以下式子:<br>$$\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|gcd(i,j)}d$$<br>我们可以更改枚举项在外层枚举$gcd(i,j)$<br>$$Ans=\sum_{d=1}^{min(n,m)}d\sum_{i=1}^{n}\sum_{j=1}^{m}[d|gcd(i,j)]$$<br>对于后面那一坨式子,我们又可以考虑枚举d的倍数:<br>$$\sum_{i=1}^{n}\sum_{j=1}^{m}[d|gcd(i,j)]=\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}[1|gcd(i,j)]$$<br>对于$1|gcd(i,j)$对于每个gcd肯定都能满足,所以最终我们化简为:<br>$$\sum_{i=1}^{min(n,m)}d\left \lfloor \frac{n}{d} \right \rfloor\left \lfloor \frac{m}{d} \right \rfloor$$<br>对于枚举项的更改,我们一般是考虑<strong>枚举gcd</strong>,<strong>枚举一个数的倍数</strong>,或者<strong>替换一些繁琐的未知数</strong>,例如:</p><p>$$Ans=\sum_{d=1}^{n}\sum_{p=1}^{m}d*u(p)\left \lfloor \frac{n}{dp} \right \rfloor\left \lfloor \frac{m}{dp} \right \rfloor$$</p><p>诸如有两个或多个变量在一起的时候我们可以考虑替换这些变量,对于上述这个式子我们设$T=dp$,则</p><p>$$Ans=\sum_{d=1}^{n}\sum_{p=1}^{m}d*u(p)\left \lfloor \frac{n}{T} \right \rfloor\left \lfloor \frac{m}{T} \right \rfloor$$</p><p>可以发现此时我们如果把T看成一个独立变量,那么它与$d,p$都无关了,于是我们考虑枚举T:<br>$$\sum_{T=1}^{upper\cdot bound}\frac{n}{T}\frac{m}{T}\sum_{d|T}d\ast u(\frac{T}{d})$$<br>机智的童鞋可以发现后面的和式利用莫比乌斯函数性质能再次化简呢:<br>$$\sum_{d|T}d\ast u(\frac{T}{d})=\sum_{d|T}\frac{T}{d}\ast u(d)=\frac{1}{T}\sum_{d|T}\frac{u(d)}{d}=\varphi (T)$$<br>不过在更改枚举项的时候,一定要注意对其他变量的贡献产生了影响,比如:<br>$$\sum_{i=1}^{n}\sum_{j=1}^{m}ij[gcd(i,j)==d]$$<br>考虑更改枚举d的倍数<br>$$\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}(i\ast d)(j\ast d)[gcd(i,j)==1]$$<br>此时的$i,j$需要变成$i\ast d,j\ast d$ 因为我们的i,j变成了枚举d的倍数</p><h3 id="3-对-gcd-i-j-1-的替换"><a href="#3-对-gcd-i-j-1-的替换" class="headerlink" title="3.对$gcd(i,j)==1$的替换"></a>3.对$gcd(i,j)==1$的替换</h3><p>$$gcd(i,j)==1 <=> \sum_{d|gcd(i,j)}u(d)$$<br>证明利用莫比乌斯函数性质即可。</p><h2 id="5-整除分块"><a href="#5-整除分块" class="headerlink" title="5.整除分块"></a>5.整除分块</h2><p>对于一段区间$[l,r]$,对于一个数n,总会存在一段区间使得$\left \lfloor \frac{n}{l} \right \rfloor=\left \lfloor \frac{n}{r} \right \rfloor=k$ 那么对于诸如求下列式子:$\sum_{i=1}^{n}f(\left \lfloor \frac{n}{i} \right \rfloor)$我们就可以把它分割成一小段一小段的区间求解于是便优化了时间复杂度,其中$r=\frac{n}{\left \lfloor \frac{n}{l} \right \rfloor}$证明的话…博客靠的是感性的理解~~</p><h2 id="6-最后的话"><a href="#6-最后的话" class="headerlink" title="6.最后的话"></a>6.最后的话</h2><p>对莫比乌斯反演的总结大概就到这里了,其中不免存在知识点的缺乏与漏洞,以后有新的想法也会及时更新,在此,谢谢以下大佬:<a href="https://blog.csdn.net/shadypi/article/details/80295368" target="_blank" rel="noopener">ShadyPi</a> <a href="https://www.cnblogs.com/peng-ym/p/9446555.html#4182592" target="_blank" rel="noopener">peng-ym</a> 的博客,以上总结也大多参照他们的想法。orzORZ~~</p>]]></content>
<categories>
<category> 总结 </category>
</categories>
<tags>
<tag> 总结 </tag>
</tags>
</entry>
<entry>
<title>[SDOI2017]数字表格</title>
<link href="/2019/02/26/SDOI2017-%E6%95%B0%E5%AD%97%E8%A1%A8%E6%A0%BC/"/>
<url>/2019/02/26/SDOI2017-%E6%95%B0%E5%AD%97%E8%A1%A8%E6%A0%BC/</url>
<content type="html"><![CDATA[<h1 id="SDOI2017-数字表格"><a href="#SDOI2017-数字表格" class="headerlink" title="[SDOI2017]数字表格"></a>[SDOI2017]数字表格</h1><p>标签: 数学 莫比乌斯</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>Doris刚刚学习了fibonacci数列。用f[i]f[i]f[i]表示数列的第iii项,那么<br>$f[0]=0,f[1]=1,$</p><p>$f[n]=f[n−1]+f[n−2],n≥2$<br>Doris用老师的超级计算机生成了一个$n×m$的表格<br>第i行第j列的格子中的数是$f[gcd(i,j)]$其中$gcd(i,j)$表示i,j的最大公约数。<br>Doris的表格中共有$n×m$个数,她想知道这些数的乘积是多少。<br>答案对$10^9+7$取模。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><h3 id="输入格式:"><a href="#输入格式:" class="headerlink" title="输入格式:"></a>输入格式:</h3><p>有多组测试数据。<br>第一个一个数T,表示数据组数。<br>接下来T行,每行两个数n,m</p><h3 id="输出格式:"><a href="#输出格式:" class="headerlink" title="输出格式:"></a>输出格式:</h3><p>输出T行,第i行的数是第i组数据的结果</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1:<br>3<br>2 3<br>4 5<br>6 7</p><p>输出样例#1:<br>1<br>6<br>960</p><h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>对10%的数据,$1≤n,m≤100$<br>对30%的数据,$1≤n,m≤1000$<br>另外存在30%的数据,$T≤3$<br>对100%的数据,$T≤1000,1≤n,m≤10^6$<br>时间限制:5s<br>内存限制:128MB</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>做了一些题目后感觉莫比乌斯题目套路都比较明显了~~<br>一般都是关于$gcd$这个神奇的东西<br>一句话描述题目:<br>$$Ans=\prod_{i=1}^{n}\prod_{j=1}^{m}Fi(gcd(i,j))$$<br>其中$Fi$表示斐波那契数列<br>那么按照套路,我们设:<br>$$f(x)=\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==x]$$<br>$$F(x)=\sum_{x|d}f(d)=\left \lfloor \frac{n}{x} \right \rfloor\left \lfloor \frac{m}{x} \right \rfloor$$<br>那么我们枚举$gcd$<br>$$Ans=\prod_{x=1}^{min(n,m)}Fi(x)^{f(x)}$$<br>指数部分很简单,我们直接反演即可<br>$$Ans=\prod_{x=1}^{min(n,m)}Fi(x)^{\sum_{x|d}u(\frac{d}{x})\frac{n}{d}\frac{m}{d}}$$<br>更改枚举项<br>$$Ans=\prod_{x=1}^{min(n,m)}Fi(x)^{\sum_{d=1}^{min(n,m)}u(d)\frac{n}{dx}\frac{m}{dx}}$$<br>化简到这里还是不能直接做,我们知道$Fi$和$u$都可以预处理,因此我们要把这两个”撮合”到一起<br>外部更改枚举项,我们枚举$dx$(即x的倍数)<br>$$Ans=\prod_{T=1}^{min(n,m)}(\prod_{k|T}Fi(k)^{u(\frac{T}{k})})^{\frac{n}{T}\frac{m}{T}}$$<br>我们设$g(T)=\prod_{k|T}Fi(k)^{u(\frac{T}{k})}$<br>这个$g(T)$是可以预处理的<br>那么<br>$$Ans=\prod_{T=1}^{min(n,m)}g(T)^{\frac{n}{T}\frac{m}{T}}$$<br>最后用整除分块即可解决本题了</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdio></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdlib></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstring></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><algorithm></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 1000010</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token macro property">#<span class="token directive keyword">define</span> debug system("pause")</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">const</span> ll p <span class="token operator">=</span> <span class="token number">1e9</span> <span class="token operator">+</span> <span class="token number">7</span><span class="token punctuation">;</span><span class="token keyword">int</span> t<span class="token punctuation">,</span> n<span class="token punctuation">,</span> m<span class="token punctuation">,</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> pri<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> u<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> g<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> sum<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">bool</span> vis<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll <span class="token function">pow_mul</span><span class="token punctuation">(</span>ll a<span class="token punctuation">,</span> ll b<span class="token punctuation">)</span><span class="token punctuation">{</span> ll ans <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">&</span> <span class="token number">1</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> a <span class="token operator">=</span> a <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> b <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span>ll <span class="token function">calc</span><span class="token punctuation">(</span>ll a<span class="token punctuation">,</span> ll b<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">return</span> a<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> p <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> u<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">int</span> t <span class="token operator">=</span> N <span class="token operator">-</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> u<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> pri<span class="token punctuation">[</span><span class="token operator">++</span> cnt<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> cnt <span class="token operator">&&</span> i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator"><=</span> t<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> vis<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>i <span class="token operator">%</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> u<span class="token punctuation">[</span>i <span class="token operator">*</span> pri<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">-</span>u<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> g<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> g<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>g<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> g<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sum<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">*</span> j <span class="token operator"><=</span> t<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>i <span class="token operator">*</span> j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>f<span class="token punctuation">[</span>i <span class="token operator">*</span> j<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token function">calc</span><span class="token punctuation">(</span>g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> u<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> t<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> sum<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sum<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> f<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>t<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>t <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>n <span class="token operator">></span> m<span class="token punctuation">)</span> <span class="token function">swap</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> m<span class="token punctuation">)</span><span class="token punctuation">;</span> ll ans <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> l <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> r<span class="token punctuation">;</span> l <span class="token operator"><=</span> n<span class="token punctuation">;</span> l <span class="token operator">=</span> r <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> r <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>m <span class="token operator">/</span> <span class="token punctuation">(</span>m <span class="token operator">/</span> l<span class="token punctuation">)</span><span class="token punctuation">,</span> n <span class="token operator">/</span> <span class="token punctuation">(</span>n <span class="token operator">/</span> l<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ll tmp <span class="token operator">=</span> <span class="token punctuation">(</span>sum<span class="token punctuation">[</span>r<span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span>sum<span class="token punctuation">[</span>l <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> p <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span>tmp<span class="token punctuation">,</span> <span class="token number">1ll</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">/</span> l<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>m <span class="token operator">/</span> l<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token punctuation">(</span>p <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld\n"</span><span class="token punctuation">,</span> ans <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>巧妙的更改枚举项,把能预处理的合并在一起即可优化时间复杂度</p>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 数学 </tag>
<tag> 莫比乌斯反演 </tag>
</tags>
</entry>
<entry>
<title>HNOI2009 图的同构记数</title>
<link href="/2019/02/23/HNOI2009-%E5%9B%BE%E7%9A%84%E5%90%8C%E6%9E%84%E8%AE%B0%E6%95%B0/"/>
<url>/2019/02/23/HNOI2009-%E5%9B%BE%E7%9A%84%E5%90%8C%E6%9E%84%E8%AE%B0%E6%95%B0/</url>
<content type="html"><![CDATA[<h1 id="HNOI2009-图的同构记数"><a href="#HNOI2009-图的同构记数" class="headerlink" title="HNOI2009 图的同构记数"></a>HNOI2009 图的同构记数</h1><p>标签: 数学 置换 polya定理</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>小雪在了解到以上情况后,自认为直接挑战终极难题还有不少困难,于是决定先从简单的问题做起,具体来说,他对图同构问题产生了浓厚的兴趣。A图与B图被认为是同构的是指:A图的顶点经过一定的重新标号以后,A图的顶点集和边集要完全与B图一一对应。<br>小雪现在专注于如何判断两个图是否同构,同时他还想知道两两互不同构的含N个点的图有多少种。众所周知含N个点的简单图最多有$\frac{n(n-1)}{2}$条边,这样含N个点的图有$2^{\frac{n(n-1)}{2}}$种可能的情况。显然这些图中有很多图是同构的,小雪想知道的便是:若同构的图算成一种,则有多少种不同的图。他把这个任务丢给了你,在他想出来之前快点解决吧!</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><p>输入格式:<br>从文件input.txt中读入数据,文件中只有一个非负整数N,表示图的顶点数,且0≤N≤600。</p><p>输出格式:<br>输出文件output.txt中仅包含一个整数,表示含N个点的图在同构意义下不同构的图的数目。因为答案可能很大,所以输出的最终答案是mod997的结果(997是一个素数)。</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例#1:<br>3<br>输出样例#1:<br>4</p><p>输入样例#2:<br>5<br>输出样例#2:<br>34</p><p>输入样例#3:<br>9<br>输出样例#3:<br>493</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>这道题和<a href="https://isecloud.github.io/2019/02/22/SHOI2006-%E6%9C%89%E8%89%B2%E5%9B%BE/">SHOI2006 有色图</a>是一样滴,我们可以把两点连不连边想象成染成黑色与白色的关系,剩下的都一样啦~~</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdio></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstring></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdlib></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><algorithm></span></span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token macro property">#<span class="token directive keyword">define</span> N 70</span><span class="token macro property">#<span class="token directive keyword">define</span> p 997</span><span class="token macro property">#<span class="token directive keyword">define</span> debug system("pause")</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>ll n<span class="token punctuation">,</span> m<span class="token punctuation">;</span>ll num<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> d<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll fac<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>ll <span class="token function">gcd</span><span class="token punctuation">(</span>ll a<span class="token punctuation">,</span> ll b<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">!</span>b <span class="token operator">?</span> a <span class="token operator">:</span> <span class="token function">gcd</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> a <span class="token operator">%</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>ll <span class="token function">pow_mul</span><span class="token punctuation">(</span>ll a<span class="token punctuation">,</span> ll b<span class="token punctuation">)</span><span class="token punctuation">{</span> ll ans <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">&</span> <span class="token number">1</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> a <span class="token operator">=</span> a <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> b <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">calc</span><span class="token punctuation">(</span><span class="token keyword">int</span> cnt<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>num<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>num<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ll mul <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> ll c <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> cnt<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> num<span class="token punctuation">[</span>d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">++</span><span class="token punctuation">;</span> mul <span class="token operator">=</span> mul <span class="token operator">*</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> c <span class="token operator">+</span><span class="token operator">=</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><</span> i<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> c <span class="token operator">+</span><span class="token operator">=</span> <span class="token function">gcd</span><span class="token punctuation">(</span>d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> d<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> mul <span class="token operator">=</span> mul <span class="token operator">*</span> fac<span class="token punctuation">[</span>num<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> ans <span class="token operator">=</span> ans <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token function">pow_mul</span><span class="token punctuation">(</span>mul<span class="token punctuation">,</span> p <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> c<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token keyword">int</span> tot<span class="token punctuation">,</span> <span class="token keyword">int</span> cnt<span class="token punctuation">,</span> <span class="token keyword">int</span> pre<span class="token punctuation">)</span><span class="token punctuation">{</span> d<span class="token punctuation">[</span>cnt<span class="token punctuation">]</span> <span class="token operator">=</span> tot<span class="token punctuation">;</span> <span class="token function">calc</span><span class="token punctuation">(</span>cnt<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> pre<span class="token punctuation">;</span> i <span class="token operator"><=</span> tot <span class="token operator">-</span> i<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> d<span class="token punctuation">[</span>cnt<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token function">dfs</span><span class="token punctuation">(</span>tot <span class="token operator">-</span> i<span class="token punctuation">,</span> cnt <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> m <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> fac<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> fac<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> fac<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> fac<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> i <span class="token operator">%</span> <span class="token punctuation">(</span>ll<span class="token punctuation">)</span>p<span class="token punctuation">;</span> <span class="token function">dfs</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>模型转换很重要啊</p>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 数学 </tag>
<tag> 置换 </tag>
<tag> polya定理 </tag>
</tags>
</entry>
<entry>
<title>[SHOI2006]有色图</title>
<link href="/2019/02/22/SHOI2006-%E6%9C%89%E8%89%B2%E5%9B%BE/"/>
<url>/2019/02/22/SHOI2006-%E6%9C%89%E8%89%B2%E5%9B%BE/</url>
<content type="html"><![CDATA[<h1 id="SHOI2006-有色图"><a href="#SHOI2006-有色图" class="headerlink" title="SHOI2006 有色图"></a>SHOI2006 有色图</h1><p>标签: 数学 置换 polya定理</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图。如果两张有色图有相同数量的顶点,而且经过某种顶点编号的重排,能够使得两张图对应的边的颜色是一样的,我们就称这两张有色图是同构的。以下两张图就是同构的,因为假如你把第一张图的顶点(1,2,3,4)置换成第二张图的(4,3,2,1),就会发现它们是一样的。<br><img src="https://cdn.luogu.org/upload/pic/13240.png" alt="同构图"><br>你的任务是,对于计算所有顶点数为n,颜色种类不超过m的图,最多有几张是两两不同构的图。由于最后的答案会很大,你只要输出结论模p的余数就可以了(p是一个质数)</p><h3 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h3><p>输入格式:<br>输入文件只有一行,由三个正整数n,m,p组成,他们满足1≤n≤53,1≤m≤1000,n<p≤10^9</p><p>输出格式:<br>即总数模p后的余数</p><h3 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h3><p>输入样例#1:<br>1 1 2<br>输出样例#1:<br>1</p><p>输入样例#2:<br>3 2 97<br>输出样例#2:<br>4</p><p>输入样例#3:<br>3 4 97<br>输出样例#3:<br>20</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>06年就出来了这种题吗…ORZ<br>那么这道题难点在于是点置换,边染色,因此我们必须通过点置换找出边置换的循环节。<br>首先,我们可以把边分为两类:<br>1.边的两个端点处于同一循环节中<br>2.边的两个端点处于不同循环节中<br>那么下面就对这两种情况进行讨论<br>(1)在同一循环节内:<br>我们假设循环节的长度为$l$,可以想象成这$l$个点分别分布在等$l$边形的定点上<br>1.若$l$为奇数<br>则随着点的置换,每条边相当于顺时针移动到下一条边,故边的每个循环节长度都为$l$,而总边数为$\frac{l(l-1)}{2}$,所以循环节个数为$\frac{l-1}{2}$<br>2.若$l$为偶数<br>同样用上述方式思考,不过会存在跨越180°的情况,那么这些边存在多少呢,画一画图就可以发现存在$\frac{l}{2}$条,所以此时循环节个数为$$\frac{\frac{l(l-1)}{2} - \frac{l}{2}}{l}+1=\frac{l}{2}$$<br>(1)在不同循环节内<br>假设两个循环节长度分别为$l1$和$l2$<br>假设一条边最少经过$k$次变换回到本身(这里的变换也可以理解为两个端点的在某种置换规则下的同时变换)<br>那么k % l1 = 0 且 k % l2 = 0<br>所以k = lcm(l1, l2),而一共有多少条边呢,肯定是l1 * l2条嘛(乘法原理撒)<br>所以循环节个数为</p><p>$\frac{l1*l2}{lcm(l1,l2)}=gcd(l1,l2)$</p><p>那么综上所述,我们已知某次点置换的循环节长度和个数之后,我们就可以得到边置换的循环节长度:</p><p>$$g=\sum_{i=1}^{n}\left \lfloor \frac{l_{i}}{2} \right \rfloor+\sum_{i=1}^{n}\sum_{j=i+1}^{n}gcd(l_{i},l_{j})$$</p><p>OK…总算是找到点置换与边置换的关系了,只要我们找到关于点置换的循环节,对应的我们就可以求出边置换的循环节了。<br>对于此题n<=53我们直接暴力的话复杂度是$O(53!)$是妥妥爆炸的,但是我们发现,我们只需要知道置换的循环节的长度和数量即可,对于里面的元素是什么我们不关心的,因此我们可以考虑对n进行整数拆分,即枚举点置换的循环节长度:<br>$l1<=l2<=l3<=….<=ln$<br>相当于我们把$n$个点分别放进大小为$l1,l2,…,ln$的循环节中,相当于一个<a href="https://baike.baidu.com/item/%E5%A4%9A%E9%87%8D%E5%85%A8%E6%8E%92%E5%88%97/20469840" target="_blank" rel="noopener">多重全排列</a>:$$\frac{n!}{\prod_{i=1}^{n}li!}$$<br>然后对于每一个循环节内部元素顺序分配,相当于一个圆排列:$(li-1)!$<br>算到这里,我们发现循环节本身是没有顺序之分的,即:<br>$(1,2,3)(4,5,6)$等价于$(4,5,6)(1,2,3)$但是上述计算会导致循环节长度相同的$li$会因为顺序原因导致算重(这里不用考虑循环节长度不同,因为我们是按照从小到大枚举的嘛)因此设长度相同的循环节有$c$个,则答案最终要除以$c!$<br>综上所述,方案数为:</p><p>$$Sum = \frac{\frac{n!}{\prod_{i=1}^{n}li!}*(li-1)!}{\prod_{i=1}^{n}ci!}$$</p><p>$$Sum = \frac{n!}{\prod_{i=1}^{n}li*ci!}$$</p><p>因此:<br>$$Ans = \frac{Sum*m^{g}}{\left | G \right |}$$<br>(细心的童鞋可以发现$Sum$中$n!$可以和$G$抵消哟~)</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdio></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstring></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdlib></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><algorithm></span></span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token macro property">#<span class="token directive keyword">define</span> N 70</span><span class="token macro property">#<span class="token directive keyword">define</span> debug system("pause")</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>ll n<span class="token punctuation">,</span> m<span class="token punctuation">,</span> p<span class="token punctuation">;</span>ll num<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> d<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll fac<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>ll <span class="token function">gcd</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">!</span>b <span class="token operator">?</span> a <span class="token operator">:</span> <span class="token function">gcd</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> a <span class="token operator">%</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>ll <span class="token function">pow_mul</span><span class="token punctuation">(</span>ll a<span class="token punctuation">,</span> ll b<span class="token punctuation">)</span><span class="token punctuation">{</span> ll ans <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">&</span> <span class="token number">1</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> a <span class="token operator">=</span> a <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> b <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">calc</span><span class="token punctuation">(</span><span class="token keyword">int</span> cnt<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>num<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>num<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ll mul <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> ll c <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> cnt<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> num<span class="token punctuation">[</span>d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">++</span><span class="token punctuation">;</span> mul <span class="token operator">=</span> mul <span class="token operator">*</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> c <span class="token operator">+</span><span class="token operator">=</span> d<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><</span> i<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> c <span class="token operator">+</span><span class="token operator">=</span> <span class="token function">gcd</span><span class="token punctuation">(</span>d<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> d<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> mul <span class="token operator">=</span> mul <span class="token operator">*</span> fac<span class="token punctuation">[</span>num<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//for(int i = 1; i <= cnt; i ++) printf("%d ", d[i]);</span> <span class="token comment" spellcheck="true">//printf("%lld %lld\n", c, mul); debug; </span> ans <span class="token operator">=</span> ans <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token function">pow_mul</span><span class="token punctuation">(</span>mul<span class="token punctuation">,</span> p <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> c<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//printf("%lld %lld %lld", ans, t1, t2); debug;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">dfs</span><span class="token punctuation">(</span><span class="token keyword">int</span> tot<span class="token punctuation">,</span> <span class="token keyword">int</span> cnt<span class="token punctuation">,</span> <span class="token keyword">int</span> pre<span class="token punctuation">)</span><span class="token punctuation">{</span> d<span class="token punctuation">[</span>cnt<span class="token punctuation">]</span> <span class="token operator">=</span> tot<span class="token punctuation">;</span> <span class="token function">calc</span><span class="token punctuation">(</span>cnt<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> pre<span class="token punctuation">;</span> i <span class="token operator"><=</span> tot <span class="token operator">-</span> i<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> d<span class="token punctuation">[</span>cnt<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token function">dfs</span><span class="token punctuation">(</span>tot <span class="token operator">-</span> i<span class="token punctuation">,</span> cnt <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld%lld%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> fac<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> fac<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> fac<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> fac<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> i <span class="token operator">%</span> <span class="token punctuation">(</span>ll<span class="token punctuation">)</span>p<span class="token punctuation">;</span> <span class="token function">dfs</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/*53 1000 131071*/</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>听大佬们说这是一种套路题,掌握方法就可以了。其实想一想这类题相当于是已知一种元素的置换方式,并且这种元素的二元组决定另一种元素,求另一种元素的本质不同方案数(两个点确定一条边嘛,所以由点的二元组决定一条边)那么是否由此可以推广到多元组呢…?(不过会讨论情况讨论到疯掉吧…)</p>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 数学 </tag>
<tag> 置换 </tag>
<tag> polya定理 </tag>
</tags>
</entry>
<entry>
<title>[HNOI2008]Cards</title>
<link href="/2019/02/22/HNOI2008-Cards/"/>
<url>/2019/02/22/HNOI2008-Cards/</url>
<content type="html"><![CDATA[<h1 id="HNOI2008-Cards"><a href="#HNOI2008-Cards" class="headerlink" title="HNOI2008 Cards"></a>HNOI2008 Cards</h1><p>标签:数学 置换</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.<br>进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绿色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以使用多种洗牌法,而每种方法可以使用多次)洗成另一种.<br>Sun发现这个问题有点难度,决定交给你,答案可能很大,只要求出答案除以P的余数(P为质数).</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><p>输入格式:<br>第一行输入 5 个整数:Sr,Sb,Sg,m,p(m<=60,m+1< p <100)。n=Sr+Sb+Sg。接下来 m 行,每行描述一种洗牌法,每行有 n 个用空格隔开的整数 X1X2…Xn,恰为 1 到 n 的一个排列,表示使用这种洗牌法,第 i位变为原来的 Xi位的牌。输入数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。<br>输出格式:<br>不同染法除以P的余数</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>输入样例:<br>1 1 1 2 7<br>2 3 1<br>3 1 2<br>输出样例:<br>2</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>对于这道题就不能用polya定理了(所以我就不知道怎么做了…)因为存在颜色数量的限制,不过对于题目这句话:<strong>数据保证任意多次洗牌都可用这 m种洗牌法中的一种代替,且对每种洗牌法,都存在一种洗牌法使得能回到原状态。</strong><br>因此它是满足置换群的性质的,因此我们可以用Burnside引理嘛,那么如何找不动点呢?其实就是每个循环节染相同颜色那么它肯定是一个不动点撒(由Burnside引理推polya定理也可以这么来推)因此我们可以dfs找出每种洗牌法的循环节及其长度,然后对于每种循环节染相同颜色。于是问题转换成把一些物品放到一些背包,直接DP即可了。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdio></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstring></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdlib></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><algorithm></span></span><span class="token macro property">#<span class="token directive keyword">define</span> N 100</span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> sr<span class="token punctuation">,</span> sb<span class="token punctuation">,</span> sg<span class="token punctuation">,</span> p<span class="token punctuation">,</span> n<span class="token punctuation">,</span> m<span class="token punctuation">,</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">int</span> to<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> g<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll f<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">,</span> ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token keyword">bool</span> vis<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span>ll <span class="token function">calc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">memset</span><span class="token punctuation">(</span>vis<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>vis<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>g<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>g<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">memset</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> cnt <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> f<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>vis<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> x <span class="token operator">=</span> i<span class="token punctuation">;</span> cnt <span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token operator">!</span>vis<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">)</span> vis<span class="token punctuation">[</span>x<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">,</span> g<span class="token punctuation">[</span>cnt<span class="token punctuation">]</span> <span class="token operator">++</span><span class="token punctuation">,</span> x <span class="token operator">=</span> to<span class="token punctuation">[</span>x<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> cnt<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> sr<span class="token punctuation">;</span> j <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> sb<span class="token punctuation">;</span> k <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> l <span class="token operator">=</span> sg<span class="token punctuation">;</span> l <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> l <span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>j <span class="token operator">>=</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>l<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>j <span class="token operator">-</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>l<span class="token punctuation">]</span> <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>k <span class="token operator">>=</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>l<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k <span class="token operator">-</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>l<span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>l<span class="token punctuation">]</span> <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>l <span class="token operator">>=</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> f<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>l<span class="token punctuation">]</span> <span class="token operator">+</span><span class="token operator">=</span> f<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>l <span class="token operator">-</span> g<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> f<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">[</span>l<span class="token punctuation">]</span> <span class="token operator">%</span><span class="token operator">=</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> f<span class="token punctuation">[</span>sr<span class="token punctuation">]</span><span class="token punctuation">[</span>sb<span class="token punctuation">]</span><span class="token punctuation">[</span>sg<span class="token punctuation">]</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span>ll <span class="token function">pow_mul</span><span class="token punctuation">(</span>ll a<span class="token punctuation">,</span> ll b<span class="token punctuation">,</span> ll p<span class="token punctuation">)</span><span class="token punctuation">{</span> ll ans <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">&</span> <span class="token number">1</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> a <span class="token operator">=</span> a <span class="token operator">*</span> a <span class="token operator">%</span> p<span class="token punctuation">;</span> b <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d%d%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>sr<span class="token punctuation">,</span> <span class="token operator">&</span>sb<span class="token punctuation">,</span> <span class="token operator">&</span>sg<span class="token punctuation">,</span> <span class="token operator">&</span>m<span class="token punctuation">,</span> <span class="token operator">&</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> n <span class="token operator">=</span> sr <span class="token operator">+</span> sb <span class="token operator">+</span> sg<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> to<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> i<span class="token punctuation">;</span> ans <span class="token operator">=</span> <span class="token punctuation">(</span>ans <span class="token operator">+</span> <span class="token function">calc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> m<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> j <span class="token operator"><=</span> n<span class="token punctuation">;</span> j <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>to<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">=</span> <span class="token punctuation">(</span>ans <span class="token operator">+</span> <span class="token function">calc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token punctuation">}</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span>m <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> p <span class="token operator">-</span> <span class="token number">2</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span> <span class="token operator">%</span> p<span class="token punctuation">;</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> ans<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>区分polya定理和Burnsi适用范围,不过二者基本上都要找到循环节,所以如何优秀的找出循环节是解决这一类问题的关键。</p>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 数学 </tag>
<tag> 置换 </tag>
</tags>
</entry>
<entry>
<title>poj1286--Necklace of Beads</title>
<link href="/2019/02/22/poj1286-Necklace-of-Beads/"/>
<url>/2019/02/22/poj1286-Necklace-of-Beads/</url>
<content type="html"><![CDATA[<h1 id="poj1286–Necklace-of-Beads"><a href="#poj1286–Necklace-of-Beads" class="headerlink" title="poj1286–Necklace of Beads"></a>poj1286–Necklace of Beads</h1><p>标签:数学 置换 polya定理</p><hr><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给出三种颜色红绿蓝,对一串n(n<24)个小球的环染色,环可以旋转和翻转,问最终可能有多少不同的染色方案。</p><h2 id="输入输出格式"><a href="#输入输出格式" class="headerlink" title="输入输出格式"></a>输入输出格式</h2><p>Input<br>The input has several lines, and each line contains the input data n.<br>-1 denotes the end of the input file.</p><p>Output<br>The output should contain the output data: Number of different forms, in each line correspondent to the input data.</p><h2 id="输入输出样例"><a href="#输入输出样例" class="headerlink" title="输入输出样例"></a>输入输出样例</h2><p>Sample Input<br>4<br>5<br>-1<br>Sample Output<br>21<br>39</p><h3 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h3><p>首先给出两个定理:<br>Burnside引理:<br>$$\frac{1}{\left | G \right |}\sum_{i=1}^{n}D(a_{i})$$<br>其中G表示置换种类(需要记住的是不变置换也算一种置换)<br>$D(a_{i})$表示在i置换下不动点的个数<br>Polya定理:<br>$$\frac{1}{\left | G \right |}\sum_{i=1}^{n}m^{c(g_{i})}$$<br>其中m表示染色种类,$c(g_{i})$表示在第i种置换下的循环节个数<br>这里有一个讲得比较好的<a href="https://wenku.baidu.com/view/bf92a95f804d2b160b4ec0be.html" target="_blank" rel="noopener">文库</a><del>可惜我没有下载券不能下载…</del><br>那么对于这道题来说要分两种情况:<br>1.旋转<br>对于旋转一共有0~n-1共n种置换,对于旋转i,它的循环节为gcd(n,i),这个可以找找规律发现,也可以通过证明:<br>假设每次增量为p,最少走了k步又回到原点:<br>则kp % n = 0 而 kp % p = 0且k为最少,故kp是n,p的最小公倍数,kp = lcm(n,p)<br>那么每次走了kp / p = lcm(n, p) / p = k步<br>那么一共走了n / (lcm(n,p)/ p) = np / lcm(n,p)= gcd(n,p)次<br>所以循环节是gcd(n,p)。<br>所以$Ans = Ans + \sum_{i=0}^{n-1}3^{gcd(n,i)}$<br>2.翻转<br>这里要分奇偶讨论:<br>(1)偶数<br>这里存在两种对称方式,如图:<br><img src="https://cdn.luogu.org/upload/pic/52453.png" alt="翻转"><br>一种是一条对称轴穿过两个点,此时有n/2种置换,对于每种置换有n/2 + 1个循环节<br>另一种是一条对称轴穿过两点之间,此时有n/2种置换,对于每种置换有n/2个循环节<br>(2)奇数<br>这里就只有一种对称方式了,选每个点作为对称点共有n中置换,对于每个置换有n/2 + 1个循环节<br>最后Ans除以G(2n中置换)即可</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><pre class=" language-cpp"><code class="language-cpp"><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdio></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstring></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><cstdlib></span></span><span class="token macro property">#<span class="token directive keyword">include</span><span class="token string"><algorithm></span></span><span class="token macro property">#<span class="token directive keyword">define</span> ll long long</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">int</span> n<span class="token punctuation">;</span><span class="token keyword">int</span> <span class="token function">gcd</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">!</span>b <span class="token operator">?</span> a <span class="token operator">:</span> <span class="token function">gcd</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> a <span class="token operator">%</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>ll <span class="token function">pow_mul</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span><span class="token punctuation">{</span> ll ans <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>b <span class="token operator">%</span> <span class="token number">2</span><span class="token punctuation">)</span> ans <span class="token operator">=</span> ans <span class="token operator">*</span> a<span class="token punctuation">;</span> a <span class="token operator">=</span> a <span class="token operator">*</span> a<span class="token punctuation">;</span> b <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> ans<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span> <span class="token operator">&&</span> n <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ll ans <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>n <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"0\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">continue</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> n<span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> ans <span class="token operator">+</span><span class="token operator">=</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token function">gcd</span><span class="token punctuation">(</span>n<span class="token punctuation">,</span> i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>n <span class="token operator">%</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> ans <span class="token operator">+</span><span class="token operator">=</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> n <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> n<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> ans <span class="token operator">+</span><span class="token operator">=</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> n <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ans <span class="token operator">+</span><span class="token operator">=</span> <span class="token function">pow_mul</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> n <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld\n"</span><span class="token punctuation">,</span> ans <span class="token operator">/</span> <span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> n<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code></pre><h3 id="心得"><a href="#心得" class="headerlink" title="心得"></a>心得</h3><p>运用polya定理主要是找出循环节,但是值得注意的是,polya定理不能受到颜色数量的限制,否则只能用Burnside引理,而且注意要包括不变置换。</p>]]></content>
<categories>
<category> 数学 </category>
</categories>
<tags>
<tag> 数学 </tag>
<tag> 置换 </tag>