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\)的出度,那么有如下转移:
令\(g_u\)表示从\(u\)到\(n\)的期望花费,有:
移项在拓扑序上转移即可。
E. K Sum
题意:
定义一个函数:
再给出\(n(1 \leq n \leq 10^9), k(2 \leq k \leq 10^{10^5})\),计算下式:
思路:
对于函数\(f_n(k)\),我们考虑\(k = 2\)的情况,莫比乌斯反演有:
令\(T = id\),那么有:
那么推广到\(k\),即是:
那么对于\(\sum\limits_{i = 2}^k f_n(i)\),有:
那么对\(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\)的机洗时间小于等于手洗时间,这个手洗时间也有可能成为答案的,不要忽略掉。
还要注意边界,可能所有人都是手洗,所有人都是机洗