2015 ACM/ICPC world finals 总结

拖了很久,终于有时间写final的总结帖了。 从第一次参加ICPC比赛,好像每次都写了总结,作为最后一次ICPC比赛,也理应写个总结收尾。简单记录下final的比赛过程和感想。 退役贴有空再补上,这次真退役了~ 首先先上几个图吧! [caption id=”attachment_631” align=”alignnone” width=”707”]官方拍摄的全队合影 官方拍摄的全队合影[/caption] [caption id=”attachment_634” align=”alignnone” width=”712”]跟Bill的合影~ 跟Bill的合影~[/caption] [caption id=”attachment_633” align=”alignnone” width=”714”]奖杯全队合影 奖杯全队合影[/caption] [caption id=”attachment_630” align=”alignnone” width=”718”]我们比赛的吉祥物 我们比赛的吉祥物[/caption] 首先看看最终的比赛结果,官方排名链接here, 山寨排名here 最终是7题,实际31名,并列28名。 [caption id=”attachment_640” align=”alignnone” width=”808”]排名变化曲线 排名变化曲线[/caption] 前面总体还算顺利,几乎都是1A(就C题SB了一发,WA了一次)。非常遗憾的是最后一个小时毫无建树,非常可惜没有做出第8题。 全场都在看题敲题,都剩下好多题没看,连E题都没看,最后一小时,我在死磕H,然后就GG了。 team_problem team_submission 个人感觉做出的七个题都是比较简单的了,其实还是可以更快把7个题做完,然后做出其他题的。 题目阅读量比较大。全场几乎都在读题、写代码, 结果还是好多题没有读,TAT。 首先记录下整个final行程: 先来一发来回坐飞机的安排: [caption id=”attachment_646” align=”alignnone” width=”663”]final之旅 final之旅[/caption] 摩洛哥算是比较远的了,途中就花费了好多时间,时间安排也是比较紧,都没啥时间玩耍的。 5月14日: 出发前整理了一份final模板,刻录打印了一发。然后晚上收拾了东西,晚上8点坐安排好的车去了机场。我们总共去了8个人。刚好是凌晨的飞机,在机场等待了好久,然后登记了。期间膜拜到了浙江理工和HDU的众位神牛,我们是一趟飞机去迪拜的。 5月15日:漫长的飞机还是挺无聊的,幸好提前存了几套题目,在机场和飞机上理论AC了好多题目。早上5点多到了迪拜机场,在机场等待了9个多小时。老师在机场的酒店里找了两个房间让我们放东西休息下,然后开始在迪拜的免税店逛! 迪拜机场都是都太高档了,屌丝完全买不起。 期间看到个可爱的小熊,打算带进比赛地方作为吉祥物,希望带来good luck,于是花了7美刀买了个。然后买了一些吃的东西。之后就坐飞机去卡萨布兰卡了。 然后在当地时间晚上8点多到达了卡萨布兰卡的机场,换乘国内航班,在那又等待了三个多小时,转机的地方实在是破旧,类似一个小汽车站一样,还没有网,特别困在凳子上小睡了一会。 5月16日:凌晨的飞机从卡萨布兰卡到马拉喀什,半个多小时飞机就到了。经过众多波折,总算到达了。在机场出关取行李,然后机场有志愿者在迎接。但是比较坑的是在机场又等了好久,要等很多人到了才安排才把我们送到住的酒店。安排的车又特别小的,完全装不下这么多人,特别挤。 最后总算到达了酒店,我们是住Palmeraie Palace,总体感觉还是很不错的。 IMG_0072 办了一会的入住手续,然后队员是三人间,房间看起来是非常不错的。 [caption id=”attachment_650” align=”alignnone” width=”545”]董壕住的房间 董壕住的房间[/caption] 然后睡了几个小时,感觉还是很累的。然后睡醒了起来了,想去找吃的,发现早餐已经没了。之后就在周围逛了一发,熟悉下环境。住的酒店就跟迷宫一样,非常容易走错。 IMG_0076IMG_0077 IMG_0081IMG_0082IMG_0083 IMG_0086IMG_0085 住的酒店里面有个很大的花园,里面有游泳池,环境非常好。中午吃饭是自助餐,在那吃的都是非常好的,感觉非常爽! 下午也是那周围随便走了一下,看到了很多有趣的东西。 然后适牛过来了,去仰慕了一发。 晚餐继续是高级的自助餐,说是IBM的欢迎晚宴。吃完饭就去注册了,注册流程非常多,分成了一个个小步骤。把模板、字典、吉祥物等都交上去了,领回来一些纪念品。还拍了队伍照片。 来一发我们的集体合照。 [caption id=”attachment_660” align=”alignnone” width=”564”]Shanghai University Shanghai University[/caption] 然后回来和吴神、适牛玩了一发,之后去适牛房间打牌,然后适牛体力不支,就回去睡觉了~ IMG_0114 5月17日: 这天早上享受到了酒店高档的早晨。在游泳池旁边吃早晨~ IMG_0116 IMG_0117 IMG_0118 IMG_0119 IMG_0120 IMG_0121 IMG_0122 IMG_0123 IMG_0124 然后上午坐车去了当地的市中心,那边还是比较热闹的,可以看到各种各样的人,卖各种东西的。 在那逛了好长时间,买买东西,参观之类的。重要的是感受一发当地的风土人情。 IMG_20150517_124037 IMG_20150517_124256 IMG_20150517_124522 IMG_20150517_124525 IMG_20150517_140928 IMG_20150517_140940 然后一直在外面玩到下午才回来,回来休息下,就是吃丰盛的晚餐~ 然后在酒店玩玩逛逛,就睡觉了。 5月18日: 起来一样在酒店吃了高级的早晨。 然后上午为了出去买明信片,打车去了趟外面的的超市,买完就回来了,但还是被出租车司机给坑了一发。然后回来听了IBM的技术讲座,听起来很高端大气的样子。中午又是吃了自助餐。下午在酒店玩了一下,四点去参加了开幕式。 开幕式非常牛逼。 IMG_0230 开幕式结束后, 被运送到一个神秘的地方吃晚餐。 吃的是类似农家乐的形式,有点不习惯的感觉。应该也是那的一种特色吧。先是各种载歌载舞的, 之后是一大盘的菜端过来,吃完几大盘就结束了。 吃完以后,就坐车回酒店了,然后洗洗睡了~ 5月19日: 这一天主要的事情就是热身赛 早上起来,吃了早餐,然后周围转了一圈。 然后开始热身赛进场,进去后熟悉了下环境。 热身赛开始以后,例行配置了一下环境,然后开始热身赛。 热身赛题不难,看上去都是原题,好几个是上一年final的原题。 上来写了一发水搜索,WA之后调整一发姿势过了。 然后电脑给队友写,自己在旁边推构造题,推了好久推出来了,然后写完AC。 其余题感觉代码写起来有点烦,就没去写了,坐等结束~ , 太慌张,连环境都没测试。 然后去吃午餐了。 吃完午餐去听了回答一些热身赛提的问题,大部分是一些比较滑稽的问题吧~ 愉快地结束了。 结束后,又有一个小时可以进入比赛场地进行机器等测试。 本来想测试一发电脑等环境的,然后给队友写题了,之后队友执着写到结束,便放弃了测试,之后去围观了一发吴码,讨论了些问题。 感觉热身赛比较失败,几乎什么都没测试,心有点不安,但是感觉应该问题不大,感觉电脑都挺好的。 然后回酒店和吴码打了一发CF,热身下,虐场失败! 晚餐又是丰盛的自助餐~ 几乎每天吃的都一样。 之后回来休息了,为明天的正赛准备。 5月20日:这一天是激动人心的final。 早上吃完早餐后,就等待着进场。 进场仪式很热闹,在门口等了好久。 进场以后,就坐等比赛正式开始了。 比赛开始以后,我配置了下VIM,登录一些比赛账号。 然后读了几道中间的题目,感觉题目都比较长,没发现什么简单题。然后队友给我说A比较简单, 我去确认了下,感觉是大水题。然后有队伍过A了,马上开始写A,很快写完,交上去AC了。 A题 10min 1Y 。 然后我去看了D题,一个很水的几何题, 只要推一发公式, 然后二分就可以了。 然后我开始做D, 把公式推好,然后开始写。写完测了下样例没问题, 然后提交了,AC了。 D题 48 min 1Y。 然后看队友在思考F题, 我去了解了下题意, 感觉就是简单的搜索,状态数很少,判重就可以了, 然后我开始写F题, 写完后,感觉没问题,交上去AC了。F题 73min 1Y。 然后队友们在讨论着B题,过了好多人了,猜测是费用流,但是不会建图, 我去看了下,看懂题意以后,发现很裸的最小费用最大流,简单的建图,讨论了下建图的一些细节后,我拿出模板开始敲,模板敲完,建图完成以后,样例测试没问题。 交上去意外返回WA, 第一反应是模板敲错,但是突然意识到有个地方需要枚举一发。 快速修改以后,交上去AC了。 C题 110min 2Y。 然后我开始重新找题做,开始去看了I题,看懂题意以后感觉不难,然后上一发厕所回来,完全想清楚了I题的做法。 我开始快速写I题, 这期间我们一直稳定在20名左右,榜上遍地开花。 写完I题,出不来样例,然后发现有个小地方写错,修改以后出样例了, 提交上去AC了。 I题 151min 1Y。 然后回过来,队友似乎没找到新的题目。 L题做出的人比较多,我问了L题意思,队友说是数学题,没读懂。 然后我开始认真读L了。 看懂L题, 我瞬间发现了水题。 很裸的哈夫曼编码的题目, 只是要分类进行合并, 我对这类题目还是非常擅长的,毕竟当年信息论我是学得很好的,而且非常好写。 然后我开始写L题。很快写完了,提交上去返回AC了。 L题185 min 1Y。 这个时候比赛已经过了3个小时了,排名大概在20多一点吧,这个时候过的比较多的是J题,队友们都在讨论这题,我就打算先不看这题,转而去看了H题, 读了好几遍都没读懂。过了段时间,队友说J题用FFT做,我去看了下题目意思,做法确实是比较裸的FFT,应该早点做这题的。 然后我开始发挥模板帝的优势,拿出模板开始写FFT, 敲完模板, 然后写完主函数,修正了敲模板时候的错误,样例就出来了。 然后提交以后就AC了。 J题 231min 1Y。 做出J题还是浪费了一段时间的, 做完J题,只剩下一个小时了,然后封榜了。根据当时的过题数,EHM是稍微过的比较多的。 然后我继续去读H题了,队友貌似都去做M题了。 用过对题意的各种YY,我总算对H题的题意有点懂了,队友感觉M题可能写不完了, 我就上去尝试了写H题,就是各种二分乱搞的题目。 写完代码, 我发现根本出不来样例。 当时感觉要么题意YY错误,要么代码写傻逼了。 然后下来重新读题意,检查代码,都没意识到什么问题。 然后各种猜测题意去改代码,都搞不出样例,代码中间还加了三分,还是出不来样例。 直接比赛快结束了,也没能调出样例。最后几分钟弃疗了。 开始尝试把各个题目都交一遍,但是最后2分钟网页卡住了,没能每个题都交一发 。 就这样,我的最后一场ICPC比赛,我唯一一场world finals 就这样结束了。 封榜前是22名,后面只有等别人不断超越,最后定格在31名。 然后是去合影,休息下之后是颁奖典礼。 颁奖典礼就是围观别人捧杯的,非常欢快的氛围,颁奖典礼工作人员都在那high起来了。 颁奖典礼结束,就是等待吃晚餐了。 晚餐又是个很奇葩的, 乐队带着去了一个室外吃晚餐。 人很多,非常疯狂, 但是在那high的大部分是志愿者和当地人吧, 然后肉是现烤的,抢不到肉吃,排队等肉的人非常多。 吃完以后,回到酒店开始写明信片。 买了100张明信片,写起来工作量非常巨大。 还找wuyiqi和适牛给明信片签了名,写明信片写到很晚。 当晚写到2点多,撑不住了,就去睡觉了。第二天早上很早就闹钟闹醒来继续写,总算要的人都写了,写了70多张吧。 然后快速收拾东西。 5月21日: 早上一起来就匆忙收拾东西,写明信片花了好多时间,时间就好赶了。 早餐都没吃,就坐大巴去当地的机场了。坐飞机去了卡萨布兰卡, 在卡萨布兰卡等了一段时间,就飞去迪拜了。 5月22日: 到达迪拜是凌晨了。 和来的时候一样,老师在酒店开了房间,然后开始购物。 也就是买了一些吃的东西,把带来的美元都花光了。 之后从迪拜飞到了上海,晚上很晚才回去,结束了本次final之旅。 虽然final最终结果不是很好,尤其是最后一个多小时,完全安排得不合理,应该提前确定一道题,然后全队一起看一题的,而且好多题题目意思我根本还不知道,尤其是比较简单的E题,最后看都没看。 如果好好利用最后的时间,做出第8题是比较容易的,这也是留下的一个遗憾了。 但是这也算是比较容易接受的结果了,毕竟我们赛前几个月根本没有组队训练过,可说毫无战斗力了。 我也是赛前两个月在那疯狂刷了很多区域赛题,把以前的final题都做了一发,勉强在final时候调整到了比较好的状态吧! 对我而言,唯一的一场final,我至少是认真准备过的,只能接受这个结果,然后退役了! 不可否认,赛前我们是被很多人不看好的,甚至是我校的人,都感觉我太弱了,去了final应该垫底的。final开场时候的表现,还是让他们很震惊的,一度维持在十几名。 做出几个题以后,好像还被断言后面不会再出题了,幸好最后还是搞出了7题,不至于太难看,只可惜未能一直延续下去。 总之,这一次的final,确实太远了,路途有点累,然后比赛体验还是很好的。感谢一起奋斗的队友、教练,以及一大群志同道合的小伙伴们,End. 最后纪念一发我在现场写的代码:

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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
#include <bits/stdc++.h>

