The Preliminary Contest for ICPC Asia Nanjing 2019

Contest Info


[Practice Link](https://www.jisuanke.com/contest/3004?view=challenges)
Solved A B C D E F G H I
7/9 O O - Ø O O - O Ø
  • O 在比赛中通过
  • Ø 赛后通过
  • ! 尝试了但是失败了
  • - 没有尝试

Solutions


A. The beautiful values of the palace

题意:
给出一个\(n \cdot n\)的矩阵,里面的数字是\([1, n^2]\)的蛇形排列,现在选定\(m\)个格子,这\(m\)个格子的价值是其位置上的数字的数位之和,其他格子的价值为\(0\),现在有\(q\)次询问,每次询问一块矩形区域的价值。

思路:
只需要处理出知道\((x, y)\)便可以知道上面的数字,那么剩下的部分就是经典的扫描线问题。

B. super_log

题意:
给出\(a, b, m\),其中\(1 \leq a, m \leq 10^6, 0 \leq b \leq 10^6\)
计算\(a^{a^{\cdots^{a}}}\),幂次上有\(b\)\(a\)

思路:
广义欧拉定理降幂即可。

D. Robots

题意:
在一张\(DAG\)上,保证只有一个入度为\(0\)的点,其标号为\(1\),只有一个出度为\(0\)的点,其标号为\(n\),现在机器人从\(1\)出发,等概率的选择一个点往下走或者停留在原地。
花费的代价为从开始到现在经过的时间,问到\(n\)的花费的期望。

思路:
\(f_u\)表示从\(u\)\(n\)经过的期望天数,\(d_u\)表示\(u\)的出度,那么有如下转移:

\[\begin{eqnarray*} f_u = \frac{f_u}{d_u + 1} + \frac{\sum f_v}{d_u + 1} + 1 \end{eqnarray*} \]

\(g_u\)表示从\(u\)\(n\)的期望花费,有:

\[\begin{eqnarray*} g_u = \frac{g_u}{d_u + 1} + \frac{\sum g_v}{d_u + 1} + f_u \end{eqnarray*} \]

移项在拓扑序上转移即可。

E. K Sum

题意:
定义一个函数:

\[\begin{eqnarray*} f_n(k) = \sum\limits_{l_1 = 1}^n \sum\limits_{l_2 = 1}^n \cdots \sum\limits_{l_k = 1}^n (gcd(l_1, l_2, \cdots, l_k))^2 \end{eqnarray*} \]

再给出\(n(1 \leq n \leq 10^9), k(2 \leq k \leq 10^{10^5})\),计算下式:

\[\begin{eqnarray*} \sum\limits_{i = 2}^k f_n(i) \bmod 10^9 + 7 \end{eqnarray*} \]

思路:
对于函数\(f_n(k)\),我们考虑\(k = 2\)的情况,莫比乌斯反演有:

\[\begin{eqnarray*} f_n(2) &=& \sum\limits_{i = 1}^n \sum\limits_{j = 1}^n gcd(i, j)^2 \\ &=& \sum\limits_{d = 1}^n d^2 \sum\limits_{i = 1}^n \sum\limits_{j = 1}^n [gcd(i, j) == d] \\ &=& \sum\limits_{d = 1}^n d^2 \sum\limits_{i = 1}^{\left\lfloor n / d \right\rfloor} \mu(i) {\left\lfloor \frac{n}{id} \right\rfloor}^2 \end{eqnarray*} \]

\(T = id\),那么有:

\[\begin{eqnarray*} f_n(2) &=& \sum\limits_{T = 1}^n {\left\lfloor \frac{n}{T} \right\rfloor}^2 \sum\limits_{d \;|\; T} d^2 \cdot \mu(\frac{T}{d}) \end{eqnarray*} \]

那么推广到\(k\),即是:

\[\begin{eqnarray*} f_n(k) &=& \sum\limits_{T = 1}^n {\left\lfloor \frac{n}{T} \right\rfloor}^k \sum\limits_{d \;|\; T} d^2 \cdot \mu(\frac{T}{d}) \end{eqnarray*} \]

那么对于\(\sum\limits_{i = 2}^k f_n(i)\),有:

\[\begin{eqnarray*} \sum\limits_{i = 2}^k f_n(i) &=& \sum\limits_{i = 2}^k \sum\limits_{T = 1}^n {\left\lfloor \frac{n}{T} \right\rfloor}^i \sum\limits_{d \;|\; T} d^2 \cdot \mu(\frac{T}{d}) \\ &=& \sum\limits_{T = 1}^n \sum\limits_{i = 2}^k {\left\lfloor \frac{n}{T} \right\rfloor}^i \sum\limits_{d \;|\; T} d^2 \cdot \mu(\frac{T}{d}) \end{eqnarray*} \]

那么对\(T\)数论分块即可,\(\displaystyle {\sum\limits_{i = 2}^k {\left\lfloor \frac{n}{T} \right\rfloor}^i}\)这个是一个等比数列求和。
那么再考虑如何计算\(g(T) = \sum\limits_{d \;|\; T} d^2 \cdot \mu(\frac{T}{d})\)的前缀和。
这个显然是一个积性函数,我们配一个\(h(T) = 1\),那么有\((g * h)(T) = (id^2 * \mu * 1) = id^2\),筛筛筛即可。

F. Greedy Sequence

题意:
给出一个全排列,第\(i\)轮操作,令\(a_1 = i\),接下来每次可以从\(a_i\)所在全排列的附近\(k\)个位置选择一个\(< a_i\)的数作为\(a_j\),直到附近\(k\)个位置没有\(< a_i\)的数,要求字典序最大,对于每个\(i\),求出第\(i\)轮的操作次数。

思路:
显然可以从小到大推,令\(f_i\)表示第\(i\)轮操作的答案,那么我们对于当前的\(j\),我们找到附近\(k\)个位置中\(< a_j\)并且最大的数\(i\),那么\(f_j = f_i + 1\)
找附近\(k\)个位置\(< a_j\)的最大的数,可以用\(std::set\)维护滑动窗口再二分查找。

H. Holy Grail

I. Washing clothes

题意:
\(n\)个人需要洗衣服,第\(i\)个人会在\(t_i\)时刻到达。
但是只有一台洗衣机,洗衣机洗衣的时间是\(x\),每个人手洗的时间为\(y\),现在对于所有的\(x \in [1, y]\),求出最少的时间使得所有人都能洗完衣服。
洗衣机同时只能洗一件衣服,手洗可以同时洗,一件衣服只能被洗衣机洗或者手洗,不能手洗一下洗衣机洗一下。

思路:
按到达时间从大到小枚举从谁开始手洗,显然到达时间小于等于这个人的到达时间的都是手洗,其他都是机洗。
我们假设从大到小的到达时间为\(t_1, t_2, \cdots, t_n\),假设我们当前枚举\(t_3\)开始手洗,那么机洗的时间为\(max_{i = 1}^2 t_i + xi\)
并且我们用一根指针枚举\(x\),我们发现如果在某一刻,机洗的时间大于手洗的时间,\(x\)显然要减减,这些\(x\)的答案不会小于当前枚举的\(t_j\)的手洗时间
直到\(x\)减到当前时刻的机洗时间小于等于手洗时间即可。
那么怎么计算机洗时间?
我们发现\(t_i + ix\)是一根直线,并且具有单调性,直接维护一个凸壳即可。
但是要注意的是,对于当前时刻\(t_i\),如果\(x\)的机洗时间小于等于手洗时间,这个手洗时间也有可能成为答案的,不要忽略掉。
还要注意边界,可能所有人都是手洗,所有人都是机洗

posted @ 2019-09-02 10:18  Dup4  阅读(628)  评论(0编辑  收藏  举报