【Team 马上就要把楼上超过了 训练记录】

Team members

BiuBiuBiu
Walker
Nitrogens

To Do List

  • 找一个表达式求值模板加到板子里( 支持 + - × / )以及括号。
  • 带撤回操作的贪心
  • BiuBiuBiu的线段树专题
  • 汉诺塔问题待填坑:https://blog.csdn.net/xueerfei008/article/details/9904681
  • For Nitrogens: 蓝书图论部分抓紧学完+CF上面的图论题+学习概率DP和期望DP
  • 高斯消元

Caution

  • 清空数组
  • 博弈题或者数学题遇事不决上来先打表
  • 输出字符大小写检验
  • 题意必须完全读懂再上去写代码
  • 每道题的题意必须经过至少两个人的确认才能上去敲
  • 样例必须手推通过才可以上去敲
  • 数组大小一定要算好
  • map 的时候可以用字典树优化
  • 有做法等机时的时候如果是水题直接去开题意,否则在纸上写下细节
  • 细节多的题或者猜结论的题多出数据
  • 注意爆int,和某些爆long long的写法
  • 不要浪,时刻紧张

Contests

赛中通过和赛后通过的代码均在github仓库: https://github.com/lajiyuan/segmentation-fault-training

Date Contest Solved Penalty Rank A B C D E F G H I J K L M
2019 / 05 / 08 2019/05/08 2019/05/08 2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016) 7 / 11 7/11 7/11 1212 1212 1212 9 / 270 9/270 9/270 O ! O O O O O . . O Ø / /
2019 / 04 / 27 2019/04/27 2019/04/27 The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple 8 / 13 8/13 8/13 1031 1031 1031 58 / 1061 58/1061 58/1061 ! O Ø . O O O O O O O . .
2019 / 04 / 23 2019/04/23 2019/04/23 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) 6 / 10 6/10 6/10 688 688 688 17 / 320 17/320 17/320 O Ø O O O O O . . . / / /
2019 / 04 / 14 2019/04/14 2019/04/14 The 19th Zhejiang University Programming Contest Sponsored by TuSimple 6 / 10 6/10 6/10 330 330 330 41 / 1288 41/1288 41/1288 O O O . O . O Ø . O / / /
2019 / 04 / 12 2019/04/12 2019/04/12 2014 Nordic Collegiate Programming Contest 6 / 11 6/11 6/11 688 688 688 27 / 263 27/263 27/263 Ø . O O O . O O Ø . O / /
2019 / 04 / 10 2019/04/10 2019/04/10 2017, X Samara Regional Intercollegiate Programming Contest 8 / 13 8/13 8/13 967 967 967 13 / 71 13/71 13/71 O O O O O . O O Ø . Ø . O
2019 / 04 / 06 2019/04/06 2019/04/06 2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) 5 / 10 5/10 5/10 901 901 901 23 / 123 23/123 23/123 . O O O O Ø Ø Ø O . / / /
2019 / 04 / 03 2019/04/03 2019/04/03 2017-2018 ACM-ICPC East Central North America Regional Contest (ECNA 2017) 7 / 10 7/10 7/10 12 / 134 12/134 12/134 . Ø O O O O O O Ø O / / /
2019 / 03 / 31 2019/03/31 2019/03/31 2017 JUST Programming Contest 4.0 11 / 11 11/11 11/11 985 985 985 6 / 79 6/79 6/79 O O O O O O O O O O O / /

. 尚未通过 O当场通过 !口头通过 Ø赛后通过


2017 JUST Programming Contest 4.0

Link: http://codeforces.com/gym/241749

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Subarrays Beauty 签到题 42 / 50 42/50 42/50 O
B Array Reconstructing 签到题 69 / 90 69/90 69/90 O
C Large Summation 二分 35 / 47 35/47 35/47 O
D Counting Test 细节题 34 / 42 34/42 34/42 O
E Game of Dice 折半枚举 22 / 26 22/26 22/26 O
F Strings and Queries 线段树 12 / 23 12/23 12/23 O
G Magical Indices 签到题 65 / 76 65/76 65/76 O
H Corrupted Images 签到题 58 / 61 58/61 58/61 O
I The Crazy Jumper DP 50 / 55 50/55 50/55 O
J The Hell Boy 数学题 44 / 49 44/49 44/49 O
K Palindromes Building 数学题 55 / 62 55/62 55/62 O

Competition process

由于圈的比赛比较水,所以签到题比较多,开场 BiuBiuBiu 发现 B 这个签到题,于是直接上去写,在8min过掉第一个签到。之后去开A题,由于最开始题意理解错误,导致26min才过掉。之后在34min过掉G题,这中间Nitrogenswalker说了一下D题的做法,大家感觉都没有问题,于是Nitrogens上去写,写到中间发现过的人不多,于是继续开题意,这时Nitrogens发现 H 也是个签到题,于是在51min过掉H,之后walkerBiuBiuBiu说了一下C的做法,感觉可行,在63min过掉C,之后Nitrogens上去写I,很快写好但是样例过不去,然后发现是数组没有清空,之后改掉在80min过掉I题,之后BiuBiuBiu发现J题竟然是自己出过的题,然后walker也想到了做法,于是walker上去写,其他人继续开题意,之后BiuBiuBiu得到了K题的做法,walker在85min过掉J,然后BiuBiuBiu上机过掉K题,之后Nitrogens感觉D的做法就是对的,于是上去继续写D,由于忘了清空数组打破了81A的记录,在119min过掉D题,在这之间BiuBiuBiu得到了EF的做法,之后BiuBiuBiu上机写E,由于没有注意细节爆long long贡献一发罚时,在140min过掉E题,还剩最后一个FBiuBiuBiu想到的是线段树的做法,写完交上去WA2,原因是给定数据的区间lr不一定按顺序,之后改掉发现TLE,于是把之前判定回文半径的方法优化为Manacher,还是TLE,最后把map改为unorder_map才在188min过掉,比赛就结束了!

Problems Solution

签到题BDGH

A - Subarrays Beauty

可以发现只有连续的 1 1 1 可以做贡献,那么只需要把每个二进制位单独考虑并且对每段连续的1计算贡献即可。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

C - Large Summation

可以发现两数相加之后取模只有两种结果,对两种结果分别二分去求最大值即可。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

I - The Crazy Jumper

d p [ i ] dp[i] dp[i] 表示到 i i i 的最小步数,每个状态只能从两个之前的状态转移过来,注意清空数组即可。

时间复杂度: O ( n ) O(n) O(n)

J - The Hell Boy

递推的去求就会发现计算技巧,之后去按照规律计即可,注意取模。

时间复杂度: O ( n ) O(n) O(n)

K - Palindromes Building

如果有超过 1 1 1 个字符出现奇数次,则不可能构成回文串。
否则统计每个位置上的选择数即可,要注意对相同的字符重复计算的问题。

时间复杂度: O ( n ) O(n) O(n)

E - Game of Dice

首先把 14 14 14 个骰子分成两份,之后分别爆搜即可,注意算逆元的时候处理不好会爆 long long

时间复杂度: O ( 6 7 ∗ l o g ( 6 7 ) ) O(6^7*log(6^7)) O(67log(67))

F - Strings and Queries

问题处理一下就是区间最大值问题,之后注意被卡 mapTLE 的问题,优化方法有 unordered_maptrie

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)


2017-2018 ACM-ICPC East Central North America Regional Contest (ECNA 2017)

Link: http://codeforces.com/gym/101673

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Abstract Art 计算几何 0 / 6 0/6 0/6 .
B Craters 计算几何 3 / 9 3/9 3/9 Ø
C DRM Messages 模拟 130 / 135 130/135 130/135 O
D Game of Throwns 模拟 120 / 136 120/136 120/136 O
E Is-A? Has-A? Who Knowz-A? 传递闭包 15 / 64 15/64 15/64 O
F Keeping On Track 树上DP 25 / 35 25/35 25/35 O
G A Question of Ingestion 线性DP 28 / 71 28/71 28/71 O
H Sheba’s Amoebas DFS 94 / 107 94/107 94/107 O
I Twenty Four, Again 表达式求值+暴力 9 / 12 9/12 9/12 Ø
J Workout for a Dumbbell 细节模拟 30 / 53 30/53 30/53 O

Competition process

