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

仓库源文站点原文


title: 题解 - 2020 ICPC 江西省大学生程序设计竞赛 categories:


比赛链接

<!-- more -->

题目概览

题号1 标题2 AC / total 做法
A A Simple Math Problem 15 / 207 Möbius 反演 / 容斥定理
B Apple 198 / 562 签到
*C Charging 9 / 157 线段树/树状数组 + 二分
*D Chinese Valentine's Day 0 / 195 后缀自动机
E Color Sequence 29 / 231 位运算
F Magical Number 3 / 23 打表 + DFS
G Mathematical Practice 39 / 64 组合数学
H Sequence 15 / 74 分块 / 线段树
I Simple Math Problem 107 / 452 签到
J Split Game 4 / 133 博弈论
K Travel Expense 33 / 280 Floyd + 二分
*L WZB's Harem 9 / 97 状压 DP
M Zoos's Animal Codes 205 / 241 签到

官方题解

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

A - A Simple Math Problem

题意简述

$\forall x=\sum_{i=0}^la_i\cdot 10^i,~a_0,a_1,...,al\in[0,9]\cap\mathbb{N}$, 定义 $F(x)=\sum{i=0}^la_i$, 求

$$ \sum{i=1}^n\sum{j=1}^i[(i,j)=1]F(j) $$

解题思路

你这咋还和 I 抢上名字了

官方题解是容斥定理, 不过我按 Möbius 反演板子题做的

$$ \begin{aligned} \sum{i=1}^n\sum{j=1}^i[(i,j)=1]F(j)&=\sum{i=1}^n\sum{j=1}^iF(j)\sum{d\mid(i,j)}\mu(d)\ &=\sum{d=1}^n\mu(d)\sum{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum{j=1}^iF(jd)\ &=\sum{d=1}^n\mu(d)\sum{j=1}^{\lfloor\frac{n}{d}\rfloor}(n-j+1)F(jd)\ &=\sum{d=1}^n\mu(d)\left((n+1)\sum{j=1}^{\lfloor\frac{n}{d}\rfloor}F(jd)-\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}jF(jd)\right)\ \end{aligned} $$

令 $gn(d)=\sum{j=1}^{\lfloor\frac{n}{d}\rfloor}F(jd)$, $hn(d)=\sum{j=1}^{\lfloor\frac{n}{d}\rfloor}jF(jd)$

则答案为 $\sum_{d=1}^n\mu(d)((n+1)g_n(d)-h_n(d))$

预处理 $\mu$, $g_n$, $h_n$ 即可

复杂度

$O(n\log n)$

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/A.cpp %} </details>

B - Apple

解题思路

签到题, 问 $n$ 是否被 $m$ 整除

C - Charging

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/C.cpp %} </details>

D - Chinese Valentine's Day

题意简述

解题思路

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/D.cpp %} </details>

E - Color Sequence

题意简述

给一个长度为 $n$ 的串, 其中第 $i$ 位的颜色为 $c_i$, 求有多少子串满足其上任意一种颜色出现次数均为偶数次

解题思路

注意到 $c\leqslant 20$, 所以我们可以考虑对子串颜色情况进行状态压缩

令 $f(l,r)=\bigoplus_{i=l}^r2^{c_i}$, 其中 $\oplus$ 为异或运算

可知若串 $[l,r]$ 满足条件, 则 $f(l,r)=0$

又由异或的性质, 有 $f(l,r)=f(1,l-1)\oplus f(1,r)$, 则

$$ f(l,r)=0\iff f(1,l-1)=f(1,r) $$

所以我们可以对输入求前缀异或和, 若在求到某处时的结果不为 $0$ 且 之前得出的结果中有 $k$ 个和当前结果相等, 则答案直接加 $k$ 即可, 若结果为 $0$ 则需加 $k+1$

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/E.cpp %} </details>

F - Magical Number

题意简述

能否恰好用 $n$ 根火柴棍摆出满足如下条件的数 $s$, 如果可以, 输出最大的数