using namespace std;

double p,a,b,c,d;

int n;

double f(int k){

return p*(sin(a*k+b)+cos(c*k+d)+2);

}

int main(){

while(scanf("%lf%lf%lf%lf%lf%d",&p,&a,&b,&c,&d,&n) == 6){

double ans = 0;

double tmp = f(1);

for(int i = 2;i <= n;i++){

double tmp2 = f(i);

ans = max(ans,tmp-tmp2);

tmp = max(tmp,tmp2);

}

printf("%.10lf\n",ans);

}

return 0;

}

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 500;

const int MAXM = 100010;

const long long INF = 1000000000000000LL;

struct Edge{

int to,next,cap,flow;

long long cost;

}edge[MAXM];

int head[MAXN],tol;

int pre[MAXN];

long long dis[MAXN];

bool vis[MAXN];

int N;

int init(int n){

N = n;

tol = 0;

memset(head,-1,sizeof(head));

}

inline void addedge(int u,int v,int cap,long long cost){

edge[tol].to = v;

edge[tol].cap = cap;

edge[tol].flow = 0;

edge[tol].cost = cost;

edge[tol].next = head[u];

head[u] = tol++;

edge[tol].to = u;

edge[tol].cap = 0;

edge[tol].flow = 0;

edge[tol].cost = -cost;

edge[tol].next = head[v];

head[v] = tol++;

}