开场发现 C签到题,之后BiuBiuBiuwalker 开了 H 题,与此同时 Nitrogens 快速看完 C 题题意,很快码完了,测了样例全部通过,检查无误之后提交,10min1AH 题题意看了 20min 才看懂,之后 BiuBiuBiu 调了很久 H 才过了样例,然而交上去就 WA 掉了,原因是数组开小了。之后,Nitrogens 马上开始写 D,之后 52min1A。此时已经发现了 H 的问题,改完之后交上去,56min2A。之后一起开了 F 的题意,然后发现是简单的树上 dpBiuBiuBiu 很快码完,最后89min1A。之后开了 J 的题意,后来发现 J 的题意云里雾里的根本看不明白,后来连看带猜才勉强猜出题意。BiuBiuBiu 放弃了这道题,后来 Nitrogens 想出了一个可能的做法,与 BiuBiuBiu 讨论了一下,发现思路惊人的相似!! 于是 Nitrogens 上机开始码这道题,码完之后样例没过。然后 BiuBiuBiuwalker 想出了 G 题的状态转移方程,于是 BiuBiuBiu 开始码 G。中间 Nitrogens 发现自己一个小细节写错了,找到机会上机的时候立马把错误改掉,之后交上去,惊喜的发现 173min1A。马上 G 也写完了,交上去发现 RE,改正之后再交,返回 WA。之后,加了很多没用的特判,还是 WA,最后发现有一个小地方可能有问题,但是自己却构造不出那种数据,于是莽了一发,229min5A。这时 Nitrogens 已经将 E 的模型化简并得到了做法,码完之后调了好久,才过了样例,交上去发现 WA 了。之后造了几组数据,发现了很多 BUG,这时用 BiuBiuBiu 的简单写法重写了 EBUG 神奇的全部消失了,交上去,283min2A。在这期间,walkerBiuBiuBiu 已经讨论出了 I 的正确写法,然后 walker 上机写表达式求值奈何时间太短,比赛结束!!!

Problems Solution

签到题: CH

B - Craters

由于题中给定很多圆,我们发现很多个圆的凸包很难求解,所以我们可以均匀地在圆周上找出5000个点,之后对所有点求凸包即可。

时间复杂度: O ( n × 5000 × l o g ( n × 5000 ) ) O(n×5000×log(n×5000)) O(n×5000×log(n×5000))

D - Game of Throwns

对于第一种操作,直接移动相应的位置后对 n n n 取模即可(若出现负数,则将其变为正数之后再取模),之后用栈记录每次进行的操作。

对于第二种操作,直接从栈中取出 m m m 个元素,进行反向的第一种操作即可。注意每次取栈中元素之前,要对栈进行判空。

时间复杂度: O ( n ) O(n) O(n)

E - Is-A? Has-A? Who Knowz-A?

对于 is-a 关系和 has-a 关系,按照上面的规则分别Floyd传递闭包即可。

时间复杂度: O ( n 3 ) O(n^3) O(n3)

F - Keeping On Track

首先树形dp统计出每个子树内点的个数,之后对于每个点计算删除之后的不联通点对数并记录下关键节点。

对于关键节点,选出两个最大的子树联通即可。

时间复杂度: O ( n ) O(n) O(n)

G - A Question of Ingestion

dp[i][j]表示第i轮之后能剩余卡路里为j的最大食物获取量,之后按照题意进行转移即可。
如果第i轮选择吃/不吃东西,则从上一轮转移过来。
对于满卡路里的状态,还可以从两轮之前转移过来。
最后要注意判断状态的可达行,有些状态之前到达不了则不能转移。

时间复杂度: O ( n m ) O(nm) O(nm)

I - Twenty Four, Again

暴力枚举所有表达式判断可行性,可行则更新答案。

时间复杂度: O ( 4 ! × 4 × 4 × 4 × 5 × 4 3 ) O(4!×4×4×4×5×4^3) O(4×4×4×4×5×43)

J - Workout for a Dumbbell

按顺序对三个回合进行计算,当 Jim 使用器械 i i i 时,计算当前时间 t t t S i S_i Si 的差值 d e l t a delta delta,之后将 d e l t a delta delta T i + R i T_i+R_i Ti+Ri 进行取模。
这时,我们可以方便地判断主人使用该器械的状态(使用 OR 休息)。
之后,按照题意进行分类讨论,然后更新 S i S_i Si t t t。最后的 t t t 减去 r 10 r_{10} r10 就是答案。
具体细节,可参考代码,这里不再赘述。

时间复杂度: O ( 3 ⋅ 10 ) O(3 \cdot 10) O(310)


2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016)

Link: http://codeforces.com/gym/101196

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Bubbly Troubly 计算几何 2 / 6 2/6 2/6 .
B Foosball Dynasty 模拟 76 / 101 76/101 76/101 O
C The Key to Cryptography 字符串+签到题 121 / 125 121/125 121/125 O
D Lost in Translation 生成树 33 / 61 33/61 33/61 O
E Red Rover 字符串+签到题 88 / 93 88/93 88/93 O
F Removal Game 区间DP 12 / 33 12/33 12/33 Ø
G That’s One Hanoi-ed Teacher 汉诺塔问题 21 / 26 21/26 21/26 Ø
H Vin Diagrams 搜索 17 / 27 17/27 17/27 Ø
I Waif Until Dark 最大流 18 / 24 18/24 18/24 O
J Yes, Yes, It’s Nonograms 5 / 7 5/7 5/7 .

Competition process

开场 Nitrogens 开了 C 题的题意,并口头描述给了 BiuBiuBiuBiuBiuBiu 很快码完了,后来发现样例没过,然后发现题意读错( 1 1 1 次读错题意)。改正之后,16min1A。很快 Nitrogens 又把 E 题题意读完,告诉了 BiuBiuBiuBiuBiuBiu 很快码完,28min1A。之后开始了自闭的历程,两个半小时零输出。写完之后,walker 读完了 I 题( 2 2 2 次读错题意),写了一会之后,过掉了样例,交上去WA4,发现模板有个地方抄错了,再交,依旧WA4,在这期间, NitrogensBiuBiuBiu 叙述了 D 题题意( 3 3 3 次读错题意),之后 BiuBiuBiu 上去码 D,在这之间,Nitrogens 一直在开 B 题题意,同时在不断确认 D 题题意。之后,BiuBiuBiu 写完了 D,交上去WA4,发现题意错了,重新确认了一遍题意( 4 4 4 次读错题意),这之间 Nitrogens 写完了 B 题,交上去WA6,然后换 BiuBiuBiu 上去写 D,很快写完,交上去WA4。发现题中没有说明数据范围,之后改了一发 long long,发现还是 WA4。最后又重新确认题意,发现可能是双向边,抱着试一试的态度,179min4A。之后,walker 发现 I 题也读错了题意,然后在 BiuBiuBiuD 的期间整理出了做法,D 过了之后 walker 上去写 I,第一次由于建边的问题WA2,改正之后217min4A。之后,Nitrogens 上去写了一会 F,发现样例过不去。然后这时 BiuBiuBiu 去开了 G 题,walker 上去按照他的思路重写了 B 题,交上去,WA4,后来 Nitrogens 也发现自己的一处错误( 5 5 5 次读错题意),交上去,依旧 WA6。这时 walker 发现有一处DEBUG没删掉,删掉之后,281min4A。这时 BiuBiuBiu 上去写了 G奈何时间太短,比赛结束!!赛后发现 F 题上机写的做法已经很接近很接近正解!!!!

Problems Solution

签到题: BCE

D - Lost in Translation

首先,用 BFS 求出起点到达每一个点的最短路径。之后,保留所有 d i s v = d i s u + 1 dis_v=dis_u + 1 disv=disu+1 的边,发现这是一个分层图,只需要对每一个点留一条花费最小的,指向祖先的边即可。

时间复杂度: O ( n + m ) O(n+m) O(n+m)

F - Removal Game

先将序列复制一份,放在原序列后面,构成长度为 2 n 2n 2n 的序列。

d p [ i ] [ j ] dp[i][j] dp[i][j] 为删去 [ i + 1 , j − 1 ] [i+1,j-1] [i+1,j1] 区间内所有数字所付出的最小代价 ( 1 ≤ i ≤ j ≤ 2 n 1 \le i \le j \le 2n 1ij2n)。

则我们可以用区间 dp 来求解每一个 dp 值。

