停课记录 2020.10.21(Day6)

目录

停课记录 2020.10.21

想不到吧两篇一块写的。

模拟赛内容

A. 蛋爆爆

叠词词,恶心心

手玩一下第二个样例可以找到规律:对于每个点按照 \(height\) 把儿子排序,求出 \(dfs\) 序,对于 \(dfs\) 序上相邻的两个点 \(d_i,d_{i+1}\),答案就是 \(min(dis(d_i,d_{i+1}),dep(d_{i+1}))\)。加起来即可。

当然也可以树形 \(dp\),开一维 \(0/1\) 表示回不回到 \(i\),就很方便转移了。

代码-规律 (众所周知 $n\log $ 过不去 \(1e6\),自闭了qaq)

代码-dp

C. 底垫垫

两题放一块是我今天比赛情况 o(╥﹏╥)o

这题是 戴言题

有一个题解的 pdf,又是不知道咋上传的一天。

自主做题

今天板刷 CF 的一天。由于我是限难度板刷,然后就恰好刷到了同一个比赛(1427)的三题

C. The Hard Work of Paparazzi

一个 \(R\times R\) 的矩形上有 \(n\) 个点,你初始在 \((1,1)\)。每个点 \(P_i\) 除了给你位置外还有一个时间 \(t\),当你在 \(t\) 时刻到这个点的时候,你就可以给小青蛙+1s。问你能给小青蛙加几秒。 \(R\le 500,n\le 1e5\)

你走路方式是上下左右四个相邻的走(也就是曼哈顿距离)。可以停下来。保证给定的 \(t\) 是 严格单增 的。

看到 严格单增 我想到的是去年普及 T2。这题其实也有类似的性质,设 \(dp[i]\) 表示到第 \(i\) 个点最多续几秒。然后对于 \(i-2R\) 前面的所有 \(dp\) 值就都可以直接继承了(在这个矩形上走 \(2R\) 步哪里都能到,显然)

然后中间这些 \(dp\) 需要判断一下,假设转移点为 \(j\),是否 \(dis(P_i,p_j)\le t_i-t_j\)。如果是的话,就可以多续一秒。

我们发现这样的复杂度从 \(n^2\) 降到了 \(nR\) ,就可以过了。注意一个细节就是你其实是可以从 \((1,1)\) 这个点开始转移的,为了方便可以令它为 \(P_0\),转移的时候考虑一下 \(j=0\)。

代码

D. Unshuffling a Deck

傻逼构造

E. Xum

构造好题。

你有一个 \(x\),为奇数,\(\le 1e5\)。初始时黑板上写着 \(x\)。每次你可以选择两个数 \(a,b\),满足它们都在黑板上并且不同,然后你可以写下 a+ba^b 在黑板上,你的目标是写上一个 \(1\) 。构造方案。操作数不能超过 \(10^5\)。

首先明确几个显然的事实。

  • 可以实现左移(自己加自己即可)
  • 可以实现乘法 \(a\times k\),其中 \(a\) 在黑板上有,\(k\) 任意 (这个就先把 \(a\) 不断的左移,然后把 \(k\) 二进制拆分,累加即可)
  • 如果 \(x\) 是偶数,那么 x^(x+1)==1,这个够显然吧

然后我们发现 \(x\) 一定和 \(2^k\) 互质,因为它是奇数。那么我们只要写上一个 \(2^k\),求一遍 \(exgcd\),做俩乘法得到一个 \(x\) 多少倍和一个 \(2^k\) 多少倍,差为 \(1\)。俩异或起来就得到 \(1\) 了。

关键是如何写出这个 \(2^k\)。

注意到这样一个事情。如果我们能把 \(x\) 的最后一位删掉,然后让它和 \(x\) 异或一下,就能得到一个 \(1\)。

对于一个 \(x\times 2^k\),我们如果能把它最后一位删掉,再和 \(x\times 2^k\) 以后一下,就能得到一个 \(2^k\)。

如何删掉呢?我们把 \(x\) 不断左移,使得它的最后一位和 \(x\) 最高位对齐,设这时候为 \(x_2\)。然后 \(x_2\) 异或一下 \(x\),得到 \(x_3\)。你就会发现它原来的最后一位的 \(0\) 没了。

但离 \(2^k\) 还差得远。

令 \(x_2+x_3\) 得到 \(x_4\)。我们发现高的几位它们都相同,这一段相当于左移了。然后上一次说变成 \(0\) 的那一位,因为加了 \(x_2\),又变成了 \(1\)。

我们发现这东西长度正好两半,前面是 \(x-1\),后面是 \(x\)。

接下来就好办了,把 \(x\) 左移过去(其实就是 \(x2\) 左移一个),和它异或一下;再让它异或一下 \(x\),它就只剩一位,变成了 \(2^k\)。

举个例子,\(x=100110110111\),二进制。

 100110110111            x2
            100110110111 x1
 10011011011000110110111 x3
100110110110100110110111 x4

↑ 这是我在小本本上打的草稿qaq

我们发现 \(x_4\) 这个玩意就是前面是 \(x-1\) 后面是 \(x\) 了,两次异或即可。

然后这个做法似乎在 \(x\) 全 \(1\) 的时候有锅?我可能没想明白,反正特判了一下。

关于操作数,实际上只有做乘法暴力拆二进制的时候带一个 \(\log\),所以操作数的规模是 \(\log\) 的。但是好像我写的麻烦,要做很多遍。反正 \(1e5\),问题不大。

PS:最开始先搞一个 x^x 得到 \(0\),方便累加和

代码

上一篇:python学习之路day6


下一篇:java基础day6