抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

感觉 tf 的时候还是打几场 VP 好……

加 * 号的是当场过掉的,这样以后复习可以用。

Codeforces Round #472 (rated, Div. 1, based on VK Cup 2018 Round 2)

*A. Mystical Mosaic

题意好难翻译啊,那就不翻译了吧。

反正直接模拟就可以了。

代码:58555087

*B. Three-level Laser

题目大意是给你一个长度为 n(n105)n(n\le 10^5) 的严格递增的正整数序列 {E}\{E\},让你求i<j<ki<j<k 使得 EkEiUE_k-E_i\le Uη=EkEjEkEi\eta=\frac{E_k-E_j}{E_k-E_i}最大。

考虑到严格递增应该是单调性问题。

显然如果 iikk固定,那么 η\etaEjE_j负相关,于是i=j1i=j-1

然后考虑枚举 iikk,直接把上面的 EkE_k 去掉即可:η=EkEjEkEi=EkEi+EiEjEkEi=1+EiEjEkEi\eta=\frac{E_k-E_j}{E_k-E_i}=\frac{E_k-E_i+E_i-E_j}{E_k-E_i}=1+\frac{E_i-E_j}{E_k-E_i}

二分一下就好了。

代码:58555515

*C. Riverside Curio

题意大概就是有一个人每天去看一条河的水位,每次在水位上画一条线,并记录下严格高于当前水位的线有几条,记为 mim_i。令第ii 天严格低于当前水位的线有 did_i 条,求 di\sum d_i 的最小值,n105n\le 10^5

显然最少有 max{mi}\max\{m_i\} 条线,然后我们找到这个位置,然后往两边跑。往后跑就直接模拟即可,因为之后是不会画新的线了。往前跑相当于是删线,显然是能删就删,维护一下前缀 max\max 即可。

代码:58556096

D. Contact ATC

题意是说有 n(n105)n(n\le 10^5) 架飞机在一条数轴上飞,坐标为 xix_i,速度为viv_i,有xivi<0x_iv_i<0(往原点飞),现在可能有一速度为vv 的风,只能预测出v[w,w]v\in [-w,w],当然保证vi<w|v_i|<w。求有多少对飞机可能同时到达原点。

感觉自己好菜啊,推式子发现是跟斜率相关的一个东西,然后惊喜地发现这好像是道计算几何,然后码了一年……

我们考虑计算出飞机到达原点的时间 ti[li,ri]t_i\in [l_i,r_i],考虑到风速与时间是呈一个一次函数的关系,画图便可知道如果是相向飞行的飞机i,ji,j,只要[li,ri][lj,rj][l_i,r_i]\cap[l_j,r_j]\neq \empty 即可,如果是同向的飞机 i,ji,j,只要[li,ri][lj,rj][l_i,r_i]\subseteq[l_j,r_j][li,ri][lj,rj][l_i,r_i]\supseteq[l_j,r_j]即可。

然后就变成了一个二维数点问题。

代码:58560521

E. Wardrobe

题解写在了 另一篇文章里

F. Minimal Subset Difference

太菜了,不会。

Codeforces Round #539 (Div. 1)

*A. Sasha and a Bit of Relax

题意大概就是给你一段长度为 n(n3×105)n(n\le 3\times 10^5) 序列 {a}(0ai<220)\{a\}(0\le a_i< 2^{20}),求有多少个区间[l,r][l,r] 使得 rl+1r-l+1 是偶数且 i=lmai=i=m+1rai\bigoplus_{i=l}^{m}a_i=\bigoplus_{i=m+1}^{r}a_i,其中m=l+r12m=\frac{l+r-1}{2}\bigoplus 是指xor

显然只要 i=lrai=0\bigoplus_{i=l}^r a_i=0 即可,然后开个桶算。

代码:58788064

*B. Sasha and One More Name

题意是给你一个回文串s(1s5000)s(1\le |s|\le 5000),求最小割多少刀然后重组变成一个不同的回文串,无解输出Impossible

显然答案只有 1122Impossible 三种,Impossible直接判,11直接暴力枚举,剩下来的都是22

代码:58788424

C. Sasha and One More Name

数据结构题,直接抄了 这篇博客 的翻译:

维护以下三种操作

  1. 1 t s:在时刻 tt 插入命令ss。保证任意操作后,任意时刻至多只有一个命令。
  2. 2 t:删除时刻 tt 的命令。
  3. 3 l r v:求最小的t[l,r]t\in [l,r],使得f(t)=0f(t)=0

其中

f(t)=v+ltg(x)dxf(t) = v+\int_l^t g(x) \mathrm{d} x

其中设在 [l,r]\left[l,r\right] 时间内的命令依次为(t1,s1),,(tm,sm)(t_1, s_1), \dots, (t_m, s_m),则:

g(t)={0lt<t1s1t1t<t2sktkt<tk+1smttm.g(t) = \begin{cases} 0 & l \leq t < t_1 \\ s_1 & t_1 \leq t < t_2 \\ \dots \\ s_k & t_k \leq t < t_{k+1} \\ \dots \\ s_m & t \geq t_m \end{cases}.

若不存在,则返回1−1

题解留坑吧……

Codeforces Round #578 (Div. 2)

打了场 Div. 2 感觉自己心情舒畅,然鹅还是自闭了……

话说我的 hash 好菜啊,为什么一定要打双哈希啊……

自闭了:

*A. Hotelier

直接模拟就可以了。

代码:58884080

*B. Block Adventure

还是直接模拟就可以了。

代码:58884001

*C. Round Corridor

大概就是有类似这样的一个圆形屋子,内层有 nn 格,外层有 mm 格,每层都有一面墙在 1212 时的位置,每格大小均匀。内外层没有墙,但每层格子与格子之间有墙。多次询问 (sx,sy)(s_x,s_y)(ex,ey)(e_x,e_y)询问着两个格子能否相互到达。

n,m1018,q104n,m\le 10^{18},q\le 10^4

显然可以把这个环形分成一段一段,每段都相连且独立(与其他格子不连通)。

假设一段有 xx 个内层格子与 yy 个外层格子,那显然有 nx=my\frac{n}{x}=\frac{m}{y},即ny=mxny=mx,我们需要找到最小的x,yx,y,也就是ny=mx=lcm(n,m)=nmgcd(n,m)ny=mx=\mathrm{lcm}(n,m)=\frac{nm}{\gcd(n,m)},也就是x=ngcd(n,m),y=mgcd(n,m)x=\frac{n}{\gcd(n,m)},y=\frac{m}{\gcd(n,m)},然后每次O(1)\mathcal{O}(1) 判断两个点是否在同一联通块中即可。

代码:58883764

*D. White Lines

题意是有一块 n×nn\times n 的画布,有一些像素点是 W,有一些是B,你可以将一个k×kk\times k 的子矩阵中所有的 B 全部变成W,问做多能有多少行列是全白色的,n2000n\le 2000

我们考虑行和列分开来看,我们令 fi,jf_{i,j} 表示左上角在第 ii 行第 jj 列,会把多少原来不是全白的行变成全白的行,同理可以定义 gi,jg_{i,j} 表示会把多少原来不是全白的列变成全白的列。当然,为了复制粘贴方便,代码中把 gi,jg_{i,j} 定义为了左上角在第 jj 行第 ii 列。

由于转移是对称(行和列的方程一样)的,所以我们就仅考虑行。我们考虑要把一行变成全白,必须把该行上最左边的黑色格子和最右边的黑色格子全部覆盖到,所以对于每行我们可以 O(1)\mathcal{O}(1) 计算。

我们考虑先 O(nk)\mathcal{O}(nk) 暴力算出 f1,jf_{1,j},然后每次计算fi,jf_{i,j} 考虑增加第 i+k1i+k-1 行的贡献并删除第 i1i-1 行的贡献即可。

这样复杂度就是 O(n2)\mathcal{O}(n^2) 的了。

代码:58884654

E.Compress Words

题目大意是有 nn 个字符串sis_i,从左往右依次合并每一个字符串,就是找到之前合并完的串的最长后缀使其是要合并的那个串的前缀,输出最终合并完的串,n105,si106n\le 10^5,\sum|s_i|\le10^6

直接哈希就可以了,复杂度O(n)\mathcal{O}(n)……

大概需要双哈希,我的单哈希wa on 66

代码:58886006

Codeforces Round #589 (Div. 2)

又是一场愉快的 Div. 2。

可惜窝还是爆蛋了……

*A. Distinct Digits

直接模拟即可……

代码:61680483

*B. Filling the Grid

直接模拟即可……

代码:61680658

*C. Primes and Multiplication

题目大意有点复杂,然后我就看错了一年的题……

定义 prime(x)\mathrm{prime}(x) 表示 xx 的质因子集合,g(x,p)g(x,p)表示最大的pkx(kN)p^k\mid x(k\in \mathbb{N})f(x,y)=kprime(x)g(y,k)f(x,y)=\prod_{k\in \mathrm{prime}(x)}g(y,k),求i=1nf(x,i)\prod_{i=1}^nf(x,i)。(x109,n1018x\le 10^9,n\le 10^{18}

考虑到全是乘法,显然满足交换律。

所以我们对每个质因子分开来求,最后乘起来即可。

我们考虑质因子 kk,显然1k11\sim k-1 的区间贡献是 11kk21k\sim k^2-1 的贡献是 kkk2k31k^2\sim k^3-1 的贡献是k2k^2……

然后不难发现只有 log\log 个这样的区间,所以总复杂度O(x+logxlogn)\mathcal{O}(\sqrt x + \log x\log n)

代码:61681335

*D. Complete Tripartite

n(3n105)n(3\le n\le 10^5) 个点 m(0mmin(3105,n(n1)2))m(0\le m\le \min(3\cdot 10^5,\frac{n(n-1)}{2})) 条边的无向无自环无重边图,需要对每条边染色(1,2,31,2,3),使得每种颜色自己的点之间没有边,其余的必须两两有边,求一种方案或无解。

直接模拟即可……

代码:61681851

*E. Another Filling the Grid

有一个 n×nn\times n 的矩阵,需要将每个格子用 1k1\sim k 的数字填充,要求每行每列都有至少一个11,求方案数。n250,k109n\le 250,k\le 10^9

O(n3)\mathcal{O}(n^3)dp 很好想,直接令 fi,jf_{i,j} 表示到第 ii 行已经有 jj 列有11

考虑转移,枚举一个 tt 表示这一列之前有多少列有 11,那么这些格子可以乱填,为ktk^t。其中jtj-t 个格子只能填11,其余格子不能填11。这样直接转移过去即可。

由于每一行也至少要有一个 11,所以转移时一行中没有一个11 的方案数减掉即可。

代码:61682746

结果一看题解发现复杂度可以更优。

我们考虑容斥,有 iijj列没有11,所以答案就是:

i=0n(1)i(ni)j=0n(1)j(nj)k(ni)(nj)(k1)ni+njij\sum_{i=0}^n(-1)^i\binom{n}{i}\sum_{j=0}^n(-1)^j\binom{n}{j}k^{(n-i)(n-j)}(k-1)^{ni+nj-ij}

当然写的好看一点也可以是:

i=0nj=0n(1)i+j(ni)(nj)k(ni)(nj)(k1)ni+njij\sum_{i=0}^n\sum_{j=0}^n(-1)^{i+j}\binom{n}{i}\binom{n}{j}k^{(n-i)(n-j)}(k-1)^{ni+nj-ij}

这样就可以 n2lognn^2\log n 啦!

然后我们考虑继续优化。

我们观察后面那只\sum

j=0n(1)j(nj)k(ni)(nj)(k1)ni+njij\sum_{j=0}^n(-1)^j\binom{n}{j}k^{(n-i)(n-j)}(k-1)^{ni+nj-ij}

我们发现她可以转换成一个二项式展开的形式,也就是把后面的 (k1)ni+njij(k-1)^{ni+nj-ij} 看成是(k1)i(nj)(k1)nj(k-1)^{i(n-j)}\cdot(k-1)^{nj}

j=0n(nj)(kni(k1)i)nj((k1)n)j=(kni(k1)i(k1)n)n\sum_{j=0}^n\binom{n}{j}\left(k^{n-i}(k-1)^i\right)^{n-j}\left(-(k-1)^n\right)^j=\left(k^{n-i}(k-1)^i-(k-1)^n\right)^n

于是最终答案就变成了:

i=0n(1)i(ni)(kni(k1)i(k1)n)n\sum_{i=0}^n(-1)^i\binom{n}{i}\left(k^{n-i}(k-1)^i-(k-1)^n\right)^n

复杂度O(nlogn)\mathcal{O}(n\log n)

评论