之后,暴力枚举最后取 gcd \text{gcd} gcd 的两个数 x , y x,y x,y,最终的答案为 m i n { d p [ x ] [ y ] + d p [ y ] [ x + n ] + gcd ( x , y ) } min\left\{dp[x][y] + dp[y][x+n]+\text{gcd}(x,y)\right\} min{dp[x][y]+dp[y][x+n]+gcd(x,y)}

时间复杂度: O ( n 3 ) O(n^3) O(n3)

G - That’s One Hanoi-ed Teacher

回忆最经典的汉诺塔问题,求解汉诺塔问题的函数为 hanoi ( n , a , b , c ) \text{hanoi}(n, a, b, c) hanoi(n,a,b,c),表示将 n n n 个盘子从 a a a 经过 b b b 移动到 c c c

其中 a a a 表示第一个柱子的编号, b b b 表示第二个柱子的编号, c c c 表示第三个柱子的编号。

我们可以分别将三个柱子建立队列,que[i] 表示第 i ( 1 ≤ i ≤ 3 ) i(1 \le i \le 3) i(1i3) 个柱子所对应的队列。编号大的盘子在队首。

对于每个 hanoi ( n , a , b , c ) \text{hanoi}(n, a, b, c) hanoi(n,a,b,c),都可以分成两个阶段 hanoi ( n − 1 , a , c , b ) \text{hanoi}(n - 1, a, c, b) hanoi(n1,a,c,b) hanoi ( n − 1 , b , a , c ) \text{hanoi}(n - 1, b, a, c) hanoi(n1,b,a,c) 去求解。

如果打表观察汉诺塔问题实现的具体过程的话,可以发现:

( 1 ) (1) (1) n n n 号盘子(即当前问题规模下的最大盘子)在 a a a 柱子下,则当前状态处在 hanoi ( n − 1 , a , c , b ) \text{hanoi}(n - 1, a, c, b) hanoi(n1,a,c,b) 阶段,此时我们可以发现,后面的 hanoi ( n − 1 , b , a , c ) \text{hanoi}(n - 1, b, a, c) hanoi(n1,b,a,c) 阶段需要 2 n − 1 2^{n-1} 2n1 步,直接加到答案中即可,然后递归求解 hanoi ( n − 1 , a , c , b ) \text{hanoi}(n - 1, a, c, b) hanoi(n1,a,c,b)

( 2 ) (2) (2) n n n 号盘子(即当前问题规模下的最大盘子)在 c c c 柱子下,则当前状态处在 hanoi ( n − 1 , b , a , c ) \text{hanoi}(n - 1, b, a, c) hanoi(n1,b,a,c) 阶段,此时无需考虑前一阶段,直接递归求解 hanoi ( n − 1 , b , a , c ) \text{hanoi}(n - 1, b, a, c) hanoi(n1,b,a,c) 即可;

( 3 ) (3) (3) n n n 号盘子(即当前问题规模下的最大盘子)在 b b b 柱子下,则当前状态不合法,直接输出 No

可以参考代码来具体理解整个过程,递归的过程可以从字面意思来进行理解。

时间复杂度: O ( n ) O(n) O(n)

H - Vin Diagrams

首先题意确定给出的数据一定是合法数据,所以我们可以分以下几个过程解决这个问题。

( 1 ) (1) (1) 将A圈找到并计算出这个圈内有多少格子。
( 2 ) (2) (2) 将B圈找到并计算出这个圈内有多少格子。
( 3 ) (3) (3) 将A圈B圈的交集找到并计算出这个圈内有多少格子。

注意A圈B圈搜索时要看AB在交集上还是在交集外,最好写一个函数用来计算给定圈的格子数,这样可以化简代码量。

时间复杂度: O ( n × m ) O(n×m) O(n×m)

I - Waif Until Dark

首先,建立源点与汇点。之后,源点与每个人建边,每个人与他所喜爱的糖果建边,每种糖果与它所属种类建边,每个种类与汇点建边,跑一遍 Dinic 即可。


2017, X Samara Regional Intercollegiate Programming Contest

Link: http://codeforces.com/gym/101341

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Streets of Working Lanterns - 2 模拟+排序 5 / 34 5/34 5/34 O
B Pursuing the Happiness 暴力 61 / 92 61/92 61/92 O
C Urn with Balls 分类讨论 50 / 70 50/70 50/70 O
D Jumps 数论 39 / 50 39/50 39/50 O
E Bonuses and Teleports 枚举 21 / 31 21/31 21/31 O
F Circuits 交互题 1 / 7 1/7 1/7 .
G I love Codeforces 模拟 57 / 70 57/70 57/70 O
H Perfect Ban 前缀和 33 / 48 33/48 33/48 O
I Matrix God 数学 6 / 13 6/13 6/13 Ø
J Catch the Monster 3 / 8 3/8 3/8 .
K Competitions DP+线段树 20 / 23 20/23 20/23 Ø
L High Probability Cast 0 / 6 0/6 0/6 .
M Last Man Standing 贪心 53 / 58 53/58 53/58 O

Competition process

开场 Nitrogens 开了 B 题题意,发现是个暴力,之后 biubiubiu 上去码了一会,处理了一会细节,17min1A

之后发现 D 题过题人数很多,就开了 Dbiubiubiu 一眼发现是个裴蜀定理的经典题,直接秒了,22min1A

之后 nitrogens 开了 C 题题意,然后 biubiubiuwalker 讨论了做法,walker 上去码了一会之后,测试了 biubiubiu 造的十多组数据,找到了一个 bug,之后交上去发现 WA23。之后 nitrogens 上去写 M 题,很快就写完了,交上去 52min1A。之后 walker 找到了 bug,改完之后又测试了 biubiubiu 造的数据,又发现一个 bug。后来又改了一下,交上去,59min2A。这个时候,nitrogensG 的题意告诉了 biubiubiubiubiubiu 想到了一个倒着做的做法,最后77min1A

之后 walkerH 的题意和做法告诉了 biubiubiu,但是biubiubiu 觉得这个做法比较难写,之后换了一个二维前缀和的做法,103min1A

之后,walker 开始码 Abiubiubiunitrogens 开始讨论 E 的做法。然后 walker 写完 A 之后交上去,WA45。之后发现一个 bug,改完之后还是 WA45。之后 biubiubiu 上去写 E,很快写完了,交上去 WA15。整个队伍开始自闭。

之后,walker 又发现了括号排序策略的问题,改了 cmp 函数,交上去 WA71,之后 biubiubiu 发现了 Ebug,改正之后 215min2A

最后,walker 又改了几次 cmp 函数,最后终于在 262min7A

在这期间,biubiubiu 搞了一个 I 的随机化做法,玄学过数据,但是一直不能 AC,这耽误了很多本来应该写 K 的时间。

walker 过了 A 之后,biubiubiu 上去写线段树,在中间某个时间发现要输出很多信息,这必须改线段树。调完之后,在最后一分钟过了样例,但是 CE,然后比赛结束!!

赛后发现线段树 WA12,也没那么遗憾了。只是如果 I 题不浪,K 是一定能过的。

update: K题WA12的原因是有个函数传参没开ll,爆炸!

都是教训啊!!!!

Problems Solution

签到题: BDGM

A - Streets of Working Lanterns - 2