令 $s=\overline{a_1a_2...a_k}$, 其中 $a_1,a_2,...,a_k\in[0,9]\cap\mathbb{N}$, 可以有前导零, 要求

$$ \forall i\in[1,k]\cap\mathbb{N},~i\mid\overline{a_1a_2...a_i} $$

解题思路

首先若 $n<2$ 则一定无解

所以状态数不是很大, 直接 DFS 即可

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/F.cpp %} </details>

G - Mathematical Practice

题意简述

在有 $n$ 个元素的集合中有顺序地取 $m$ 个子集, 问这 $m$ 个子集中两两不相交的取法数

解题思路

H - Sequence

题意简述

维护序列 $a_1,a_2,\dots,a_n$, 对其进行 $m$ 次操作, 共两种:

  1. 1 x y: 将 $a_x$ 修改为 $y$
  2. 2 x: 询问以 $a_x$ 为最小值的子串数

保证任意时刻 $a_1,a_2,\dots,a_n$ 两两不同

解题思路

显然分块或者线段树, 我写的分块

块存最小值, 更新就是更新原数组和其所在块, 查询就是从 $x$ 出发, 向左找第一个小于 $a_x$ 的数 $a_l$ (找不到就是 $a_1$), 向右找第一个小于 $a_x$ 的数 $a_r$ (找不到就是 $a_n$), 答案就是 $(x-l+1)(r-x+1)$

不知道为啥有人就特殊处理全局最小和全局最大, 剩下的情况暴力就过了, 这数据...

复杂度

设块长为 $l$, 则时间复杂度为 $O(n+ml)$

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/H.cpp %} </details>

I - Simple Math Problem

解题思路

签到题, 注意最后结果转成十进制

J - Split Game

题意简述

有个 $n\times m$ 的矩形网格纸, AliceBob轮流行动, Alice先手, 每个人均要选一张纸片并, 沿某条网格线将其剪成两片, 率先剪出 $1\times 1$ 纸片的玩家判, 两人均采取最优行动, 问谁胜

解题思路

原型是一道经典的博弈论题

我们可以把每张纸片均看作一个有向图游戏, 整张纸看作有向图游戏的和

令 $\operatorname{SG}(m,n)$ 表示 $m\times n$ 纸片对应的 $\operatorname{SG}$ 函数值

显然 $1\times 1$, $1\times 2$, $2\times 1$, $3\times 1$, $1\times 3$ 的纸片是必败局面

另外

$$ \operatorname{SG}(m,n)=\operatorname{mex}S $$

其中, $S=S_1\cup S_2$

$$ S1=\bigcup{i=1+[n=1]}^{\lfloor\frac{m}{2}\rfloor}{\operatorname{SG}(i,n)\oplus\operatorname{SG}(m-i,n)} $$

$$ S2=\bigcup{i=1+[m=1]}^{\lfloor\frac{n}{2}\rfloor}{\operatorname{SG}(m,i)\oplus\operatorname{SG}(m,n-i)} $$

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/J.cpp %} </details>

K - Travel Expense

题意简述

给出 $n$ 个点 $m$ 条边的无向图, 定义 $d(u,v)$ 为点 $u$ 到点 $v$ 的最短路长度, 有 $q$ 次询问, 每次给定 $s,t,b$, 问满足 $\sum_{i=1}^{d(s,t)}k^i\leqslant b$ 的最大的 $k$ 是多少

解题思路

显然 Floyd+二分, 需要注意不要去求 $k^{d(s,t)}$, 会爆int64_t

复杂度

$O(n^3+q\log B\log n)$, 其中 $B$ 表示所有询问中最大的 $b$

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/K.cpp %} </details>

L - WZB's Harem

题意简述

解题思路

模数出锅还不修是真的 np

复杂度

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:cpp icpc-cjxp2020/L.cpp %} </details>

M - Zoos's Animal Codes

解题思路

签到题


  1. 打*的是还没写的题

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