bool spfa(int s,int t){

queue<int>q;

for(int i = 0;i < N;i++){

dis[i] = INF;

vis[i] = false;

pre[i] = -1;

}

dis[s] = 0;

vis[s] = true;

q.push(s);

while(!q.empty()){

int u = q.front();

q.pop();

vis[u] = false;

for(int i = head[u];i != -1;i = edge[i].next){

int v = edge[i].to;

if(edge[i].cap > edge[i].flow && dis[v] > dis[u]+edge[i].cost){

dis[v] = dis[u] + edge[i].cost;

pre[v] = i;

if(!vis[v]){

vis[v] = true;

q.push(v);

}

}

}

}

if(pre[t] == -1)return false;

else return true;

}

int mcmf(int s,int t,long long &cost){

int flow = 0;

cost = 0;

while(spfa(s,t)){

int Min = 100000000;

for(int i = pre[t];i != -1;i = pre[edge[i^1].to]){

if(Min > edge[i].cap -edge[i].flow)

Min = edge[i].cap - edge[i].flow;

}

for(int i = pre[t];i != -1;i = pre[edge[i^1].to]){

edge[i].flow += Min;

edge[i^1].flow -= Min;

cost += edge[i].cost*Min;

}

flow += Min;

}

return flow;

}

int a[110][110];