首先处理单个字符串,用栈模拟括号匹配过程,化简字符串。之后只剩(,)(, )这三种形式的字符串,
排序首先第一层判断是哪种字符,顺序跟上面写的一样。之后)((((()))))(前面,对于同样是)(((()少的在前面。对于同样是))))((多的在前面。这是一个对称的过程。最后模拟一下括号匹配,看是不是成立。

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

B - Pursuing the Happiness

WA点:

  • 不能使用排序来将相同的字符聚合到一起,可以使用 vector 分别存储每个字母出现的位置。
  • 交换字符位置的时候,不要卡在 happiness 的左右边界。
C - Urn with Balls

首先nm取一个小值,然后判断未知球加对应颜色的已知球是不是小于小值,若小于则是判断未知加另一个颜色球是不是小于大值,若小于答案是a+b+c,否则是大值。若不小于小值,答案就是小值。

时间复杂度: O ( 1 ) O(1) O(1)

E - Bonuses and Teleports

分析题意,即可知道对于每两个连续的关键点单独讨论,一定是到达它们之间的某个点之后返回左关键点,传送到右关键点,之后走剩下的点,我们只需要对每个区间枚举即可,注意第一个区间和最后一个区间特判。

WA点:

  • 如果最外层枚举必须经过的点的话,需要处理很多你想不到的细节,因此不能这么写;
  • 一定要考虑到每段区间内的第一个必经点与区间左侧端点的二倍距离以及最后一个必经点与区间右侧端点的二倍距离这两个值的贡献。

时间复杂度: O ( n + m ) O(n+m) O(n+m)

H - Perfect Ban

枚举要删除的行和列,通过二维前缀max计算出四个矩形内的最大值即可。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

K - Competitions

dp[i]表示以第i个区间为最后一个任务的最大价值,之后肯定是在第i个区间的l之前找一个可以转移的价值最大的区间进行转移,这个过程用线段树优化一下即可。

WA点:

  • 区间必须先进行排序,才能进行下一步的dp,否则就是 Wrong Answer
  • 单点更新线段树的节点时,必须先判断原有的值是否更优。

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

I - Matrix God

随机出一个1n列的矩阵D,根据矩阵乘法的结合率,通过判断A×B×D=C*D,由于矩阵乘法的耦合性很强,所以如果结果相等那么合法的可能性很大,每次随机复杂度是1e6,所以我们可以随机10次,如果都满足则输出YES,否则输出NO。

时间复杂度: O ( 10 × n 2 ) O(10×n^2) O(10×n2)


2014 Nordic Collegiate Programming Contest

Link: http://codeforces.com/gym/100502

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Amanda Lounges 二分图染色 33 / 76 33/76 33/76 Ø
B Basin City Surveillance 2 / 35 2/35 2/35 .
C Catalan Square 递推+Java高精度 108 / 160 108/160 108/160 O
D Dice Game 枚举 251 / 255 251/255 251/255 O
E Opening Ceremony 枚举 175 / 243 175/243 175/243 O
F Particle Swapping 2 / 5 2/5 2/5 .
G Outing 缩点+DP 32 / 57 32/57 32/57 O
H Clock Pictures 最小表示法 56 / 167 56/167 56/167 O
I How Many Squares? 计算几何+枚举 15 / 28 15/28 15/28 !
J Road Work 7 / 12 7/12 7/12 .
K Train Passengers 细节题 242 / 253 242/253 242/253 O

Competition process

开场由于看错榜,发现 C 题很快有人通过,于是 biubiubiuwalker 开了 C 题,这时发现 D 也有人通过,然后 nitrogens 开了 D。这时 biubiubiuwalker 发现 C 题需要高精度,于是暂时放弃。这时 D 题题意读完,之后 biubiubiu 开始去码 D,很快 18min1A。这时 nitrogens 开了 E 题题意,与其他两个人确认做法之后,很快码完,29min1A。这时 biubiubiu 上机敲了高精度的板子,walkernitrogens 讨论 K 题。然后 biubiubiu 开始打表,其他两人也讨论完了 K。打表的同时,nitrogens 上机敲了 K53min1A。这时,biubiubiu 发现 H 题做过,直接上去写,由于最小表示法的板子出了一些问题,导致 77min1A。之后发现 C 打表很慢,于是尝试用 Java 写,按照题目中给的 O ( n 2 ) O(n^2) O(n2) 的做法,交上去 RE,原因是非法访问内存。之后在 CFCustom Innovation 中测试之后,交上去,TLE。之后 walker 上机开始敲 A,过了一会,biubiubiu 想出了 O ( n ) O(n) O(n) 的做法,但是由于精度太大,运算时间过慢,导致 TLE6。之后 walker 继续敲 A,然后 biubiubiunitrogens 开了 G 题题意,得到了一个看起来很对的做法。biubiubiu 在纸上写下了细节。之后 nitrogens 发现板子中有精度更低的 C的做法,上去写,177min3A。之后 biubiubiunitrogens 开了 I 题的题意,又很快得到了做法,并且在纸上大概实现,等待机时上机。这时,walker 写完了 A,用 nitrogens 造的数据开始测试,但是中间一直有 BUGbiubiubiuwalkerBUG 期间,断断续续写完了 G 题,调试通过之后,手出了很多数据,中间改了一个初始化细节,交上去 274min1A。之后,walker 继续调 Abiubiubiu 在纸上写 I 题代码,大概写好之后,占用一半屏幕上机,然后 walker 调出了 BUG,交上去没看结果,biubiubiu 继续敲 I,但是有一个细节 biubiubiu 没有在纸上实现,导致时间来不及写完,这时回头看 A 的结果,发现 WA 了,比赛结束。

UPDATED: 赛后发现 ABUG 出在一个很小的地方,之后一发通过,难过~~


Problems Solution

签到题: DEK

A - Amanda Lounges

首先对于确定的点先给一个状态,1表示不建基站,2表示建基站。然后我们跑一边dfs,这个可以将所有能够确定状态的点给出来,并且判断是不是合法的。之后我们将所有没确定状态的点给一个编号,相同编号表示这些点互相可达。然后在每个互相可达的点组成的图上跑一边dfs,这样能够确定图是不是可以染色,然后给出来可以染色的染色点的数量,之后用 m i n ( c n t [ i ] − s u m , s u m ) min(cnt[i]-sum,sum) min(cnt[i]sum,sum)确定编号为i的图上最小的染色数,然后将所有编号不同的图上的最小染色数加起来就时最后的答案。 中间有几次判断是否可行,如果不可行输出impossible,否则就是最后答案。

时间复杂度: O ( n ) O(n) O(n)

C - Catalan Square

根据递推式: C a t a l a n ( n ) = C a t a l a n ( n − 1 ) × 4 n − 2 n + 1 Catalan\left( n \right) =Catalan\left( n-1 \right) \times \frac{4n-2}{n+1} Catalan(n)=Catalan(n1)×n+14n2
即可在精度不太高的情况下得到结果,不然精度太高会导致运算过慢。

时间复杂度: O ( n ) O(n) O(n)

H - Clock Pictures

首先将原数组排序差分之后得到差分结果,之后对两个差分结果分别最小表示法,判断是否相同即可。

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

G - Outing

将图分成不同的联通块之后,每个联通块上是一颗有向的基环树,我们注意到基环树的根一定是这个环,于是将一个环缩点,缩点后题目转换为对于每个联通图我们有一个可选的范围, 范围为:[环上点的个数,联通块内总点数],最后凑出的总数要小于k而且最大,这是经典的分组背包问题,DP求解即可。

时间复杂度: O ( n k ) O(nk) O(nk)


The 19th Zhejiang University Programming Contest Sponsored by TuSimple (Mirror)

Link: http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=391

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Thanks, TuSimple! 贪心 648 / 3353 648/3353 648/3353 O
B Even Number Theory 数论 362 / 1175 362/1175 362/1175 O
C Robot Cleaner I 有限状态模拟 233 / 1683 233/1683 233/1683 O
D Robot Cleaner II 22 / 641 22/641 22/641 .
E Potion 签到题 1248 / 4252 1248/4252 1248/4252 O
F Strange Function 1 / 83 1/83 1/83 .
G Postman 贪心 593 / 2213 593/2213 593/2213 O
H Rescue the Princess 连通分量+LCA 31 / 582 31/582 31/582 Ø
I Defense Plan 15 / 91 15/91 15/91 .
J Extended Twin Composite Number 签到题 942 / 3902 942/3902 942/3902 O

Competition process

开场发现 E 有人通过,发现是个签到题,biubiubiu 上去很快码完,8min1A。之后发现 J 也是个水题,15min1A
之后 biubiubiuwalker 开了 A题,nitrogens 去开了 G 题。之后 biubiubiu 上去写 A33min1A。之后,biubiubiu 得到了 G 的题意,发现可以贪心,然后 walker 造了一些数据,biubiubiu 写完之后,测试了数据,全都没有问题,交上去 62min1A。这时 nitrogens 已经写好了 B 题的伪代码,biubiubiu 又开始用 Code::BlocksJava,写好之后,在 CF 上面调试了一下,72min1A。之后,发现之后 C 题过的人很多,于是 3 3 3 个人一起开 C 题,得到了一个假做法,biubiubiu 敲完之后总感觉哪里不对,一直不敢交。后来 biubiubiu 发现了可以 Hack 这个做法的数据,于是改变做法,想出了一个更可靠,而且看起来就很对的做法,140min1A。之后全队去搞 H 题,walker 想到了一个做法,最后需要处理一个东西,biubiubiu 发现这个东西可以用 LCA 处理出来,于是 walker 开始敲,biubiubiu 在一旁盯着,按照步骤一步一步执行之后,在还有 10min 的时候调过了样例,又测试了 nitrogens 造的数据,发现一处 BUG,改正之后交上去,得到了 WA,比赛已经结束。然后发现根本没有调用 LCA 的预处理函数,鬼知道怎么过的所有数据。改正之后,还没有交上去,但是做法和通过的人的做法已经基本一致。难过~~


Problems Solution

签到题: EJ

A - Thanks, TuSimple!

首先把两个数组分别拆为两组,对于第一个数组每个想找更小的元素的数字,找第二个数组中想找更大的元素的元素中最小的那个,对于第一个数组中想找更大的元素的数字,找第二个数组中想找更小的元素中最小的而且大于当前数字的那个。用set维护查找和删除即可。

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

C - Robot Cleaner I

首先我们要知道的是,这个题目中有效的游戏步数很少,因为有很多种情况会导致游戏结束或者出现死循环,于是大胆猜测可以直接模拟,但是要用一个数组维护上一次到达某个点的答案为多少,如果两次到达某个点答案相同,则说明出现死循环,直接跳出即可,其他直接游戏结束的情况特判即可(例如持续撞墙,原地踏步)。

时间复杂度: O ( n ∗ m ) O(n*m) O(nm)

G - Postman

对于左右两段分别贪心的考虑即可,我们一定选最远的k个最后走,因为可以不再回来,之后每k个点一起送信即可。

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

H - Rescue the Princess

一共n个点,m个边。可能会有重边和自环,读入的时候处理一下自环就好。然后在整个图上跑tarjan,跑出来所有的联通分量(联通分量之间通过桥连接),并且因为原图没有保证图联通,所以需要跑多次tarjan,最后将所有连通分量缩点并重新分配一个序号,然后通过桥重新建多个树。给出每个序号所属于的树。之后就是查询过程,首先判断每个点在缩点之后所属于的序号是不是在同一个树中,不是就是输出No。然后在一个树中需要判断u和v,或者u和w是不是在一个序号中,如果在一个序号中就是Yes,不成立就分几步判断,首先 ,uv=lca(u,v),uw=lca(u,w),vw=lca(v,w)

  1. uv=u时 如果vw==u&uw==u 成立 ,否则如果uw!=u成立 否则不成立
  2. uv=v时 如果uw=u成立 , 否则不成立
  3. uv!=u&uv !=v 时 如果uw=u成立 ,否则不成立

2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015)

Link: 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015)

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Adjoin the Networks 树形DP+贪心 44 / 91 44/91 44/91 O
B Bell Ringing 递归 33 / 69 33/69 33/69 Ø
C Cryptographer’s Conundrum 签到题 315 / 317 315/317 315/317 O
D Disastrous Downtime 贪心 245 / 312 245/312 245/312 O
E Entertainment Box 贪心+Multiset优化 35 / 117 35/117 35/117 O
F Floppy Music DP 63 / 113 63/113 63/113 O
G Goblin Garden Guards 二维差分+滚动数组优化 83 / 245 83/245 83/245 O
H Hero Power 2 / 3 2/3 2/3 .
I iCar 0 / 12 0/12 0/12 .
J Just a Quiz 期望 10 / 20 10/20 10/20 .

