Educational Codeforces Round 80 (CF1288)

Educational Codeforces Round 80 (CF1288)

A. Deadline

题意

给出正整数 \(n,d\),求不等式 \(x+\lceil \frac{d}{x+1}\rceil \le n\) 是否有非负整数解。

思路

先不考虑上取整,

\[x+ \frac{d}{x+1} = x+1+\frac{d}{x+1} -1 \ge 2\sqrt d -1 \]

当且仅当 \(x+1=\frac{d}{x+1}\)\(x=\sqrt d - 1\) 时取得最小值。

我们只需要判断最小值是否小于 \(n\) 即可。

加上上取整后,最小值一定在 \(x=\lfloor \sqrt d \rfloor - 1\)\(\lceil \sqrt d \rceil - 1\) 时取到。

只用代入并判断是否成立即可。

B. Yet Another Meme Problem

题意

给出正整数 \(A,B\),求有多少对 \((a,b)(1\le a\le A,1\le b \le B)\)

满足 \(a \times b + a + b = conc(a,b)\)\(conc(a,b)\) 表示 \(a,b\) 拼接后形成的数。

思路

\[conc(a,b)=10^{\log_{10}b+1} a+b \]

左右同减 \(b\) 得:

\[a \times b+a = 10^{\log_{10}b+1}a \]

同除 \(a\) 得:

\[b+1=10^{\log_{10} b+1} \]

\(b\) 就等于 \(9,99,999,\dots\),容易发现 \(n\) 以内这些数的个数为 \(\lfloor\log_{10}(n+1)\rfloor\)

对于这些 \(b\),所有 \(a\) 都能与它们配对,所以答案为:

\[\lfloor\log_{10}(B+1)\rfloor \times A \]

C. Two Arrays

题意

给出正整数 \(n,m\),求数列 \((A,B)\) 的个数,满足:

\(|A|=|B|=m\)\(1 \le A_i \le B_i\le n\)\(A\) 不减,\(B\) 不增。

答案对 \(10^9+7\) 取模。

思路

定义 \(dp_{i,j,k}\) 表示考虑前 \(i\) 个位置,\(A_i=j,B_i=k\) 的方案数。

答案为 \(\sum_{i=1}^n \sum_{j=i}^{n} dp_{m,i,j}\)

转移方程:

\[dp_{t,i,j} = \sum_{k=1}^{i} \sum_{l=j}^{n} dp_{t-1,k,l} \]

状态数 \(O(mn^2)\) 转移 \(O(n^2)\),总时间复杂度 \(O(mn^4)\),考虑优化。

发现转移可以使用二维前缀和优化至 \(O(1)\) (左上角 \((1,j)\),右下角 \((i,n)\) 的矩形和),总时间复杂度 \(O(mn^2)\)

D. Minimax Problem

题意

给出正整数 \(n,m\),和 \(n\) 个长度为 \(m\) 的序列。

可以选择两个序列 \(i,j\) 组合出新的序列 \(b\) 满足 \(b_k=\max(a_{i,k},a_{j,k})\)

\(\min b_i\) 的最大值。

思路

看到最小值最大可以想到二分。

考虑二分答案 \(x\),根据题意,\(a_{i,k}\)\(a_{j,k}\) 中至少有一个大于等于 \(x\)

又看到 \(m\le 8\) 可以想到装压,把每个序列压成一个 \(m\) 位二进制数 \(S\)

\(i\) 位代表 \(a_i\) 是否大于等于 \(x\)

两个序列满足答案即 \(S_i \text{ or } S_j = 2^m-1\)

显然无法直接枚举两个序列,可以转化为枚举两个状态并判断是否存在。

时间复杂度:\(O(\log W (nm+4^m))\)

E. Messenger Simulator

题意

给出正整数 \(n,m\) 和长度为 \(m\) 的序列 \(A\)

有长度为 \(n\) 的序列 \(B\),初始时 \(B_i=i\)

对于每个 \(A_i\),把 \(B\)\(A_i\) 移动到第一位。

求每个数在 \(B\) 中出现过的最大位置和最小位置。

思路

在序列开头插入,会使部分数的位置改变,不便于维护。

由于插入的次数固定为 \(m\),我们可以先在 \(B\) 序列前预留 \(m\) 个空位出来插入。

\(A_1\)\(A_m\)\(m\)\(1\) 倒着插入。

这样确实方便了插入,但查询数的真实位置(去除空位)变得复杂。

数的真实位置为该数在 \(B\) 序列中的位置及前面位置中数的个数,用树状数组维护。

插入数和维护树状数组的同时更新答案。

时间复杂度:\(O(n+m\log(n+m))\)

posted @ 2024-11-11 22:50  maniubi  阅读(2)  评论(0编辑  收藏  举报