const long long MM = 10000000000LL;

int main(){

int n,k;

while(scanf("%d%d",&n,&k) == 2){

for(int i = 0;i < n;i++)

for(int j = i+1;j <= n;j++)

scanf("%d",&a[i][j]);

long long ret = INF;

for(int kk = 1;kk <= k;kk++){

init(2*n+3);

addedge(2*n+1,0,kk,0);

for(int i = 1;i <= n;i++){

addedge(2*i,2*n+2,1,0);

}

for(int i = 1;i <= n;i++){

addedge(0,2*i-1,1,a[0][i]);

}

for(int i = 1;i <= n;i++)

addedge(2*i-1,2*i,1,-MM);

for(int i = 1;i < n;i++)

for(int j = i+1;j <= n;j++)

addedge(2*i,2*j-1,1,a[i][j]);

long long ans;

mcmf(2*n+1,2*n+2,ans);

ans += MM*n;

ret = min(ans,ret);

}

printf("%d\n",(int)ret);

}
return 0;

}

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 10010;

const double eps= 1e-8;

const double PI = acos(-1.0);

struct Node{

double x,y,z,r;

void input(){

scanf("%lf%lf%lf%lf",&r,&x,&y,&z);

r /= 1000;

x /= 1000;

y /= 1000;

z /= 1000;

}

}node[MAXN];

