2019河北省大学生程序设计竞赛(重现赛)


链接


Problem A

Upsolved by purple_bro.

题意:

  • 给你一张 $100\times100$ 的坐标,还有 $n$ 个钉子的坐标,然后问你是否能把一个半径为 $r$ 的圆从下边界移到上边界且不触碰到左右边界和钉子。

题解:

  • 考虑建图,钉子与钉子之间距离小于直径的连边,钉子与左右边界小于直径的连边,看看能否跑一条从左边界到右边界的通路,可以输出 $No$ 否则为 $Yes$。

Problem B

Solved by Robin_Lo. 02:33:22 (+1)

题意:

  • 求 $\sum^{n}_{i=1}q^i \pmod{p}$。

题解:

  • 分块做,先求出前 $\sqrt{n}$ 个,后面每个块乘上 $q^{\sqrt{n}}$,剩下不完整的块暴力算,复杂度 $O(T\sqrt{n})$。
  • 矩阵快速幂做,$f[i] = f[i-1] \times q + q$。
  • 递归做,$a[i] = a[\frac{2}{i}]+a[\frac{2}{i}]\times q^{\frac{2}{i}}$。

Problem C

Solved by Robin_Lo. 02:18:47 (+)

题意:

  • 攻打一条直线上的 $n$ 个国家,攻打第 $i$ 个国家的费用是左边已被攻打国家位置到右边被攻打国家位置长度$\times cost_i$,求把全部国家攻打完的最小费用。

题解:

  • 区间 $dp$ 问题。假设我们现在要处理区间 $[i,j]$ 这一段的国家,如果我攻打了一个国家 $k(i<k<j)$,那此 时要交的费用是 $cost_k \times(j-i)$,攻打过后,这段区间就分成了 $[i,k-1]$ 和 $[k+1,j]$ 两段。根据题目的 描述我们可以发现,因为 $k$ 已经被攻打了,所以这两段区间其实已经相互独立了,即如果我们攻打其中一个区间里的国家,是不会影响到另外一个区间的
  • 这样下来,我们只需要枚举一个区间里第一个要攻打的国家就好了,

  • $dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+cost[k]\times(j-i))$ ,$i\le k \le j$ 且 $dp[i][i]=cost[i]$。

    ​ 时间复杂度是 $O(n^3)$


Problem D

Unsolved.


Problem E

Solved by Robin_Lo. 02:53:10 (+2)

题意:

  • 现在有 $2n$个人,编号为 $[1,n]$ 的人按顺序站好,现在告诉你 $[n+1,2n]$ 的人站在谁的前面,如此形成了一 个两行 $n$ 列的矩形站位。现在 $[1,n]$ 的人都向 $[n+1,2n]$ 中的一人连一条线,现在问你 $[1,n]$ 里每个人连的线会与多少其它的线相交。

题解:

  • 现在我们来考虑第 $i$ 个人的答案会是多少,首先我们可以先计算 $[1,i-1]$ 的人里,有多少个人的线是与第 $i$ 号的线是相交的。假设第 $i$ 号的线连向 $x$ ,那么如果$[1,i-1]$ 中有线连向了 $x$ 的右方,那这根线必定与第 $i$ 号线相交。假设 $x$ 在第 $j$ 号的对面,我们只要统计出有多少线是连到 $[j+1,n]$ 的对面就好了,我们可以用树状数组来解决这个问题。
  • 现在我们计算出了第 $i$ 个人的线会与多少 $[1~i-1]$ 的人的线相交,剩下只要算出与 $[i+1,n]$ 的人的线相交的数量就好了。这里的求法其实与之前类似,假设第 $i$ 号的线连向 $x$,$x$ 在第 $j$ 号的对面,我们只要统计出$[i+1,n]$ 中有多少线是连到 $[1,i-1]$ 的对面就好了,这里我们从大到小的统计并维护树状数组就 $OK$ 了。

Problem F

Unsolved.


Problem G

Solved by purple_bro. 00:10:35 (+)

签到题。


Problem H

Solved by purple_bro. 00:21:55 (+1)

题意:

  • 求 $N^k$ 的数根,$1 \le k \le 2$。

题解:

  • 一个数 $n$ 在十进制下的数根就是 $n \pmod{9}$, 如果是 0 就加 1。

Problem I

Upsolved by purple_bro.

题意:

  • 在一张平面图上有 $n$ 颗星星。一个参数 $c$ ,$q$ 个询问。每颗星星有个亮度 $s_i$,在时间 $t$ 的亮度为 $s_i + t \pmod{c+1}$,每个询问 $t_ix_1y_1x_2y_2$ 表示在时间 $t_i$ ,左上角为 $x_1y_1$,右下角为 $x_2y_2$ 的矩形里面的星星总亮度为多少。

题解:

  • cdq 分治,把询问拆成四个点,第一维先对 $x$ 排序,然后分治合并的时候对 $y$ 排序,然后用树状数组对对应的询问 $t$ 进行查询,容斥一下即可计算出答案,$t$ 较大需要进行离散化。

Problem J

Upsolved by purple_bro.

题意:

  • 有 $n$ 个人,每个人喜欢另一个人,问如何配对使得没配对的人尽量少。

题解:

  • 拓扑排序。假设 $s \to t$ ,那么 $t$ 的入度 ++,贪心的取入度小的出来,用个 $priority$_$queue$,贪心的配对。

Problem K

Solved by purple_bro. 00:41:21 (+1)

签到题。


Problem L

Solved by purple_bro. 03:13:18 (+1)

题意:

  • 给你一个 $N \times N$ 的网格图,每个网格上都有一个数,一个机器人可以从网格上的任意一个地方出发往上左右的方向走任意多步,走的过程会经过一些数,按照经过的顺序能获得一个数,求不能获得的最小的数。$1 \le N \le 50$。

题解:

  • 暴力求,考虑数的增长速度和获得的数的增长速度,获得的数可以看成是一棵四叉树,算了一下不会超过 7 层,$bfs$ 搞一下,从小到大把第一个 $!vis[i]$ 输出就可以。