Competition process

开场 nitrogenswalker 开了 A 题,后来马上发现 C 是签到题,转头扫了一下 C 的题意,biubiubiu 上去把这道题直接秒了,5min1A。然后发现 D 也有人过了,biubiubiu 想了想,最初往二分的方向想,但是无果。后来 biubiubiu 想到一种贪心策略特别合理,于是上去码,交上去 17min1A。之后 walker 发现 A 可做,于是上去写 A,然后写了一会之后测了几个数据,发现没有问题,交上去 WA5。之后 nitrogensbiubiubiu 发现 E 是个做过的经典套路题,biubiubiu 上机去码,处理了一些细节之后交上去,68min1A。这时 walker 在纸上改好了 A 题的代码,写了一会交上去,87min2A。之后发现 G 可做,于是 biubiubiu 上去写了一个预处理,然后 nitrogens 上去写了二维差分,但是过不了样例,检查了很久,发现差分有问题,改正之后过了样例,交上去 WA11biubiubiu 发现还有一些矩形没有处理,处理之后交上去 WA12。这时,才想起来 short int 存不下,于是想了很久,发现可以滚动数组优化,交上去,WA1。大家都以为第一组是样例,于是以为是 RE,但是怎么找也找不到错误,于是加了强制类型转换,发现还是 WA1biubiubiu 想了一会,发现初始状态的定义有问题,改正之后,交上去,195min4A。之后,walkerbiubiubiu 讲了 F 题化简之后的题意,biubiubiu 发现可以正向 dp,于是直接上去写,过了很多数据,交上去,216min1A。之后,全队开始搞 B,但是大家的方向都是找规律,一个多小时也没弄出来,赛后用递归的方法去想,很快就得到了答案。


Problems Solution

签到题: CDE

A - Adjoin the Networks

由于求最终的直径,可以把每棵树看成一条长度为直径的链,那么肯定是选择一棵直径最长的链,之后依次连接中点最优。

时间复杂度: O ( n ) O(n) O(n)

B - Bell Ringing

考虑长度为n的排列已经计算好,我们只需要在每个排列从后往前依次插入n+1,之后再把排列变为下一个排列,从前往后依次插入n+1,循环这个过程即可,用vector的insert可以优化代码量。

时间复杂度: O ( n ! ) O(n!) O(n!)

F - Floppy Music

dp[i][j]表示i时刻是否可能在j位置,之后正向转移即可。

时间复杂度: O ( f ∗ n ∗ t ) O(f*n*t) O(fnt)

G - Goblin Garden Guards

二维前缀和,注意用滚动数组优化内存即可。


The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple

Link: The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Vertices in the Pocket 图论 14 / 85 14/85 14/85 !
B Element Swapping 数学+思维 106 / 1377 106/1377 106/1377 O
C Array in the Pocket 构造 32 / 318 32/318 32/318 Ø
D Traveler 11 / 42 11/42 11/42 .
E Sequence in the Pocket 思维 508 / 2197 508/2197 508/2197 O
F Abbreviation 签到题 973 / 1404 973/1404 973/1404 O
G Lucky 7 in the Pocket 签到题 996 / 1334 996/1334 996/1334 O
H Singing Everywhere 前缀和 700 / 1701 700/1701 700/1701 O
I Fibonacci in the Pocket 规律+前缀和 842 / 1722 842/1722 842/1722 O
J Welcome Party 优先队列+BFS 202 / 2575 202/2575 202/2575 O
K Strings in the Pocket Manacher 112 / 908 112/908 112/908 O
L Square on the Plane 0 / 54 0/54 0/54 .
M Trees in the Pocket 0 / 10 0/10 0/10 .

Competition process

开场发现 G 题是签到题,于是直接开写,4min1A。之后发现 F 也是签到题,biubiubiu 上机敲,9min1A。之后发现了 I 题的规律,16min1A。之后 walkerbiubiubiu 叙述了 E 题的一种做法,但是 biubiubiu 发现这个做法很难写,于是重新想了一种,42min1A。之后发现 H 就是一个前缀和,59min1A。之后 biubiubiu 发现 J 题在 CF 上做过,于是继续写 J,之后由于递归层数太多,Stack Overflow。然后改成非递归并查集做法,发现 WA,以为是有一处题意理解错误,改正之后还是 WA。之后发现是并查集的板子抄错了,然后继续交,继续 WA。改成第一个题意之后,170min7A。这期间,nitrogens 已经推出 B 题的公式和做法,上去敲,由于复杂度问题,biubiubiu 提出了枚举因子的做法,并上去开始写,写完发现 WA,发现 0 0 0 的情况要特判,交上去,还是 WA,又发现一些需要特判的点,WA 了很多次,还发现中间值可能会爆 long long,但是还是 WA。最终发现枚举因子之后忘记排序,改正之后交上去 242min6A。在很久之前,biubiubiu 已经想到了 K 题的做法,但是由于 BJ 都卡着,一直没有机会写。B 过掉之后,biubiubiu 上去写 K,很快写完,并通过了 nitrogens 造的很多数据,交上去 269min1A。之后,walker 得到了 A 的做法,并上去敲,中间 biubiubiu 写了个线段树维护,但是最后由于细节太多,A 题没有调出来,赛后发现 C 其实更简单,如果分开搞两个题,有可能还能多做出一题。


Problems Solution

签到题: EFGHI

B - Element Swapping

根据题意,