int n,s;

double calc(int i,double zz){

double x = node[i].x;

double y = node[i].y;

double z = node[i].z;

double r = node[i].r;

if(zz < z-r+eps)return 0;

if(z+r-eps < zz)return 4.0/3*PI*r*r*r;

if(z > zz){

double h = r - (z-zz);

double tmp = PI(r*h*h-1.0/3*h*hh);

return tmp;

}

else {

double h = r - (zz-z);

double tmp = PI(r*h*h-1.0/3*h*hh);

return 4.0/3*PI*r*r*r-tmp;

}

}

double calc(double zz){

double ret = 100.0*100*zz;

for(int i = 0;i < n;i++)

ret -= calc(i,zz);

return ret;

}

int main(){

while(scanf("%d%d",&n,&s) == 2){

for(int i = 0;i < n;i++)

node[i].input();

double tot = calc(100.0);

tot /= s;

double pre = 0.0;

for(int i = 1;i <= s;i++){

double l = pre;

double r = 100.0;

double ans = l;

while(r-l >= eps){

double mid = (r+l)/2;

if(calc(mid) <= tot*i){

ans = mid;

l = mid+eps;

}

else r = mid-eps;

}

printf("%.10lf\n",ans-pre);

pre = ans;

}

}

return 0;

}

#include <bits/stdc++.h>

using namespace std;

char str[100][100];

int up[100][100];

int down[100][100];

int Left[100][100];

int Right[100][100];

int n,m;

int dp[55][55][10010];

/*

void update(int i,int j,int now,int tmp){

if(dp[i][j][now] == -1);

if(dp[i][j][now] > tmp)dp[i][j][now] = tmp;

}

*/

char ss[10010];

int len;

struct Node{

int x,y,now;

Node(int _x = 0,int _y = 0,int _now = 0){

x = _x;

y = _y;

now = _now;

}

};

