十重塔

其实是 duel 记录,但是不知道为啥想起名为《十重塔》,可能是叠谜做魔怔了。

难度 \([2600,2700]\)

目前战绩 wsc 16:17 grg,容易发现 grg 显然比我牛。

  • CF201E,wsc 胜,1:0

问题等价于,一个 \(n\)\(k\) 列的 \(01\) 矩阵,每行有不超过 \(m\)\(1\),使得每一列组成的二进制数不同,求 \(k\) 的最小值。

考虑二分 \(k\),现在判断 \(k\) 列能区分的行数是否 \(\ge n\)。我们观察到,每行 \(1\) 个数不超过 \(m\) 等价于所有的 \(1\) 个数不超过 \(mk\)(做的时候没证明)。

证明:假设当前状态总个数不超过 \(mk\) 且有一行超过 \(m\) 个,那么取出这一行,设为行 \(x\),再找出一行个数 \(<m\)(显然一定存在),设为行 \(y\),考虑将某一位上 \(x,y\) 调换,其中 \(x\)\(1\)\(y\)\(0\),且交换后维持二进制数两两不变。不难发现满足 \(x=1,y=0\) 的数一定比 \(x=0,y=1\) 的数多(具体可以考虑去掉 \(x=0,y=0\)\(x=1,y=1\) 的数,此时 \(x,y\)\(1\) 数量差不变,那么 \(x=1\)\(y=1\) 多),因此可以交换使得 \(\sum\limits _{i=1}^{n} \max (m-c_i,0)\) 变小,一定在有限次操作后结束。

那么考虑贪心,按照 popcount 一次从小到大填,每次可以放的个数是二项式系数,预处理较小一部分,暴力乘法算大的部分。复杂度 \(\mathcal O(\log ^2n)\)

  • CF1091F,grg 胜,1:1

这题是真没想到,服输。

考虑反悔贪心,每一段优先飞,用堆维护前面飞过的所有路程可以累计能量的方式。每次飞了能量不够了就从堆中依次用代价最小的补充。补充有两种方式,第一种是把飞的变成走的,第二种是来回走。

  • CF566B,grg 胜,1:2

这个题我先想出做法的,但是 grg 的乱搞误打误撞对了,写的比我快,把我爆了。

发现每次找任意一个能做的操作做就是对了。证明略。

因此拿个 set 或者啥维护即可。

  • CF1354G,wsc 胜,2:2

这我都会,真牛逼。

首先,我们可以用 \(\mathcal O(\log n)\) 次操作确定一个位置是 rock 还是 gift,具体来说,随机这么多个位置问一遍,由于 rock 是绝对众数,这样的正确率是对的。

那么我们可以先问出第一个位置是 rock 还是 gift,如果是 gift,那么答案已经确定。否则,我们可以利用这个 rock,每次倍增地问询一个前缀 \([1,2^k],[2^k+1,2^{k+1}]\) 以确定 \([2^k+1,2^{k+1}]\) 这段区间有没有 gift。

现在确定了这样一个范围,就可以二分了,因为长度足够短,可以用 \([1,2^k]\) 那段来判断。总次数 \(3\log n\),还多 \(20\) 次可以放在第一部分的判断以提升正确率。

  • CF1805F1,wsc 胜,3:2

这个题,憋。

首先单次操作可以做到 \(\mathcal O(n\log n)\),具体而言,对于每个 \(i\) 维护合法 \(j\) 的一个堆,每次取出堆顶转移(异或粽子 trick),现在的主要问题是没法取模,一取模大小关系就错了。

我们进行一个神秘操作:在每次结束后,把整个序列平移,使最小值为 \(0\),设偏移量为 \(d\),那么对答案贡献 \(d\times 2^{n-1}\)。然后就过了!