x = ∑ k = 1 n k a k  and  y = ∑ k = 1 n k a k 2 x=\sum_{k=1}^{n}ka_k \text{ and } y=\sum_{k=1}^{n}ka_k^2 x=k=1nkak and y=k=1nkak2

A = ∑ k = 1 n k b k  and  B = ∑ k = 1 n k b k 2 A=\sum_{k=1}^{n}kb_k \text{ and } B=\sum_{k=1}^{n}kb_k^2 A=k=1nkbk and B=k=1nkbk2

设交换的元素为 a k 1 a_{k_1} ak1 a k 2 a_{k_2} ak2,则 b k 1 = a k 2 b_{k_1}=a_{k_2} bk1=ak2 b k 2 = a k 1 b_{k_2}=a_{k_1} bk2=ak1

我们发现, A − x A-x Ax B − x B-x Bx 仅与 a k 1 a_{k_1} ak1 a k 2 a_{k_2} ak2 有关。

由上面的信息,可以推导出

A = ( k 1 − k 2 ) ( b k 1 − b k 2 ) A=(k_1-k_2)(b_{k_1}-b_{k_2}) A=(k1k2)(bk1bk2)

B = ( k 1 − k 2 ) ( b k 1 2 − b k 2 2 ) B=(k_1-k_2)(b_{k_1}^2-b_{k_2}^2) B=(k1k2)(bk12bk22)

因此,在不考虑特殊情况的条件下,我们可以枚举起点 k 1 k_1 k1 A A A 的因子 d d d,则显然 k 2 = k 1 + d k_2=k_1+d k2=k1+d,设据此算出的 A A A 值和 B B B 值分别为 A ′ A' A B ′ B' B,则只要满足 A = A ′  and  B = B ′ A=A' \text{ and } B=B' A=A and B=B,答案加 1 1 1

现在考虑特殊情况:

( 1 ) (1) (1) A A A B B B 中有且仅有一个等于 0 0 0,则答案不存在;

( 2 ) (2) (2) A A A B B B 的正负性不同,则答案不存在;

( 3 ) (3) (3) ∣ A ∣ |A| A 不能整除 ∣ B ∣ |B| B,则答案不存在;

( 4 ) (4) (4) A A A B B B 同时为 0 0 0,则表明当 k 1 ≠ k 2 k_1 \ne k_2 k1̸=k2 时满足 b k 1 = b k 2 b_{k_1}=b_{k_2} bk1=bk2,将 b b b 数组排序后,对于每一段连续数字,设其长度为 l e n len len,则答案加上 l e n ( l e n − 1 ) 2 \frac{len(len-1)}{2} 2len(len1)

注意在开始,将 A A A 初始化为 − x -x x,将 B B B 初始化为 − y -y y,以防止溢出。

若还是溢出,则表明答案不存在。

时间复杂度: O ( T ⋅ ( 1 0 10 + n log ⁡ 1 0 10 ) ) O(T \cdot (\sqrt {10^{10}} + n \log 10^{10})) O(T(1010 +nlog1010))

C - Array in the Pocket

先统计每个数字 x x x 的出现次数 c n t x cnt_x cntx

max ⁡ ( c n t x ) > n 2 \max{(cnt_x)} > \frac{n}{2} max(cntx)>2n,则根据鸽巢原理,一定不可能有合法的构造,否则答案一定存在。

否则,将所有出现过的数字放入一个 set /multiset 中,之后从左到右安排每一个数字 b i b_i bi,原则上将 set 中最小的数字放入到 b i b_i bi 中,若冲突,则放次小的数字。之后,这种数字的数量减 1 1 1。若数量减为 0 0 0,则将这种数字从 set 中删掉。在最后的时候,set 中只剩下一种数字,此时记录第一个出现这种情况的位置 p o s pos pos,并将后面的数字都填上 set 中仅剩的这种数字。

之后,在 p o s pos pos 之前,寻找可以放入 b [ p o s ] b[pos] b[pos] 的所有位置,按照从后往前的顺序,加入到名为 vevector 中。之后,从 n n n p o s pos pos 遍历 i i i,交换 b [ i ] b[i] b[i] 和相应的前面位置的 b b b 元素进行交换。

这样就保证了 b b b 中的每个元素都与相应位置的 a a a 元素不同。

但是,还不能完全保证字典序最小。

因此,对于 a a a 中每种出现的数字(可对应多个位置),将其 b b b 中对应位置的所有数字放入到相应的 vector 中。之后对所有的 vector 进行排序,最后将排好序的 vector 内的数字按顺序恢复到相应的位置中,就可得到字典序最小的答案。

时间复杂度: O ( T ⋅ n log ⁡ n ) O(T\cdot n \log n) O(Tnlogn)

J - Welcome Party

a a a b b b 的朋友关系可以视作无向边 ( a , b ) (a,b) (a,b),每次建边,都在并查集中将 a a a b b b 合并。

所有的边都建立完成之后,可以发现对于每一个集合,仅有一个人不开心,这个人进入之后,跟他建边的人都可以进入,以此类推,最后每个集合的人都能进入。

因此,不开心的人数为集合的数量。

最后,我们可以用一优先队列,来处理字典序最小的进入顺序。

需要注意的是,本题的并查集需要使用非递归写法,否则会 Stack Overflow

时间复杂度: O ( T ⋅ ( m α ( n ) + ( n + m ) log ⁡ n ) ) O(T \cdot (m \alpha(n) + (n+m) \log n)) O(T(mα(n)+(n+m)logn))

K - Strings in the Pocket

s s s t t t 最左侧第一个不同的位置为 l l l,最右侧最后一个不同的位置为 r r r

l l l r r r 均存在,

如果 s [ l . . . r ] s[l...r] s[l...r] 不等于 t [ r . . . l ] t[r...l] t[r...l],则答案不存在。

否则暴力枚举 s [ 1... l − 1 ] s[1...l-1] s[1...l1] s [ r + 1... n ] s[r+1...n] s[r+1...n] 拼接而成的字符串中回文子串的数量,此数量加 1 1 1 即为答案。

l l l 不存在,则 r r r 不存在,直接使用 Manacher 算法求出 s s s 的回文字串数量,这个数量就是答案。

时间复杂度: O ( T ⋅ n ) O(T\cdot n) O(Tn)


2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)

Link: 2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Artwork 并查集 17 / 66 17/66 17/66 O
B Bless You Autocorrect! Trie树+BFS 12 / 32 12/32 12/32
C Card Hand Sorting 暴力 23 / 36 23/36 23/36 O
D Daydreaming Stockbroker 签到题 182 / 226 182/226 182/226 O
E Exponial 欧拉降幂 3 / 25 3/25 3/25 O
F Fleecing the Raffle 概率 68 / 111 68/111 68/111 O
G Game Rank 模拟 217 / 256 217/256 217/256 O
H Highest Tower 3 / 17 3/17 3/17 .
I Interception 0 / 4 0/4 0/4 .
J Jumbled Compass 签到题 266 / 269 266/269 266/269 O
K Keeping the Dogs Apart 双指针+计算几何 11 / 32 11/32 11/32 Ø

Competition process

开场发现 E 题和 J 题有人通过,于是 biubiubiu 去写 J 题,然后 12min1A。之后 biubiubiu 继续写 D 题,39min1A。之后 walker 开了 G 题题意,发现是个小模拟,于是 biubiubiu 开始写 G,因为题意没有完全弄透,导致 WA 了两次,最后还因为一个小细节又 WA 一次,耽误很多时间,最后 91min3A。在此期间,walkernitrogens 叙述了 A 题的做法,G 题通过之后 walker 上去写 A 题。在此期间,biubiubiunitrogens 开了 EFnitrogens 推出了一个 F 题的公式,biubiubiu 发现暴力枚举应该就可以算出精度范围内的答案,于是一起去开 Ebiubiubiu 灵光一闪,发现这不就是欧拉降幂吗!! log ⁡ \log log 次计算便可得出答案。于是准备上机写。这时候 walker 写完了 A,但是有 Bug,于是biubiubiu 上去写 F,写好之后发现 Codeforces 崩了,于是换 nitrogens 上去写 E,三个题都写好了,也过了一个多小时,CF 终于好了,于是三个题一起交上去,得到 2*WA+1*TLE,于是改了一下 F 暴力枚举的范围,交上去又 TLE,又改小了一点,169min3A。之后开始改 E,刚才的 WA 是由于边界问题,改好之后交上去还是 WA,这时发现是欧拉降幂的条件弄错了,但是又不知道怎么好判断一些,biubiubiu 想出了一个暴力计算小数据的方法,改好之后,交上去,193min3A。这时,walker 也找到了 A 的 Bug,只是一处小地方弄错了,交上去,WA1,原因是 freopen 没删,再交上去 207min5A。这期间,biubiubiu 发现 C 题就是个暴力,于是上去写,由于一个小地方写错了,RE 了一发,又由于一个小地方写错,WA 了一发,终于在 241min3A。之后 walker 上去写 B 题,biubiubiunitrogens 在下面讨论 K 题的做法,发现 two pointers + 三分即可,于是在纸上写好代码之后,上去写,直接过样例,交上去 TLE on test 8,改改精度,TLE18,之后不断改精度,但一直在 WATLE 之间徘徊,赛后才发现三分是可以优化到 O ( 1 ) O(1) O(1) 的,但是由于太着急,没想到这里,于是比赛结束。