int bfs(){

queue<Node>q;

memset(dp,-1,sizeof(dp));

dp[0][0][0] = 0;

q.push(Node(0,0,0));

while(!q.empty()){

Node tmp = q.front();

q.pop();

int x = tmp.x;

int y = tmp.y;

int now = tmp.now;

if(now == len)return dp[x][y][now];

if(ss[now] == str[x][y]){

int nx = x;

int ny = y;

int nn = now+1;

if(dp[nx][ny][nn] == -1){

dp[nx][ny][nn] = dp[x][y][now]+1;

q.push(Node(nx,ny,nn));

}

}

if(up[x][y] != -1){

int nx = up[x][y];

int ny = y;

int nn = now;

if(dp[nx][ny][nn] == -1){

dp[nx][ny][nn] = dp[x][y][now]+1;

q.push(Node(nx,ny,nn));

}

}

if(down[x][y] != -1){

int nx = down[x][y];

int ny = y;

int nn = now;

if(dp[nx][ny][nn] == -1){

dp[nx][ny][nn] = dp[x][y][now]+1;

q.push(Node(nx,ny,nn));

}

}

if(Left[x][y] != -1){

int nx = x;

int ny = Left[x][y];

int nn = now;

if(dp[nx][ny][nn] == -1){

dp[nx][ny][nn] = dp[x][y][now]+1;

q.push(Node(nx,ny,nn));

}

}

if(Right[x][y] != -1){

int nx = x;

int ny = Right[x][y];

int nn = now;

if(dp[nx][ny][nn] == -1){

dp[nx][ny][nn] = dp[x][y][now]+1;

q.push(Node(nx,ny,nn));

}

}

}

return -1;

}

int main(){

while(scanf("%d%d",&n,&m) == 2){

for(int i = 0;i < n;i++)

scanf("%s",str[i]);

for(int j = 0;j < m;j++){

int tmp = -1;

for(int i = 0;i < n;i++){

if(i > 0 && str[i-1][j] != str[i][j])

tmp = i-1;

up[i][j] = tmp;

}

tmp = -1;

for(int i = n-1;i>=0;i--){

if(i+1 < n && str[i+1][j] != str[i][j])

tmp = i+1;

down[i][j] = tmp;

}

}

for(int i = 0;i < n;i++){

int tmp = -1;

for(int j = 0;j < m;j++){

if(j > 0 && str[i][j-1] != str[i][j])

tmp = j-1;

Left[i][j] = tmp;

}

tmp = -1;

for(int j = m-1;j >= 0;j--){

if(j+1 < m &&str[i][j] != str[i][j+1])

tmp = j+1;

Right[i][j] = tmp;

}

}

scanf("%s",ss);

len = strlen(ss);

ss[len] = '*';

ss[len+1] = 0;

len++;

printf("%d\n",bfs());

}

return 0;

}

#include <bits/stdc++.h>

using namespace std;

const double eps = 1e-8;

vector<pair<double,int> >vec;

int main(){

int n;

double w,u,v,t1,t2;

while(scanf("%d%lf%lf%lf%lf%lf",&n,&w,&u,&v,&t1,&t2) == 6){

vec.clear();

char op[10];

int m;

double l,p;

for(int i = 1;i <= n;i++){

scanf("%s",op);

scanf("%d",&m);

while(m--){

scanf("%lf%lf",&l,&p);

if(op[0] == 'E'){

double tt1 = (0-p)/u;

double tt2 = (0-(p-l))/u;

double tmp1 = tt1 - i*w/v;

double tmp2 = tt2 - (i-1)*w/v;

tmp1 = max(tmp1,t1);

tmp2 = min(tmp2,t2);

if(tmp1 > tmp2-eps)continue;

vec.push_back(make_pair(tmp1,1));

vec.push_back(make_pair(tmp2,-1));

}

else {

double tt1 = p/u;

double tt2 = (p+l)/u;

double tmp1 = tt1 - i*w/v;

double tmp2 = tt2 - (i-1)*w/v;

tmp1 = max(tmp1,t1);

tmp2 = min(tmp2,t2);

if(tmp1 > tmp2-eps)continue;

vec.push_back(make_pair(tmp1,1));

vec.push_back(make_pair(tmp2,-1));

}

}

}

sort(vec.begin(),vec.end());

double ans = 0;

int sz = vec.size();

if(sz == 0)ans = t2-t1;

else {

ans = vec[0].first - t1;

int sum = 0;

for(int i = 0;i < sz;i++){

sum += vec[i].second;

if(sum == 0){

double tmp;

if(i+1 < sz)tmp = vec[i+1].first - vec[i].first;

else tmp = t2-vec[i].first;

ans = max(ans,tmp);

}

}

}

printf("%.10lf\n",ans);

}

return 0;

}

#include <bits/stdc++.h>

using namespace std;

const double PI = acos(-1.0);

