版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

仓库源文站点原文


title: 题解 - 2020 ICPC 亚洲区域赛(南京) categories:


比赛链接

<!-- more -->

题目概览

题号1 标题2 做法
A Ah, It's Yesterday Once More 构造
*B Baby's First Suffix Array Problem
*C Certain Scientific Railgun
*D Degree of Spanning Tree
E Evil Coordinate 排序
F Fireworks 三分
*G Go
H Harmonious Rectangle 打表
*I Interested in Skiing
*J Just Another Game of Stones
K K Co-prime Permutation 签到(找规律)
L Let's Play Curling 签到(找规律)
*M Monster Hunter 树形 DP

官方题解

{% pdf /archives/icpc-anjr2020/problems.pdf 600px %}

A - Ah, It's Yesterday Once More

解题思路

我 TM 直接好家伙

B - Baby's First Suffix Array Problem

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> </details>

C - Certain Scientific Railgun

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> </details>

D - Degree of Spanning Tree

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> </details>

E - Evil Coordinate

题意简述

有个机器人在二维平面上按给定指令走, 初始位置是 $(0,0)$, 指令包括如下四种:

在 $(m_x,m_y)$ 处有个坑, 机器人走到坑那里就动不了了, 问能否通过改变指令顺序使得机器人避开坑

解题思路

显然如果坑在 $(0,0)$ 或者是终点则避不开, 之后我们发现将相同方向排在一起的所有序列中至少有一个是满足条件的, 则枚举四种指令的全排列即可

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb cpa_cpp title:E Gym/102992E/0.cpp %} </details>

F - Fireworks

题意简述

Kotori 可以花费时间 $n$ 制作一个烟花, 也可以花费时间 $m$ 点燃所有没点燃的烟花, 每个烟花完美绽放的概率为 $p$, 如果在某次点燃中有至少一个烟花完美绽放, 则 Kotori 停止, 问 Kotori 停止的最小时间期望

解题思路

假设最优解是制作了 $k$ 个烟花, 耗时为 $t$, 则有

$$ t=(nk+m)\left(1-(1-p)^k\right)+(t+nk+m)(1-p)^k $$

解得

$$ t=\frac{nk+m}{1-(1-p)^k} $$

不难发现 $t$ 是 $k$ 的严格单峰函数, 直接三分即可

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb cpa_cpp title:F Gym/102992F/0.cpp %} </details>

G - Go

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> </details>

H - Harmonious Rectangle

题意简述

解题思路

沉迷搞 A 题导致没去打表, 难受

由抽屉原理, 如果 $m,n>9$ 则任意矩阵均满足要求, 结果为 $3^{mn}$

剩下的打表即可

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb cpa_cpp title:H Gym/102992H/0.cpp %} </details>

I - Interested in Skiing

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> </details>

J - Just Another Game of Stones

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> </details>

K - K Co-prime Permutation

题意简述

找到 $1..n$ 的一个排列 $p_1,p_2,\dots,p_n$ 满足恰有 $k$ 个数 $i_1,i_2,\dots,i_k$ 满足

$$ (ik,p{i_k})=1 $$

解题思路

首先 $k$ 一定大于 $1$, 之后对 $2..k$ 做一次轮换即可(因为相邻两数一定互质, 且 $2$ 和 $k$ 互质当且仅当 $k$ 为奇数)

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb cpa_cpp title:K Gym/102992K/0.cpp %} </details>

L - Let's Play Curling

题意简述

给定整数 $a_1,a_2,\dots,a_n$ 和 $b_1,b_2,\dots,b_m$, 令

$$ f(c)=\left|\left{i\mid\forall j\in[1,m]\cap\mathbb{N},~|c-a_i|<|c-b_j|\right}\right| $$

求 $\displaystyle\max_{c\in\mathbb{R}} f(c)$

解题思路

先排序, 如果 $c$ 在 $bi,b{i+1}$ 之间, 则 $f(c)$ 最大值即为两数 2 之间夹的 $a$ 个数

所以 $O(m)$ 跑一遍即可

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb cpa_cpp title:L Gym/102992L/0.cpp %} </details>

M - Monster Hunter

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> </details>

  1. 打*的是还没写的题

  2. 带超链接的是找到了原题或原型