Problems Solution

签到题: DGJ

A - Artwork

首先把两个数组分别拆为两组,对于第一个数组每个想找更小的元素的数字,找第二个数组中想找更大的元素的元素中最小的那个,对于第一个数组中想找更大的元素的数字,找第二个数组中想找更小的元素中最小的而且大于当前数字的那个。用set维护查找和删除即可。

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

C - Card Hand Sorting

对四种牌的顺序和升降进行全排列,分别对给定序列求LCS即可。

时间复杂度: O ( 52 ∗ 52 ∗ 4 ! ∗ 2 4 ) O(52*52*4!*2^4) O(52524!24)

E - Exponial

对于一个数 n n n,对其进行 log ⁡ \log log φ \varphi φ 函数,就可以将它变成 1 1 1

考虑欧拉降幂公式:

若正整数 a , n a,n a,n 互质,则对于任意正整数 b b b,都有 a b = a b  mod  φ ( n ) ( mod  n ) a^b=a^{b \text{ mod }\varphi(n)}(\text{mod }n) ab=ab mod φ(n)(mod n)

若正整数 a , n a,n a,n 不一定互质且 b > φ ( n ) b > \varphi(n) b>φ(n) 时,有 a b = a b  mod  φ ( n ) + φ ( n ) ( mod  n ) a^b=a^{b \text{ mod }\varphi(n) + \varphi(n)}(\text{mod }n) ab=ab mod φ(n)+φ(n)(mod n)

f ( n ) = n ( n − 1 ) ( n − 2 ) . . . 2 1 f(n)=n^{(n-1)^{(n-2)^{...^{2^{1}}}}} f(n)=n(n1)(n2)...21,则 f ( n ) = n f ( n − 1 ) f(n)=n^{f(n-1)} f(n)=nf(n1)

因此

f ( n ) m o d    n = { n f ( n − 1 ) m o d    φ ( m ) , gcd ⁡ ( n , m = 1 ) n f ( n − 1 ) m o d    φ ( m ) + φ ( m ) , f ( n − 1 ) < φ ( m ) f(n) \mod n= \left\{ \begin{array}{c} n^{f(n-1) \mod \varphi(m)} ,\gcd(n, m=1) \\ n^{f(n-1)\mod \varphi(m) + \varphi(m)},f(n-1)<\varphi(m) \end{array} \right. f(n)modn={nf(n1)modφ(m),gcd(n,m=1)nf(n1)modφ(m)+φ(m),f(n1)<φ(m)

对于 n ∈ [ 1 , 4 ] n \in [1,4] n[1,4] 的情况,直接 O ( 1 ) O(1) O(1) 得到其值:

f ( 1 ) = 1 f(1)=1 f(1)=1 f ( 2 ) = 2 f(2)=2 f(2)=2 f ( 3 ) = 9 f(3)=9 f(3)=9 f ( 4 ) = 262144 f(4)=262144 f(4)=262144

其他情况,上述条件之一一定满足,直接递归求解即可。

注意判边界条件,不要忘记取模。

时间复杂度: O ( log ⁡ n ⋅ n ) O(\log n\cdot \sqrt n ) O(lognn )

F - Fleecing the Raffle

无论自己的卡片放多少张 ,自己最多被抽中一次。

设自己的卡片放了 x x x 张,我们要计算的是自己被恰好抽中一次的概率。

一共要抽 p p p 次,因此可以考虑枚举自己是在第几轮被抽中的,最后可以发现,无论自己在哪轮被抽中,概率都是

x n + x ⋅ n n + x − 1 ⋅ n − 1 n + x − 2 ⋅ . . . ⋅ n − ( p − 2 ) n + x − ( p − 1 ) \begin{aligned} &\frac{x}{n+x}\cdot \frac{n}{n+x-1} \cdot \frac{n-1}{n+x-2}\cdot ... \cdot \frac{n-(p-2)}{n+x-(p-1)} \\ \end{aligned} n+xxn+x1nn+x2n1...n+x(p1)n(p2)

根据加法原理,总的概率为

P ( x ) =   p ⋅ x n + x ⋅ n n + x − 1 ⋅ n − 1 n + x − 2 ⋅ . . . ⋅ n − ( p − 2 ) n + x − ( p − 1 ) =   p ⋅ x ⋅ n ! ( n + x ) ! ⋅ ( n + x − p ) ! ( n − p + 1 ) ! =   p ⋅ x ⋅ ( n − p + x ) ⋅ ( n − p + x − 1 ) ⋅ . . . ⋅ ( n − p + 2 ) ( n + x ) ⋅ ( n + x − 1 ) ⋅ . . . ⋅ ( n + 2 ) ⋅ ( n + 1 ) = p ⋅ x n + 1 ⋅ ( n − p + x ) ⋅ ( n − p + x − 1 ) ⋅ . . . ⋅ ( n − p + 2 ) ( n + x ) ⋅ ( n + x − 1 ) ⋅ . . . ⋅ ( n + 2 ) \begin{aligned} P(x)=&\ p \cdot \frac{x}{n+x}\cdot \frac{n}{n+x-1} \cdot \frac{n-1}{n+x-2}\cdot ... \cdot \frac{n-(p-2)}{n+x-(p-1)} \\ =&\ p \cdot x \cdot \frac{n!}{(n+x)!} \cdot \frac{(n+x-p)!}{(n-p+1)!} \\ =& \ p\cdot x \cdot \frac{(n-p+x)\cdot(n-p+x-1)\cdot...\cdot(n-p+2)}{(n+x)\cdot(n+x-1)\cdot...\cdot(n+2)\cdot(n+1)} \\ =& \frac{ p\cdot x}{n+1}\cdot \frac{(n-p+x)\cdot(n-p+x-1)\cdot...\cdot(n-p+2)}{(n+x)\cdot(n+x-1)\cdot...\cdot(n+2)} \end{aligned} P(x)==== pn+xxn+x1nn+x2n1...n+x(p1)n(p2) px(n+x)!n!(np+1)!(n+xp)! px(n+x)(n+x1)...(n+2)(n+1)(np+x)(np+x1)...(np+2)n+1px(n+x)(n+x1)...(n+2)(np+x)(np+x1)...(np+2)

可以发现,

g ( x ) = ( n − p + x ) ⋅ ( n − p + x − 1 ) ⋅ . . . ⋅ ( n − p + 2 ) ( n + x ) ⋅ ( n + x − 1 ) ⋅ . . . ⋅ ( n + 2 ) g(x)= \frac{(n-p+x)\cdot(n-p+x-1)\cdot...\cdot(n-p+2)}{(n+x)\cdot(n+x-1)\cdot...\cdot(n+2)} g(x)=(n+x)(n+x1)...(n+2)(np+x)(np+x1)...(np+2)
可以 O ( x ) O(x) O(x) 地求出来,且可从 g ( x − 1 ) g(x-1) g(x1) 递推出来。

因此我们先计算 P ( 1 ) P(1) P(1),之后从 2 2 2 1 0 6 10^6 106 递推求出 P ( x ) P(x) P(x),对最终答案取 max ⁡ \max max 即可。

时间复杂度: O ( 1 0 6 ) O(10^6) O(106)

2010-2011 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2010)

Link: 2010-2011 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2010)

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Artwork 并查集 O
B Bless You Autocorrect! Trie树+BFS
C Card Hand Sorting 暴力 O
D Daydreaming Stockbroker 签到题 O
E Exponial 欧拉降幂 O
F Fleecing the Raffle 概率 O
G Game Rank 模拟 O
H Highest Tower .
I Interception .
J Jumbled Compass 签到题 O
K Keeping the Dogs Apart 双指针+计算几何 Ø

Competition process

开局发现 F 是签到题,biubiubiu 上去敲,6min1A

这时 nitrogens 开完了 A 题题意,nitrogens 提出可用拓扑排序来做,但是 biubiubiu 发现一种记忆化搜索的做法更好写,于是 30min1A

之后在 D 题的题意上面周旋了一会,最后确定做法后发现比 A 题更加简单,nitrogens 上去敲,很快 44min1A

之后 biubiubiu 想到一种 B 题的做法:让一对点通过曼哈顿距离直接到达,另一对点 BFS,但是由于特殊情况太多,感觉写起来很复杂,于是放弃这个做法。之后发现数据范围很小,有可能是最小费用最大流,于是 nitrogens 上去写 Bbiubiubiu 去开 E 题。

过了一会,nitrogens 写完了 B,发现样例过不去,在确认模板没有问题之后,发现建图好像也没有问题。后来通过 debug 发现在查找增广路时,走了一条回边,而当时的 nitrogens 的潜意识里面认为这个回边是不走的,于是无论如何也想不出办法来,只好放弃。

这时两个人开始想 E 的做法,找规律发现了一堆并不成立的规律,biubiubiu 上去写,但写完的时候比赛已经结束,交上去 WA 了。后来看了题解发现做法假了。比赛结束。


Problems Solution

签到题: ADF

I - Statisticians

先预处理出二维前缀和。

注意到题目要求答案保留三位小数,而答案最大不超过 O ( 1 0 4 ) O(10^4) O(104) 的量级,因此可以考虑将答案乘上 1000 1000 1000 来进行存储。

暴力枚举矩形的长和宽,对于不符合题意的情况直接跳过,对于符合题意的情况,枚举矩形的左上角坐标,将当前矩形的答案乘上 1000 1000 1000 之后存入一个桶中。

最后通过桶排获取中位数,即为答案。

时间复杂度: O ( w 2 h 2 + 1 0 7 ) O(w^2h^2 + 10^7) O(w2h2+107)

B - Connect

首先进行猜想,一定可以通过先让一对点以最短距离到达,之后把这个路径设为墙,让另一对点再通过bfs到达。

由于矩形有边界,所以第一对点也需要通过bfs处理到达。但是我们不确定先走第一对点还是第二对点,于是枚举两次,答案取min即可。

时间复杂度: O ( n ∗ m ) O(n*m) O(nm)


2011-2012 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2011)