struct Complex{

double x,y;

Complex(double _x = 0,double _y = 0){

x = _x;

y = _y;

}

Complex operator -(const Complex &b)const{

return Complex(x-b.x,y-b.y);

}

Complex operator +(const Complex &b)const{

return Complex(x+b.x,y+b.y);

}

Complex operator *(const Complex &b)const{

return Complex(x*b.x-y*b.y,x*b.y+y*b.x);

}

};

void change(Complex y[],int len){

int i,j,k;

for(i = 1, j = len/2;i < len-1;i++){

if(i < j)swap(y[i],y[j]);

k = len/2;

while(j >= k){

j -= k;

k /= 2;

}

if(j < k)j += k;

}

}

void fft(Complex y[],int len,int on){

change(y,len);

for(int h = 2; h <= len;h <<= 1){

Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));

for(int j = 0;j < len;j += h){

Complex w(1,0);

for(int k = j;k < j+h/2;k++){

Complex u = y[k];

Complex t = w*y[k+h/2];

y[k] = u+t;

y[k+h/2] = u-t;

w = w*wn;

}

}

}

if(on == -1){

for(int i = 0;i < len;i++)

y[i].x /= len;

}

}

long long a[2000000];

Complex y[2000000];

int main(){

memset(a,0,sizeof(a));

for(int i = 1;i <= 500000;i++)

for(int j = 1;i*j <= 500000;j++)

a[i*j]++;

int N = 1;

while(N <= 2*500000)N <<= 1;

for(int i = 0;i < N;i++)

y[i] = Complex((double)a[i],0.0);

fft(y,N,1);

for(int i = 0;i < N;i++)

y[i] = y[i]*y[i];

fft(y,N,-1);

for(int i = 0;i <= 500000;i++)

a[i] = (long long)(y[i].x+0.5);

/*

for(int i = 0;i <= 10;i++)

printf("%lld\n",a[i]);

*/

int T;

scanf("%d",&T);

int l,r;

while(T--){

scanf("%d%d",&l,&r);

int ans = l;

for(int i = l;i <= r;i++)

if(a[i] > a[ans])

ans = i;

printf("%d %lld\n",ans,a[ans]);

}

return 0;

}

#include <bits/stdc++.h>

using namespace std;

double pow_m(double p,int n){

double ret = 1.0;

for(int i = 0;i < n;i++)

ret *= p;

return ret;

}

struct node{

double p;

long long cnt;

node(double _p = 0.0,long long _cnt = 0){

p = _p;

cnt = _cnt;

}

friend bool operator <(node a,node b){

return a.p > b.p;

}

};

priority_queue<node>q;

long long jiecheng[30];

int main(){

int n;

jiecheng[0] = 1;

for(int i = 1;i <= 20;i++)

jiecheng[i] = jiecheng[i-1]*i;

double p1,p2,p3,p4;

while(scanf("%d",&n) == 1){

scanf("%lf%lf%lf%lf",&p1,&p2,&p3,&p4);

while(!q.empty())q.pop();

for(int i = 0;i <= n;i++)

for(int j = 0;i+j <= n;j++)

for(int x = 0;i+j+x <= n;x++){

int y = n - i - j - x;

node tmp;

tmp.p = pow_m(p1,i)*pow_m(p2,j)*pow_m(p3,x)*pow_m(p4,y);

tmp.cnt = jiecheng[n]/jiecheng[i]/jiecheng[j]/jiecheng[x]/jiecheng[y];

q.push(tmp);

}

double ans = 0;

while(!q.empty()){

node tmp = q.top();

q.pop();

if(tmp.cnt == 1 && q.empty()){

//ans += tmp.p;

break;

}

if(tmp.cnt == 1){

node tmp2 = q.top();

q.pop();

if(tmp2.cnt > 1)q.push(node(tmp2.p,tmp2.cnt-1));

q.push(node(tmp.p+tmp2.p,1));

ans += tmp.p+tmp2.p;

}

else {

if(tmp.cnt&1)q.push(node(tmp.p,1));

ans += tmp.cnt/2*2*tmp.p;

if(tmp.cnt/2)q.push(node(tmp.p*2,tmp.cnt/2));

}

}

printf("%.10lf\n",ans);

}

return 0;

}
0%