BiuBiuBiu
Walker
Nitrogens
map
的时候可以用字典树优化int
,和某些爆long long
的写法赛中通过和赛后通过的代码均在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当场通过 !
口头通过 Ø
赛后通过
Link: http://codeforces.com/gym/241749
题号 | 题目名称 | 题目类型 | 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 |
由于圈的比赛比较水,所以签到题比较多,开场 BiuBiuBiu
发现 B
这个签到题,于是直接上去写,在8min
过掉第一个签到。之后去开A
题,由于最开始题意理解错误,导致26min
才过掉。之后在34min
过掉G
题,这中间Nitrogens
向walker
说了一下D
题的做法,大家感觉都没有问题,于是Nitrogens
上去写,写到中间发现过的人不多,于是继续开题意,这时Nitrogens
发现 H
也是个签到题,于是在51min
过掉H
,之后walker
向BiuBiuBiu
说了一下C
的做法,感觉可行,在63min
过掉C
,之后Nitrogens
上去写I
,很快写好但是样例过不去,然后发现是数组没有清空,之后改掉在80min
过掉I
题,之后BiuBiuBiu
发现J
题竟然是自己出过的题,然后walker
也想到了做法,于是walker
上去写,其他人继续开题意,之后BiuBiuBiu
得到了K
题的做法,walker在85min
过掉J
,然后BiuBiuBiu
上机过掉K
题,之后Nitrogens
感觉D
的做法就是对的,于是上去继续写D
,由于忘了清空数组打破了8
个1A
的记录,在119min
过掉D
题,在这之间BiuBiuBiu
得到了EF
的做法,之后BiuBiuBiu
上机写E
,由于没有注意细节爆long long
贡献一发罚时,在140min
过掉E
题,还剩最后一个F
,BiuBiuBiu
想到的是线段树的做法,写完交上去WA2
,原因是给定数据的区间l
和r
不一定按顺序,之后改掉发现TLE
,于是把之前判定回文半径的方法优化为Manacher
,还是TLE
,最后把map
改为unorder_map
才在188min
过掉,比赛就结束了!
签到题:BDGH
可以发现只有连续的 1 1 1 可以做贡献,那么只需要把每个二进制位单独考虑并且对每段连续的1计算贡献即可。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
可以发现两数相加之后取模只有两种结果,对两种结果分别二分去求最大值即可。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
d p [ i ] dp[i] dp[i] 表示到 i i i 的最小步数,每个状态只能从两个之前的状态转移过来,注意清空数组即可。
时间复杂度: O ( n ) O(n) O(n)
递推的去求就会发现计算技巧,之后去按照规律计即可,注意取模。
时间复杂度: O ( n ) O(n) O(n)
如果有超过 1 1 1 个字符出现奇数次,则不可能构成回文串。
否则统计每个位置上的选择数即可,要注意对相同的字符重复计算的问题。
时间复杂度: O ( n ) O(n) O(n)
首先把 14 14 14 个骰子分成两份,之后分别爆搜即可,注意算逆元的时候处理不好会爆 long long
。
时间复杂度: O ( 6 7 ∗ l o g ( 6 7 ) ) O(6^7*log(6^7)) O(67∗log(67))
问题处理一下就是区间最大值问题,之后注意被卡 map
而 TLE
的问题,优化方法有 unordered_map
和 trie
。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
Link: http://codeforces.com/gym/101673
题号 | 题目名称 | 题目类型 | 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 |
开场发现 C
是签到题,之后BiuBiuBiu
和 walker
开了 H
题,与此同时 Nitrogens
快速看完 C
题题意,很快码完了,测了样例全部通过,检查无误之后提交,10min1A
。H
题题意看了 20min
才看懂,之后 BiuBiuBiu
调了很久 H
才过了样例,然而交上去就 WA
掉了,原因是数组开小了。之后,Nitrogens
马上开始写 D
,之后 52min1A
。此时已经发现了 H
的问题,改完之后交上去,56min2A
。之后一起开了 F
的题意,然后发现是简单的树上 dp,BiuBiuBiu
很快码完,最后89min1A
。之后开了 J
的题意,后来发现 J
的题意云里雾里的根本看不明白,后来连看带猜才勉强猜出题意。BiuBiuBiu
放弃了这道题,后来 Nitrogens
想出了一个可能的做法,与 BiuBiuBiu
讨论了一下,发现思路惊人的相似!! 于是 Nitrogens
上机开始码这道题,码完之后样例没过。然后 BiuBiuBiu
和 walker
想出了 G
题的状态转移方程,于是 BiuBiuBiu
开始码 G
。中间 Nitrogens
发现自己一个小细节写错了,找到机会上机的时候立马把错误改掉,之后交上去,惊喜的发现 173min1A
。马上 G
也写完了,交上去发现 RE
,改正之后再交,返回 WA
。之后,加了很多没用的特判,还是 WA
,最后发现有一个小地方可能有问题,但是自己却构造不出那种数据,于是莽了一发,229min5A
。这时 Nitrogens
已经将 E
的模型化简并得到了做法,码完之后调了好久,才过了样例,交上去发现 WA
了。之后造了几组数据,发现了很多 BUG
,这时用 BiuBiuBiu
的简单写法重写了 E
,BUG
神奇的全部消失了,交上去,283min2A
。在这期间,walker
和 BiuBiuBiu
已经讨论出了 I
的正确写法,然后 walker
上机写表达式求值,奈何时间太短,比赛结束!!!
签到题: CH
由于题中给定很多圆,我们发现很多个圆的凸包很难求解,所以我们可以均匀地在圆周上找出5000个点,之后对所有点求凸包即可。
时间复杂度: O ( n × 5000 × l o g ( n × 5000 ) ) O(n×5000×log(n×5000)) O(n×5000×log(n×5000))
对于第一种操作,直接移动相应的位置后对 n n n 取模即可(若出现负数,则将其变为正数之后再取模),之后用栈记录每次进行的操作。
对于第二种操作,直接从栈中取出 m m m 个元素,进行反向的第一种操作即可。注意每次取栈中元素之前,要对栈进行判空。
时间复杂度: O ( n ) O(n) O(n)
对于 is-a
关系和 has-a
关系,按照上面的规则分别Floyd传递闭包即可。
时间复杂度: O ( n 3 ) O(n^3) O(n3)
首先树形dp统计出每个子树内点的个数,之后对于每个点计算删除之后的不联通点对数并记录下关键节点。
对于关键节点,选出两个最大的子树联通即可。
时间复杂度: O ( n ) O(n) O(n)
dp[i][j]
表示第i轮之后能剩余卡路里为j的最大食物获取量,之后按照题意进行转移即可。
如果第i轮选择吃/不吃东西,则从上一轮转移过来。
对于满卡路里的状态,还可以从两轮之前转移过来。
最后要注意判断状态的可达行,有些状态之前到达不了则不能转移。
时间复杂度: O ( n m ) O(nm) O(nm)
暴力枚举所有表达式判断可行性,可行则更新答案。
时间复杂度: O ( 4 ! × 4 × 4 × 4 × 5 × 4 3 ) O(4!×4×4×4×5×4^3) O(4!×4×4×4×5×43)
按顺序对三个回合进行计算,当 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(3⋅10)
Link: http://codeforces.com/gym/101196
题号 | 题目名称 | 题目类型 | 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 | . |
开场 Nitrogens
开了 C
题的题意,并口头描述给了 BiuBiuBiu
,BiuBiuBiu
很快码完了,后来发现样例没过,然后发现题意读错(第 1 1 1 次读错题意)。改正之后,16min1A
。很快 Nitrogens
又把 E
题题意读完,告诉了 BiuBiuBiu
,BiuBiuBiu
很快码完,28min1A
。之后开始了自闭的历程,两个半小时零输出。写完之后,walker
读完了 I
题(第 2 2 2 次读错题意),写了一会之后,过掉了样例,交上去WA4
,发现模板有个地方抄错了,再交,依旧WA4
,在这期间, Nitrogens
向 BiuBiuBiu
叙述了 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
题也读错了题意,然后在 BiuBiuBiu
码 D
的期间整理出了做法,D
过了之后 walker
上去写 I
,第一次由于建边的问题WA2
,改正之后217min4A
。之后,Nitrogens
上去写了一会 F
,发现样例过不去。然后这时 BiuBiuBiu
去开了 G
题,walker
上去按照他的思路重写了 B
题,交上去,WA4
,后来 Nitrogens
也发现自己的一处错误(第 5 5 5 次读错题意),交上去,依旧 WA6
。这时 walker
发现有一处DEBUG
没删掉,删掉之后,281min4A
。这时 BiuBiuBiu
上去写了 G
,奈何时间太短,比赛结束!!赛后发现 F 题上机写的做法已经很接近很接近正解!!!!
签到题: BCE
首先,用 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)
先将序列复制一份,放在原序列后面,构成长度为 2 n 2n 2n 的序列。
设 d p [ i ] [ j ] dp[i][j] dp[i][j] 为删去 [ i + 1 , j − 1 ] [i+1,j-1] [i+1,j−1] 区间内所有数字所付出的最小代价 ( 1 ≤ i ≤ j ≤ 2 n 1 \le i \le j \le 2n 1≤i≤j≤2n)。
则我们可以用区间 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)
回忆最经典的汉诺塔问题,求解汉诺塔问题的函数为 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(1≤i≤3) 个柱子所对应的队列。编号大的盘子在队首。
对于每个 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(n−1,a,c,b) 和 hanoi ( n − 1 , b , a , c ) \text{hanoi}(n - 1, b, a, c) hanoi(n−1,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(n−1,a,c,b) 阶段,此时我们可以发现,后面的 hanoi ( n − 1 , b , a , c ) \text{hanoi}(n - 1, b, a, c) hanoi(n−1,b,a,c) 阶段需要 2 n − 1 2^{n-1} 2n−1 步,直接加到答案中即可,然后递归求解 hanoi ( n − 1 , a , c , b ) \text{hanoi}(n - 1, a, c, b) hanoi(n−1,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(n−1,b,a,c) 阶段,此时无需考虑前一阶段,直接递归求解 hanoi ( n − 1 , b , a , c ) \text{hanoi}(n - 1, b, a, c) hanoi(n−1,b,a,c) 即可;
( 3 ) (3) (3) 若 n n n 号盘子(即当前问题规模下的最大盘子)在 b b b 柱子下,则当前状态不合法,直接输出 No
。
可以参考代码来具体理解整个过程,递归的过程可以从字面意思来进行理解。
时间复杂度: O ( n ) O(n) O(n)
首先题意确定给出的数据一定是合法数据,所以我们可以分以下几个过程解决这个问题。
( 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)
首先,建立源点与汇点。之后,源点与每个人建边,每个人与他所喜爱的糖果建边,每种糖果与它所属种类建边,每个种类与汇点建边,跑一遍 Dinic
即可。
Link: http://codeforces.com/gym/101341
题号 | 题目名称 | 题目类型 | 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 |
开场 Nitrogens
开了 B
题题意,发现是个暴力,之后 biubiubiu
上去码了一会,处理了一会细节,17min1A
。
之后发现 D
题过题人数很多,就开了 D
,biubiubiu
一眼发现是个裴蜀定理的经典题,直接秒了,22min1A
。
之后 nitrogens
开了 C
题题意,然后 biubiubiu
和 walker
讨论了做法,walker
上去码了一会之后,测试了 biubiubiu
造的十多组数据,找到了一个 bug
,之后交上去发现 WA23
。之后 nitrogens
上去写 M
题,很快就写完了,交上去 52min1A
。之后 walker
找到了 bug
,改完之后又测试了 biubiubiu
造的数据,又发现一个 bug
。后来又改了一下,交上去,59min2A
。这个时候,nitrogens
把 G
的题意告诉了 biubiubiu
,biubiubiu
想到了一个倒着做的做法,最后77min1A
。
之后 walker
把 H
的题意和做法告诉了 biubiubiu
,但是biubiubiu
觉得这个做法比较难写,之后换了一个二维前缀和的做法,103min1A
。
之后,walker
开始码 A
,biubiubiu
和 nitrogens
开始讨论 E
的做法。然后 walker
写完 A
之后交上去,WA45
。之后发现一个 bug
,改完之后还是 WA45
。之后 biubiubiu
上去写 E
,很快写完了,交上去 WA15
。整个队伍开始自闭。
之后,walker
又发现了括号排序策略的问题,改了 cmp
函数,交上去 WA71
,之后 biubiubiu
发现了 E
的 bug
,改正之后 215min2A
。
最后,walker
又改了几次 cmp
函数,最后终于在 262min7A
。
在这期间,biubiubiu
搞了一个 I
的随机化做法,玄学过数据,但是一直不能 AC
,这耽误了很多本来应该写 K
的时间。
在 walker
过了 A
之后,biubiubiu
上去写线段树,在中间某个时间发现要输出很多信息,这必须改线段树。调完之后,在最后一分钟过了样例,但是 CE
,然后比赛结束!!
赛后发现线段树 WA12
,也没那么遗憾了。只是如果 I
题不浪,K
是一定能过的。
update
: K题WA12
的原因是有个函数传参没开ll
,爆炸!
都是教训啊!!!!
签到题: BDGM
首先处理单个字符串,用栈模拟括号匹配过程,化简字符串。之后只剩(
,)(
, )
这三种形式的字符串,
排序首先第一层判断是哪种字符,顺序跟上面写的一样。之后)(((((
在)))))(
前面,对于同样是)((((
,)
少的在前面。对于同样是))))(
,(
多的在前面。这是一个对称的过程。最后模拟一下括号匹配,看是不是成立。
时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
WA
点:
vector
分别存储每个字母出现的位置。happiness
的左右边界。首先n
和m
取一个小值,然后判断未知球加对应颜色的已知球是不是小于小值,若小于则是判断未知加另一个颜色球是不是小于大值,若小于答案是a+b+c
,否则是大值。若不小于小值,答案就是小值。
时间复杂度: O ( 1 ) O(1) O(1)
分析题意,即可知道对于每两个连续的关键点单独讨论,一定是到达它们之间的某个点之后返回左关键点,传送到右关键点,之后走剩下的点,我们只需要对每个区间枚举即可,注意第一个区间和最后一个区间特判。
WA
点:
时间复杂度: O ( n + m ) O(n+m) O(n+m)
枚举要删除的行和列,通过二维前缀max计算出四个矩形内的最大值即可。
时间复杂度: O ( n 2 ) O(n^2) O(n2)
dp[i]
表示以第i
个区间为最后一个任务的最大价值,之后肯定是在第i个区间的l
之前找一个可以转移的价值最大的区间进行转移,这个过程用线段树优化一下即可。
WA
点:
dp
,否则就是 Wrong Answer
;时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
随机出一个1
行n
列的矩阵D
,根据矩阵乘法的结合率,通过判断A×B×D
=C*D
,由于矩阵乘法的耦合性很强,所以如果结果相等那么合法的可能性很大,每次随机复杂度是1e6
,所以我们可以随机10次,如果都满足则输出YES,否则输出NO。
时间复杂度: O ( 10 × n 2 ) O(10×n^2) O(10×n2)
Link: http://codeforces.com/gym/100502
题号 | 题目名称 | 题目类型 | 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 |
开场由于看错榜,发现 C
题很快有人通过,于是 biubiubiu
和 walker
开了 C
题,这时发现 D
也有人通过,然后 nitrogens
开了 D
。这时 biubiubiu
和 walker
发现 C
题需要高精度,于是暂时放弃。这时 D
题题意读完,之后 biubiubiu
开始去码 D
,很快 18min1A
。这时 nitrogens
开了 E
题题意,与其他两个人确认做法之后,很快码完,29min1A
。这时 biubiubiu
上机敲了高精度的板子,walker
和 nitrogens
讨论 K
题。然后 biubiubiu
开始打表,其他两人也讨论完了 K
。打表的同时,nitrogens
上机敲了 K
,53min1A
。这时,biubiubiu
发现 H
题做过,直接上去写,由于最小表示法的板子出了一些问题,导致 77min1A
。之后发现 C
打表很慢,于是尝试用 Java
写,按照题目中给的 O ( n 2 ) O(n^2) O(n2) 的做法,交上去 RE
,原因是非法访问内存。之后在 CF
的 Custom Innovation
中测试之后,交上去,TLE
。之后 walker
上机开始敲 A
,过了一会,biubiubiu
想出了 O ( n ) O(n) O(n) 的做法,但是由于精度太大,运算时间过慢,导致 TLE6
。之后 walker
继续敲 A
,然后 biubiubiu
和 nitrogens
开了 G
题题意,得到了一个看起来很对的做法。biubiubiu
在纸上写下了细节。之后 nitrogens
发现板子中有精度更低的 C
的做法,上去写,177min3A
。之后 biubiubiu
和 nitrogens
开了 I
题的题意,又很快得到了做法,并且在纸上大概实现,等待机时上机。这时,walker
写完了 A
,用 nitrogens
造的数据开始测试,但是中间一直有 BUG
。biubiubiu
在 walker
调 BUG
期间,断断续续写完了 G
题,调试通过之后,手出了很多数据,中间改了一个初始化细节,交上去 274min1A
。之后,walker
继续调 A
,biubiubiu
在纸上写 I
题代码,大概写好之后,占用一半屏幕上机,然后 walker
调出了 BUG
,交上去没看结果,biubiubiu
继续敲 I
,但是有一个细节 biubiubiu
没有在纸上实现,导致时间来不及写完,这时回头看 A
的结果,发现 WA
了,比赛结束。
UPDATED: 赛后发现 A
题 BUG
出在一个很小的地方,之后一发通过,难过~~
签到题: DEK
首先对于确定的点先给一个状态,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 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(n−1)×n+14n−2
即可在精度不太高的情况下得到结果,不然精度太高会导致运算过慢。
时间复杂度: O ( n ) O(n) O(n)
首先将原数组排序差分之后得到差分结果,之后对两个差分结果分别最小表示法,判断是否相同即可。
时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
将图分成不同的联通块之后,每个联通块上是一颗有向的基环树,我们注意到基环树的根一定是这个环,于是将一个环缩点,缩点后题目转换为对于每个联通图我们有一个可选的范围, 范围为:[环上点的个数,联通块内总点数]
,最后凑出的总数要小于k而且最大,这是经典的分组背包问题,DP求解即可。
时间复杂度: O ( n k ) O(nk) O(nk)
Link: http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=391
题号 | 题目名称 | 题目类型 | 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 |
开场发现 E
有人通过,发现是个签到题,biubiubiu
上去很快码完,8min1A
。之后发现 J
也是个水题,15min1A
。
之后 biubiubiu
和 walker
开了 A
题,nitrogens
去开了 G
题。之后 biubiubiu
上去写 A
,33min1A
。之后,biubiubiu
得到了 G
的题意,发现可以贪心,然后 walker
造了一些数据,biubiubiu
写完之后,测试了数据,全都没有问题,交上去 62min1A
。这时 nitrogens
已经写好了 B
题的伪代码,biubiubiu
又开始用 Code::Blocks
写 Java
,写好之后,在 CF
上面调试了一下,72min1A
。之后,发现之后 C
题过的人很多,于是 3 3 3 个人一起开 C
题,得到了一个假做法,biubiubiu
敲完之后总感觉哪里不对,一直不敢交。后来 biubiubiu
发现了可以 Hack
这个做法的数据,于是改变做法,想出了一个更可靠,而且看起来就很对的做法,140min1A
。之后全队去搞 H
题,walker
想到了一个做法,最后需要处理一个东西,biubiubiu
发现这个东西可以用 LCA
处理出来,于是 walker
开始敲,biubiubiu
在一旁盯着,按照步骤一步一步执行之后,在还有 10min
的时候调过了样例,又测试了 nitrogens
造的数据,发现一处 BUG
,改正之后交上去,得到了 WA
,比赛已经结束。然后发现根本没有调用 LCA
的预处理函数,鬼知道怎么过的所有数据。改正之后,还没有交上去,但是做法和通过的人的做法已经基本一致。难过~~
签到题: EJ
首先把两个数组分别拆为两组,对于第一个数组每个想找更小的元素的数字,找第二个数组中想找更大的元素的元素中最小的那个,对于第一个数组中想找更大的元素的数字,找第二个数组中想找更小的元素中最小的而且大于当前数字的那个。用set
维护查找和删除即可。
时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
首先我们要知道的是,这个题目中有效的游戏步数很少,因为有很多种情况会导致游戏结束或者出现死循环,于是大胆猜测可以直接模拟,但是要用一个数组维护上一次到达某个点的答案为多少,如果两次到达某个点答案相同,则说明出现死循环,直接跳出即可,其他直接游戏结束的情况特判即可(例如持续撞墙,原地踏步)。
时间复杂度: O ( n ∗ m ) O(n*m) O(n∗m)
对于左右两段分别贪心的考虑即可,我们一定选最远的k个最后走,因为可以不再回来,之后每k个点一起送信即可。
时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
一共n个点,m个边。可能会有重边和自环,读入的时候处理一下自环就好。然后在整个图上跑tarjan,跑出来所有的联通分量(联通分量之间通过桥连接),并且因为原图没有保证图联通,所以需要跑多次tarjan,最后将所有连通分量缩点并重新分配一个序号,然后通过桥重新建多个树。给出每个序号所属于的树。之后就是查询过程,首先判断每个点在缩点之后所属于的序号是不是在同一个树中,不是就是输出No
。然后在一个树中需要判断u和v,或者u和w是不是在一个序号中,如果在一个序号中就是Yes
,不成立就分几步判断,首先 ,uv=lca(u,v)
,uw=lca(u,w)
,vw=lca(v,w)
uv=u
时 如果vw==u
&uw==u
成立 ,否则如果uw!=u成立 否则不成立uv=v
时 如果uw=u
成立 , 否则不成立uv!=u
&uv !=v
时 如果uw=u
成立 ,否则不成立Link: 2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015)
题号 | 题目名称 | 题目类型 | 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 | . |
开场 nitrogens
和 walker
开了 A
题,后来马上发现 C
是签到题,转头扫了一下 C
的题意,biubiubiu
上去把这道题直接秒了,5min1A
。然后发现 D
也有人过了,biubiubiu
想了想,最初往二分的方向想,但是无果。后来 biubiubiu
想到一种贪心策略特别合理,于是上去码,交上去 17min1A
。之后 walker
发现 A
可做,于是上去写 A
,然后写了一会之后测了几个数据,发现没有问题,交上去 WA5
。之后 nitrogens
和 biubiubiu
发现 E
是个做过的经典套路题,biubiubiu
上机去码,处理了一些细节之后交上去,68min1A
。这时 walker
在纸上改好了 A
题的代码,写了一会交上去,87min2A
。之后发现 G
可做,于是 biubiubiu
上去写了一个预处理,然后 nitrogens
上去写了二维差分,但是过不了样例,检查了很久,发现差分有问题,改正之后过了样例,交上去 WA11
。biubiubiu
发现还有一些矩形没有处理,处理之后交上去 WA12
。这时,才想起来 short int
存不下,于是想了很久,发现可以滚动数组优化,交上去,WA1
。大家都以为第一组是样例,于是以为是 RE
,但是怎么找也找不到错误,于是加了强制类型转换,发现还是 WA1
。biubiubiu
想了一会,发现初始状态的定义有问题,改正之后,交上去,195min4A
。之后,walker
给 biubiubiu
讲了 F
题化简之后的题意,biubiubiu
发现可以正向 dp
,于是直接上去写,过了很多数据,交上去,216min1A
。之后,全队开始搞 B
,但是大家的方向都是找规律,一个多小时也没弄出来,赛后用递归的方法去想,很快就得到了答案。
签到题: CDE
由于求最终的直径,可以把每棵树看成一条长度为直径的链,那么肯定是选择一棵直径最长的链,之后依次连接中点最优。
时间复杂度: O ( n ) O(n) O(n)
考虑长度为n的排列已经计算好,我们只需要在每个排列从后往前依次插入n+1,之后再把排列变为下一个排列,从前往后依次插入n+1,循环这个过程即可,用vector的insert可以优化代码量。
时间复杂度: O ( n ! ) O(n!) O(n!)
dp[i][j]
表示i时刻是否可能在j位置,之后正向转移即可。
时间复杂度: O ( f ∗ n ∗ t ) O(f*n*t) O(f∗n∗t)
二维前缀和,注意用滚动数组优化内存即可。
Link: The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple
题号 | 题目名称 | 题目类型 | 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 | . |
开场发现 G
题是签到题,于是直接开写,4min1A
。之后发现 F
也是签到题,biubiubiu
上机敲,9min1A
。之后发现了 I
题的规律,16min1A
。之后 walker
向 biubiubiu
叙述了 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
题的做法,但是由于 B
和 J
都卡着,一直没有机会写。B
过掉之后,biubiubiu
上去写 K
,很快写完,并通过了 nitrogens
造的很多数据,交上去 269min1A
。之后,walker
得到了 A
的做法,并上去敲,中间 biubiubiu
写了个线段树维护,但是最后由于细节太多,A
题没有调出来,赛后发现 C
其实更简单,如果分开搞两个题,有可能还能多做出一题。
签到题: EFGHI
根据题意,
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=1∑nkak and y=k=1∑nkak2
设
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=1∑nkbk and B=k=1∑nkbk2
设交换的元素为 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 A−x 和 B − x B-x B−x 仅与 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=(k1−k2)(bk1−bk2)
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=(k1−k2)(bk12−bk22)
因此,在不考虑特殊情况的条件下,我们可以枚举起点 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(len−1)。
注意在开始,将 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))
先统计每个数字 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] 的所有位置,按照从后往前的顺序,加入到名为 ve
的 vector
中。之后,从 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(T⋅nlogn)
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))
设 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...l−1] 和 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(T⋅n)。
Link: 2016-2017 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2016)
题号 | 题目名称 | 题目类型 | 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 | Ø |
开场发现 E
题和 J
题有人通过,于是 biubiubiu
去写 J
题,然后 12min1A
。之后 biubiubiu
继续写 D
题,39min1A
。之后 walker
开了 G
题题意,发现是个小模拟,于是 biubiubiu
开始写 G
,因为题意没有完全弄透,导致 WA
了两次,最后还因为一个小细节又 WA
一次,耽误很多时间,最后 91min3A
。在此期间,walker
向 nitrogens
叙述了 A
题的做法,G
题通过之后 walker
上去写 A
题。在此期间,biubiubiu
和 nitrogens
开了 E
和 F
。nitrogens
推出了一个 F
题的公式,biubiubiu
发现暴力枚举应该就可以算出精度范围内的答案,于是一起去开 E
。biubiubiu
灵光一闪,发现这不就是欧拉降幂吗!! 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
题,biubiubiu
和 nitrogens
在下面讨论 K
题的做法,发现 two pointers +
三分即可,于是在纸上写好代码之后,上去写,直接过样例,交上去 TLE on test 8
,改改精度,TLE18
,之后不断改精度,但一直在 WA
和 TLE
之间徘徊,赛后才发现三分是可以优化到 O ( 1 ) O(1) O(1) 的,但是由于太着急,没想到这里,于是比赛结束。
签到题: DGJ
首先把两个数组分别拆为两组,对于第一个数组每个想找更小的元素的数字,找第二个数组中想找更大的元素的元素中最小的那个,对于第一个数组中想找更大的元素的数字,找第二个数组中想找更小的元素中最小的而且大于当前数字的那个。用set
维护查找和删除即可。
时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
对四种牌的顺序和升降进行全排列,分别对给定序列求LCS即可。
时间复杂度: O ( 52 ∗ 52 ∗ 4 ! ∗ 2 4 ) O(52*52*4!*2^4) O(52∗52∗4!∗24)
对于一个数 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(n−1)(n−2)...21,则 f ( n ) = n f ( n − 1 ) f(n)=n^{f(n-1)} f(n)=nf(n−1)。
因此
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(n−1)modφ(m),gcd(n,m=1)nf(n−1)modφ(m)+φ(m),f(n−1)<φ(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(logn⋅n)
无论自己的卡片放多少张 ,自己最多被抽中一次。
设自己的卡片放了 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+xx⋅n+x−1n⋅n+x−2n−1⋅...⋅n+x−(p−1)n−(p−2)
根据加法原理,总的概率为
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)==== p⋅n+xx⋅n+x−1n⋅n+x−2n−1⋅...⋅n+x−(p−1)n−(p−2) p⋅x⋅(n+x)!n!⋅(n−p+1)!(n+x−p)! p⋅x⋅(n+x)⋅(n+x−1)⋅...⋅(n+2)⋅(n+1)(n−p+x)⋅(n−p+x−1)⋅...⋅(n−p+2)n+1p⋅x⋅(n+x)⋅(n+x−1)⋅...⋅(n+2)(n−p+x)⋅(n−p+x−1)⋅...⋅(n−p+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+x−1)⋅...⋅(n+2)(n−p+x)⋅(n−p+x−1)⋅...⋅(n−p+2)
可以 O ( x ) O(x) O(x) 地求出来,且可从 g ( x − 1 ) g(x-1) g(x−1) 递推出来。
因此我们先计算 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)
Link: 2010-2011 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2010)
题号 | 题目名称 | 题目类型 | 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 | 双指针+计算几何 | Ø |
开局发现 F
是签到题,biubiubiu
上去敲,6min1A
。
这时 nitrogens
开完了 A
题题意,nitrogens
提出可用拓扑排序来做,但是 biubiubiu
发现一种记忆化搜索的做法更好写,于是 30min1A
。
之后在 D
题的题意上面周旋了一会,最后确定做法后发现比 A
题更加简单,nitrogens
上去敲,很快 44min1A
。
之后 biubiubiu
想到一种 B
题的做法:让一对点通过曼哈顿距离直接到达,另一对点 BFS
,但是由于特殊情况太多,感觉写起来很复杂,于是放弃这个做法。之后发现数据范围很小,有可能是最小费用最大流,于是 nitrogens
上去写 B
,biubiubiu
去开 E
题。
过了一会,nitrogens
写完了 B
,发现样例过不去,在确认模板没有问题之后,发现建图好像也没有问题。后来通过 debug 发现在查找增广路时,走了一条回边,而当时的 nitrogens
的潜意识里面认为这个回边是不走的,于是无论如何也想不出办法来,只好放弃。
这时两个人开始想 E
的做法,找规律发现了一堆并不成立的规律,biubiubiu
上去写,但写完的时候比赛已经结束,交上去 WA
了。后来看了题解发现做法假了。比赛结束。
签到题: ADF
先预处理出二维前缀和。
注意到题目要求答案保留三位小数,而答案最大不超过 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)。
首先进行猜想,一定可以通过先让一对点以最短距离到达,之后把这个路径设为墙,让另一对点再通过bfs到达。
由于矩形有边界,所以第一对点也需要通过bfs处理到达。但是我们不确定先走第一对点还是第二对点,于是枚举两次,答案取min即可。
时间复杂度: O ( n ∗ m ) O(n*m) O(n∗m)
Link: 2011-2012 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2011)
题号 | 题目名称 | 题目类型 | 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 | 双指针+计算几何 | Ø |
开场 biubiubiu
去敲头文件,这时 nitrogens
发现 A
是经典的非降路径问题,将做法告诉 biubiubiu
,biubiubiu
马上开始写,很快写完,16min1A
。这时发现 C
才是真正的签到题,在 A
通过之后 nitrogens
马上上机,最后 20min1A
。(小失误,应该先去做 C
才对)这时 biubiubiu
开了 E
题题意并得到了一种做法,上机去敲。同时 nitrogens
去开 D
题题意,后期给 E
出了几组测试数据,最后 E
题 45min1A
。nitrogens
一直按照数学的思维去想 D
题,迟迟得不到做法,这时 biubiubiu
发现只需要记忆化 BFS 即可完成,于是马上上机去敲,54min1A
。马上 nitrogens
发现 B
题是一个三元逆序对问题,正好是 biubiubiu
做过的线段树题目,biubiubiu
马上上机去秒,64min1A
。这时 nitrogens
发现 F
题用一个优先队列即可实现,90min1A
。这时 biubiubiu
去开了 J
题,nitrogens
去开了 G
题。后来 nitrogens
发现 G
题只需要正反两遍 DFS 即可完成,但由于太过犹豫,码了很长时间,最后 120min1A
。biubiubiu
猜到 J
题的答案不超过 2 2 2,于是用二染色的方法,暴力染色,交上去 WA1
,中间换了很多方法,还是一直 WA1
,突然发现这个题暴力的做法很快就能够得到答案,于是用最暴力的方法,交上去还是 WA1
,于是放弃了这道题,去开了 I
题。两个人玩了几轮,猜到了规律,去写 DFS,我们写出的细节存在问题,一直在 WA
,WA
到比赛结束。
比赛结束之后,去看 J
的测试数据,发现 J
没有 Special Judge,后来在 Kattis 上面交,AC
了,很难过。
签到题: ACDFG
显然,我们可以用一个三元组 ( 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(103⋅104⋅3)。
分析发现,只存在两种可能:(1)所有的点分为一组;(2)将点集分为两组。
如果所有的点的度都不超过 1 1 1,则可以直接分为一组。
否则,我们需要将点分为两组,即染成 1 1 1 和 2 2 2 两种颜色。
最初,将所有的点染成颜色 1 1 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)
魔改了一下编辑距离的状态转移方程。
设给出的模式串为 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[i−1][j−1];
(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[i−1][j−1]∣dp[i][j−1]∣dp[i−1][j];
(3)其他情况下: d p [ i ] [ j ] = false dp[i][j]=\texttt{false} dp[i][j]=false。
注意 j j j 需要从 0 0 0 开始遍历。