Link: 2011-2012 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2011)

Problems

题号 题目名称 题目类型 AC/Submit 状态
A Artwork 并查集 O
B Bless You Autocorrect! Trie树+BFS
C Card Hand Sorting 暴力 O
D Daydreaming Stockbroker 签到题 O
E Exponial 欧拉降幂 O
F Fleecing the Raffle 概率 O
G Game Rank 模拟 O
H Highest Tower .
I Interception .
J Jumbled Compass 签到题 O
K Keeping the Dogs Apart 双指针+计算几何 Ø

Competition process

开场 biubiubiu 去敲头文件,这时 nitrogens 发现 A 是经典的非降路径问题,将做法告诉 biubiubiubiubiubiu 马上开始写,很快写完,16min1A。这时发现 C 才是真正的签到题,在 A 通过之后 nitrogens 马上上机,最后 20min1A。(小失误,应该先去做 C 才对)这时 biubiubiu 开了 E 题题意并得到了一种做法,上机去敲。同时 nitrogens 去开 D 题题意,后期给 E 出了几组测试数据,最后 E45min1Anitrogens 一直按照数学的思维去想 D 题,迟迟得不到做法,这时 biubiubiu 发现只需要记忆化 BFS 即可完成,于是马上上机去敲,54min1A。马上 nitrogens 发现 B 题是一个三元逆序对问题,正好是 biubiubiu 做过的线段树题目,biubiubiu 马上上机去秒,64min1A。这时 nitrogens 发现 F 题用一个优先队列即可实现,90min1A。这时 biubiubiu 去开了 J 题,nitrogens 去开了 G 题。后来 nitrogens 发现 G 题只需要正反两遍 DFS 即可完成,但由于太过犹豫,码了很长时间,最后 120min1Abiubiubiu 猜到 J 题的答案不超过 2 2 2,于是用二染色的方法,暴力染色,交上去 WA1,中间换了很多方法,还是一直 WA1,突然发现这个题暴力的做法很快就能够得到答案,于是用最暴力的方法,交上去还是 WA1,于是放弃了这道题,去开了 I 题。两个人玩了几轮,猜到了规律,去写 DFS,我们写出的细节存在问题,一直在 WAWA 到比赛结束。

比赛结束之后,去看 J 的测试数据,发现 J 没有 Special Judge,后来在 Kattis 上面交,AC 了,很难过。


Problems Solution

签到题: ACDFG

I - Prime Time

显然,我们可以用一个三元组 ( a , b , c ) (a,b,c) (a,b,c) 表示三个人当前的得分,即我们可以用一个三元组来表示一个状态。

d p [ i ] [ j ] dp[i][j] dp[i][j] 表示第 j j j 个人被传到数字 i i i 之后,得到的对第 j j j 个人最优的三元组。

因此 d p [ i ] [ j ] dp[i][j] dp[i][j] 可由 d p [ i + 1 ] [ ( j + 1 )  mod  3 ] dp[i+1][(j+1) \text{ mod }3] dp[i+1][(j+1) mod 3] 以及 d p [ i p ] [ ( j + 1 )  mod  3 ] dp[\frac{i}{p}][(j+1) \text{ mod }3] dp[pi][(j+1) mod 3] 转移过来,其中 p p p i i i 的一个质因子,可以 O ( n log ⁡ n ) O(n\log n) O(nlogn) 地预处理出来。

转移的时候,根据题意,只考虑第 j j j 个人自己的答案是否更优,如果更优,则将整个三元组替换过来,否则就不需要更新当前 dp 值。

注意需要考虑到,第 j j j 个人本回合处理出的数字也要贡献到答案中。

可以通过记忆化搜索完成状态的转移。

时间复杂度: O ( 1 0 3 ⋅ 1 0 4 ⋅ 3 ) O(10^3 \cdot 10^4 \cdot 3) O(1031043)

J - Enemy Division

分析发现,只存在两种可能:(1)所有的点分为一组;(2)将点集分为两组。

如果所有的点的度都不超过 1 1 1,则可以直接分为一组。

否则,我们需要将点分为两组,即染成 1 1 1 2 2 2 两种颜色。

最初,将所有的点染成颜色 1 1 1,然后我们可以不断地检查是否存在以下情况:

【Team 马上就要把楼上超过了 训练记录】_第1张图片

(1) 1 , 2 , 3 1,2,3 1,2,3 为同一种颜色, 4 4 4 为另一种颜色。

(2) 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4 为同一种颜色。

如果存在,就强制让 1 1 1 的颜色改变。

不断检查并修改,直到不存在上述情况为止。

时间复杂度: O ( n ) O(n) O(n)

E - ls

魔改了一下编辑距离的状态转移方程。

设给出的模式串为 pattern \texttt{pattern} pattern,需要匹配的串为 input \texttt{input} input

d p [ i ] [ j ] dp[i][j] dp[i][j] pattern [ 1.. i ] \texttt{pattern}[1..i] pattern[1..i] input [ 1.. j ] \texttt{input}[1..j] input[1..j] 是否可以匹配,则转移方程为:

(1) pattern [ i ] = input [ j ] \texttt{pattern}[i]=\texttt{input}[j] pattern[i]=input[j] 时: d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j]=dp[i-1][j-1] dp[i][j]=dp[i1][j1]

(2) pattern [ i ] = ’*’ \texttt{pattern}[i]=\texttt{'*'} pattern[i]=’*’ 时: d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] ∣ d p [ i ] [ j − 1 ] ∣ d p [ i − 1 ] [ j ] dp[i][j]=dp[i-1][j-1]|dp[i][j-1]|dp[i-1][j] dp[i][j]=dp[i1][j1]dp[i][j1]dp[i1][j]

(3)其他情况下: d p [ i ] [ j ] = false dp[i][j]=\texttt{false} dp[i][j]=false

注意 j j j 需要从 0 0 0 开始遍历。

你可能感兴趣的:(队内训练)