大致证明一下为啥这样是对的:首先正确性显然,其次对于操作前序列 \(a_1\dots a_n\) 和操作后序列 \(a'_1\dots a'_{n-1}\)\(a'_{n-1}\le a_{1}+a_{n-1}-(a_1+a_2)=a_{n-1}-a_2\),因此这样做的最大值是单调不增的,不会超过 int 范围。

  • CF1208F,grg 胜,3:3

这个题的 trick 很好,学到很多。

从后往前枚举 \(i\),考虑按位贪心,从高位到低位,如果当前位 \(a_i\)\(0\),那么看能否选出两个数,在保证高位符合条件的情况下当前位都为 \(1\),实际上是一个高维前缀和问题:要查询某个数的超集出现次数是否 \(\le 2\)

直接做高维前缀和固然可行,但是有一个极度好写的做法:每次暴力插入,维护 \(vis\) 表示当前位置是否在本轮插入被经过,再记录每个集合出现的次数。不难发现均摊下来每个点至多经过两次,复杂度 \(\mathcal O(2^nn)\),可以通过。

  • CF1493F,wsc 胜,4:3

这个题赢得有点莫名奇妙的...

首先发现行列是独立的,只要分别求出最短 period 就能计算答案。现在问题变成每次询问两个不相交的等长子串是否相等,求字符串的最短 period。

我们先弱化问题,假设可以询问相交子串,那么这是个典中典,分解质因数之后从小到大试除即可。

对于不相交这个限制,其实很好处理,倍增就可以了。但是有点卡次数的常数,所以注意对于每个相同质因子除掉一个之后,下一次问询的整串长度也可以同时除掉一个质因子,这样次数可以分析出来是正确的。

  • CF372D,wsc 胜,5:3

手速题。

考虑双指针,加点删点的虚树大小很好做,维护一个按照 dfs 序排序的 set,维护相邻点的距离之和,每次插入 / 删除就二分出前驱后继更新一下即可,时间复杂度 \(\mathcal O(n\log n)\)。(我把这个称为 archaeology trick)

  • CF1389F,grg 胜,5:4

我看题的时候只会一个巨烦的做法,被爆杀了。

最蠢的做法:二分图匹配,线段树优化建图。

正常的做法:线段树优化 dp,记录坐标扫到 \(i\),上一个选的是黑色 / 白色的线段 \(j\),转移的时候发现是一个前缀加,前缀 max 的问题,线段树维护即可。

巧妙的做法:贪心,把线段按照右端点排序,每次扫到一个线段时,如果可以匹配,我们应当和异色线段中右端点最小的匹配。维护两个 set 即可。

  • CF464D,wsc 胜,6:4

精度开 \(10^{-9}\) 真不是来搞笑的吗...

首先有一个显然的 \(n^2\) dp,其次观察到输出是实数,所以获得等级 \(\ge \sqrt n\) 的概率极低,因此设一个阈值后暴力即可。

  • CF1567F,wsc 胜,7:4

这是啥逆天啊。

题目是一个 2-SAT 的形式,对于 \(deg=0,2\) 的点直接连就行,对于 \(deg=4\) 的点,左和上连,右和下连就是对的!具体为啥懒得管了,这种 b 题还是少来点。

  • CF1730E,grg 胜,7:5

grg 有一个 \(\mathcal O(nV^{1/4}\log n)\) 的做法,可以看他的博客,我讲一下我的劣解。

考虑枚举每个位置作为最大值 \(a_i\) 的情况,枚举最小值 \(d\)(是其因数),现在要求的就是限制了左端点,右端点,包含至少一个 \(d\) 的方案数。

我们可以找到左右第一个 \(d\),左右第一个比 \(d\) 小的位置,然后相当于两边有一些位置合法,有一些位置不合法,要选出至少一个合法位置的方案数,可以容斥算。

由于这个题卡 \(\mathcal O(nd(V)\log n)\),所以你需要单调栈预处理出左右第一个比 \(d\) 小的位置,用你找到的第一个 \(d\) 查询即可。注意处理没有 \(d\) 之类的一些特殊情况,细节很多。

  • CF1379F1,wsc 胜,8:5

神秘题。

发现以 \((1,1)\) 为左上角划分出的每个 \(2\times 2\) 里恰好放一个 King。

观察 ban 掉一个位置会带来什么影响,那么其对应的 \(2\times 2\) 里另一个位置不可以放,进而推出一整个左上角 / 右下角都得放,那么现在只要维护每个位置是否必须放置即可,遇到 ban 必须放的位置的操作就输出无解。

既然是左上角 / 右下角覆盖,那么只需要维护每一行的最长前后缀即可,是一个前缀修改单点查询 max,用树状数组维护。

  • CF961F,grg 胜,8:6

我的字符串水平确实有点菜了,grg 强强。

你发现一件很厉害的事情:如果从小到大扩展,每次 border 长度增加不超过 \(2\)

这样直接暴力即可!每次从上界开始枚举答案,这样减少的次数也是 \(\mathcal O(n)\) 的,可以通过。

  • CF407D,wsc 胜,9:6

考虑从上往下做扫描线,维护每个区间能选到的上边界。每次会对一些位置的颜色做更新,然后用区间 dp 做一遍转移即可。时间复杂度和空间复杂度都是 \(\mathcal O(n^3)\)

  • CF457D,wsc 胜,10:6

一上来来个 \(2^t\) 糊我脸上,考虑 product trick,也就是将贡献拆解到每一种方案中选择全黑行列子集的方案数。

那么现在枚举选择的那个子集包含 \(r\)\(c\) 列,用组合数统计答案。

注意可能会爆炸,使用对数存储,算完之后 exp 回来。

  • CF772D,grg 胜,10:7

考虑高维前缀和,维护 0/1/2 次方的和。

哎,我蠢了啊,这个一开始想错很久。

  • CF868E,grg 胜,10:8

第一发提交比 grg 快了 eps 秒,结果我有一个数组开小了,立刻发现并在 eps+eps_2 秒后提交,结果两个人都过了,但是我输。

考虑“边 dp”:设 \(f_{i,j,k}\)\(u_i\to v_i\),两边分别有 \(j,k\) 个人的最小时间,转移直接背包即可。

  • CF444E,grg 胜,10:9

被爆了。

二分答案 \(x\),断开 \(\ge x\) 的边,问题变成每个点可以匹配到非自己所在连通块的点,判断二分图是否有完美匹配。

直接套用 Hall 定理即可。时间复杂度 \(\mathcal O(n\log n)\),如果用并查集代替二分可以做到 \(\mathcal O(n\alpha(n))\)

  • CF1369F,grg 胜,10:10

我咋四连跪了,没绷住。

首先可以用 dp 解决整体问题,现在的问题是如何判断一个局部问题的结果,也即对于每个游戏判断先手是否有必胜 / 必败策略。

如果上界是奇数,那么拿到偶数的人必胜,因为可以每次加上一还给对面,对面一定只能将其变为偶数还回来。

如果上界是偶数,要必胜就找 \(t/4\) 的必胜策略,要必败就找 \(t/2\) 的必胜策略。

  • CF388D,wsc 胜,11:10

总算打破四连跪,真如。

考虑对线性基计数。但是线性基也有可能会算重复,所以我们限定每一位如果作为某个基的最高位出现,那么限制其只能在这个基中出现,且更高位任意选择。

然后就能数位 dp 了,细节一大车。

  • CF991F,wsc 胜,12:10

发现最优表示不会有太多乘法,顶多形如 \(a^b\times c^d+e\)

而形如 \(a^b(b>1)\) 的数不会很多,直接枚举一遍,用 map 存一下即可。

  • CF1109E,wsc 胜,13:10

这种如来题好像确实我的胜率比较高一些...

发现没有逆元是唯一的问题,那么我们不如维护 \(mod\) 的所有质因子的出现次数,剩下的部分就能用 exgcd 搞出逆元了。那么直接硬上线段树就行了,时间复杂度 \(\mathcal O(n\log n\omega(n))\),实际上常数极大,需要努力卡一把常才能过。

  • CF1425B,grg 胜,13:11

我草我咋还没补。真菜!!!

  • CF1679F,wsc 胜,14:11

考虑对于每个等价类的字典序最小表示计数。

发现一个数字不能变小的充要条件是,对于每个 \(i\),设 \([j,i-1]\) 是最长的可以和 \(i\) 交换的后缀,那么 \([j,i-1]\) 中的所有数都大于等于 \(a_i\)

这样就成送分题了,考虑状压 dp,每次枚举下一位填啥,预处理一下每个状态的下一步转移,时间复杂度 \(\mathcal O(2^BBn)\),其中 \(B=10\),但是常数很小。

  • CF285E,grg 胜,14:12

这个题写慢了。

考虑容斥(二项式反演),即计算钦定了 \(k\) 个位置必须合法的方案数,最后容斥回去即可。

计算这个方案数就容易很多了:发现奇偶位置是独立的,那么我们可以设 \(f_{i,j,0/1}\) 为前 \(i\) 个数匹配了 \(j\) 个,上一个是否占用了这一位的匹配空位。然后再把奇偶位做一个卷积卷起来就行了,剩下来的位置可以随便填,还要成上一个阶乘。

时间复杂度 \(\mathcal O(n^2)\)。实际上这个做法好像不比奇偶放一起 dp 好写很多,但是常数确实有 1/3 左右。

  • CF1373G,grg 胜,14:13

又写慢了,难受哦,感觉确实是第一反应慢了加上还没完全想清楚就开写导致的,果然思维水平还是低人一等。

这东西一看就很二分图匹配,那么我们不妨考虑 Hall 定理,因此需要干的事情就是维护最大后缀,拿个线段树搞搞就行了。

可能还需要同时维护最后一个匹配点,那就再搞个可删堆弄弄就行了。

  • CF232C,wsc 胜,15:13

细节一车的题,能赢纯纯狗运。

考虑分治,对于两个点在同一个子图中的直接递归,对于跨子图的,会经过中间点走过去,因此需要另外计算每个大小的子图中该点走到 \(1\)\(n\) 的最短路,需要大量分讨,时间复杂度 \(\mathcal O(\log^2n)\)(实际上 log 的底数是 \(1.618...\),因为图的大小是斐波那契数列)

  • CF542D,grg 胜,15:14

我是如何在对面做法比我难写一百倍的情况下写得比对面慢的?

观察到 \(f(x)=\prod(1+p_i^{a_i})\),其中 \(x=\prod p_i%{a_i}\),因此我们可以立刻想到根号分治,对于 \(> \sqrt x\) 的质因子,顶多出现一个。那么可以考虑对于 \(\le \sqrt n\) 的部分爆搜,这部分复杂度不会超过 \(d(n)\),然后再对于 \(>\sqrt n\) 的部分,枚举一遍 \(\le \sqrt x\) 的质因子,复杂度很松的上界是 \(d(n)\pi(\sqrt n)\),实际上完全跑不满。

  • CF1153F,grg 胜,15:15

这个题我也太蠢了,一开始学多项式学魔怔了,直接开始乱糊多项式快速幂上去,结果被卡常了才回去搞了个不带 log 的正解。如果一开始就细致多分析一步肯定很快就搞出来了。

(这段全是大实话,没有一个字在假)首先,我是初中生,因此我对定积分相关知识的了解程度几乎为 \(0\),所以我们从乱搞样例开始解释如何通过。

不难发现 \(L\) 是没用的东西,最后乘一下就行了

首先我们先考虑样例,在 \([0,1)\) 上随机一条线段的期望长度是 \(\frac{1}{3}\) 这个结论确实人尽皆知,但是一看到样例解释一个二元的还带绝对值的玩意儿就感觉头痛。我们考虑计算每个点 \(x\) 被覆盖到的概率,那就是 \(l\le x\le r\) 的概率,随手一算发现是 \(2x(1-x)\),那么效仿样例,我们得知 \(\int_{0}^{1}2x(1-x)\text{dx}\) 即为答案。

接下来猜猜这个东西为啥是 \(\frac{1}{3}\),首先我们可以大胆乱猜 \(\int_l^r f(x)+g(x)=\int_l^r f(x)+\int_{l}^{r}g(x)\),那么所求即为 \(2\int_{0}^1x-2\int_{0}^{1}x^2\)

由于我真的不知道 \(\int_{0}^{1}x^2 \text{dx}\) 是多少,但是我们容易理解 \(\int_{0}^{1}x=\frac{1}{2}\),因为乱选一个数显然期望是一半。那么解个方程推出 \(\int_{0}^{1}x^2=\frac{1}{3}\)

接下来可以直接大胆猜测 \(\int_0^1x^k=\frac{1}{k+1}\)!然后还是考虑计算答案,现在把问题变成 \(n,k\) 而非 \(1,1\),枚举哪些覆盖到了,剩下没覆盖到,得到答案为 \(\int_{0}^{1}\sum\limits_{i\ge k}\binom{n}{i}(2x(1-x))^i(1-2x(1-x))^{n-i}\)

然后我们瞎写一个暴力展开, 再把每项求积分相加,发现样例过了!!!说明我们猜对了

那么就可以考虑计算了,不妨先设 \(a=2x(1-x)\),那么我们可以 \(\mathcal O(n^2)\) 得到这个关于 \(a\) 的多项式(枚举 \(i\),枚举 \(1-2x(1-x)\) 当中选了几个)。

然后接着展开,我们现在就是求 \(p\times (2x(1-x))^k\) 的系数,即 \(2^kpx^k(1-x)^k\),再次枚举 \(1-x\) 选了几个,也可以在 \(\mathcal O(n^2)\) 时间内解决。

然后就做完了。

  • CF1661F,grg 胜,15:16

被反超了啊!!

这个题会做了但是又想慢写慢了,真菜哦。

\(f(x,y)\) 为长度为 \(i\) 的段分成 \(j\) 段的最小代价,发现对于固定的 \(x\)\(f(x,y)\) 是凸函数,即差分数组单调不增。

那么现在假设给定了最终的个数,我们就可以轻松地贪心求出最小距离:具体来说,维护一个大根堆,表示目前各个段的 \(\Delta\),每次取出最大的 \(\Delta\),把后一个 \(\Delta\) 放进去。

回到原问题。我们考虑二分最后一次取出的 \(\Delta\),这样就可以计算出当前的最小代价,在得到这个 \(\Delta\) 之后,我们就可以枚举每一段,求出这一段要放置的数量了。但是这样可能会导致答案比 \(m\) 小,而有撤销的空间。这时候每撤回一个分割点就相当于答案加上了 \(\Delta\),因此直接除法算一下即可。时间复杂度 \(\mathcal O(n\log^2 m)\),常数较大。

  • CF832E,grg 胜,15:17

这个题也是会做了写的太慢了啊!每次都找不到最简单的写法。

发现问题实际上是在询问一个 \(m\)\(n\) 元一次方程组的解数量,每次询问单独做是 \(\mathcal O(n^4)\) 的,显然不优。但是我们发现我们完全不关心每次消元后具体的解,因为解的数量只跟自由元数量和是否有解相关,因此可以带着未知数系数消元,询问时判断一下,复杂度 \(\mathcal O(n^3)\)

  • CF380E,wsc 胜,16:17

发现一个区间中的 \(k\) 大数贡献为 \(\frac{x}{2^k}\),而题目要求输出浮点数,所以只要求 \(k\le \log_{1/2} \epsilon\) 的就行了。

那么我们可以考虑枚举每个数计算贡献,用 ex 单调栈求出前后比他大的数,再计算贡献。时间复杂度 \(\mathcal O(n\log^2\epsilon)\)

posted @ 2024-03-19 23:05  PetitSouris  阅读(185)  评论(0)    收藏  举报