好题胡扯(缓更)

好题胡扯(缓更)

突然发现我博客背景没图,哪位好鸽鸽能给我白嫖下 qwq

打 * 的是没有代码实现过的,非常容易口胡错误,欢迎指正博客中的错误。

去年的 Good Bye 2019 忘打了,补一补。

\(08.23\)

CF1270F Awesome Substring

根号分治。这 tm 想了一个午睡

对于 \((r-l+1)/cnt_1<\sqrt n\) 的部分,直接把 \(0\) 设成 \(1\)\(1\) 设成 \(-k\) 计算。

对于 \((r-l+1)/cnt_1\ge \sqrt n\) 的部分,可以枚举有 \(k\)\(1\),然后答案是一个等差数列的形式,可以直接计算。

然后我降智了,\(<\sqrt n\) 的部分没想到直接开 \(n\sqrt n\),写了离散化,时间变成 \(\mathcal{O}(n\sqrt{n\log n})\),不过都能过啦,无所谓。

*CF1270G Subset with Zero Sum

看到题解就不想打了

当场降智,这道题 nb。

发现 \(1\le i-a_i\le n\),可以 \(i\rightarrow i-a_i\),这是一个基环树内向森林,找到其中一个环即可。

*CF1270E Divide Points

发现去年看过题解的题忘了

考虑将 \(x,y\) 坐标奇偶分类,检查是否能两组(即两组都有数),\(00,11\)\(01,10\)\(00,01\)\(10,11\)。若都不符合,把最后一位去掉。因为 \(n\) 个坐标两两不同,所以一定有解。

为什么把最后一位去掉呢?

因为欧几里得距离是 \(\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}\),不能分组说明他们的欧几里得距离可以整除 \(2\),所以都除以 \(2\) 不影响答案。

*CF1270H Number of Components

又 tm 不想写了,线段树 nb

先大胆猜想,一个连通块是一段连续的区间。然后我又降智用 next_permutation 验证了一下,发现是对了。又想了一下,设 \(i<j<k\)\(p_i<p_k,p_i>p_j>p_k\),矛盾。

然后就 sb 的套用楼房重建的方法,发现 Wrong Answer on test 2,简称 WA2

答案是若干个区间 \(\min \in [l_{i-1},l_i)>\max \in [l_i,l_{i+1})\),那个可以数前缀 \(\min>\) 后缀 \(\max\) 的个数。若我们把 \(\ge w\) 的看成 \(1\)\(<w\) 看成 \(0\),那么分界是形如 \(111111111000000000\) 这样的,那么可以维护 \(b_i\not =b_{i-1}\) 的个数,这个数至少为 \(1\),且答案也是这个数 \(1\) 的数量,可以维护最小值和最小值的个数。线段树即可,时间 \(\mathcal{O}(n\log n)\)。注意,分界 \(w\) 一定是当前序列 \(a\) 中的某个数。

md,luogu 翻译里没有 a_i 互不相等,自闭了,还是看英文题面吧

\(08.24\)

CF1270I Xor on Figures

nb。

重新定义矩阵乘法,把 \((+,\times)\) 换成 \((\bigoplus,\times)\),乘法换成循环的形式,然后求 \(F^{-1}=F^{2^k-1}\)。因为乘法是异或,所以当 \(i\not =j\) 时,\((x_i,y_i)\)\((x_j,x_j)\) 对答案的贡献会计算两次,只有 \((x_i,y_i)\) 翻倍的贡献。时间 \(\mathcal{O}(kt4^k)\)

\(08.25\)

vp 了一场 cf,发现 B 差点 tle,C 看了半天发现题意看错,其他全不会做,被吊打了。

CF1361A Johnny and Contribution

发现答案一定是按从小到大的顺序填,然后判断是否有解即可。

CF1361B Johnny and Grandmaster

出题人卡掉了我各种写错的地方,nb。

然后题意看错了一年

有一个直观的想法,按幂从大到小排序完后,前面取若干个数互相抵消,其他的数,一个集合放最大的,其他集合全放最小的,这样一定最优。可以维护一个答案,每次乘 \(p^{k_i-k_{i-1}}\),然后判断是否 \(\ge i-1\) 即可。

然后我的写法有若干种要判(n 很小,k 很大):

  1. ans=0 要 continue,因为 ans*p 若干次都是 0。

  2. ans>=i-1 要 break,然后要先乘再模。

CF1361C Johnny and Megan's Necklace

题意又看错了,Owen sb。

建个图,跑欧拉回路即可。有解条件:1 个连通块,所有点的度数为偶数。

证明待补。

*CF1361D Johnny and James

对于每条射线单独考虑,算一下贡献。

CF1361E,F 待补。

\(08.26\)

昨天太懒,今天写不太动。。。

Edu div2 好啊,没 div1 那么难,还是能做一做的。

*CF1354G Find a Gift

为数不多会做的交互题

首先想到倍增。再次看到 \(1\le k\le \frac n2\),猜测这个性质有用。从大到小倍增不行,那就从小到大倍增,花费 \(2\log n\) 次询问,接下来变成判断 \(1\) 是否为礼物的子问题。发现石子很多,可以随机 \(T\) 次,判断是否 \(1\) 位置小于随机的位置,错误率为 \((\frac kn)^T\),所以 \(T=20\sim 30\) 即可通过。其实 \(T=20\) 次就行了。

*昨晚的 Edu div2F,x-prime Substrings

看到这题肯定要压状态,跑 \(dp\)\(dp\),然后 \(Owen\) 这个 \(sb\) 算了一下,\(n=20\),用 \(1\sim 9\) 拆分有大约 \(10^6\) 个状态,时间爆炸。一看题解,发现可以把所有的 x-prime Substrings 找出来建 \(AC\) 自动机,最多只有大约 \(2400\),自闭了。然后……就不想写了。

昨晚的 Edu div2G,Mercenaries

一个很直观的想法是容斥,先 \(2^m\) 跑一跑,\(\mathcal{O}(1)\) 算答案,然后发现时间爆炸,答案不会算,自闭了。

打防沉迷了王者一个号后一想,这只和 \(m\) 个限制并的大小有关!可以把所有状态找出来,\(sort\) 一遍去个重。然后枚举集合大小 \(i\),这个 \(l_j\le i\le r_j\) 可以差分算。但是限制里的东西也要算进去!说明我们容斥的 \(m\) 个限制的一个子集,可以预处理的时候做一遍高维前缀和,预处理子集的答案乘上容斥系数 \((-1)^{|S|}\)。注意,答案是 \(cnt_i-j\choose i-j\),因为限制中的 \(j\) 个是要强制选的。

*AGC023F 01 on Tree

居然有我一眼看出做法的 F,菜鸡落泪

发现可以运用某 noip 模拟赛的方法,每次合并与父节点的连通块,所有点按 \(\frac {cnt_1}{cnt_0}\) 从小到大排序即可。用 set 即可维护。

*AGC027F Grafting

出题人 nb。

假设根节点不操作,一个点的父亲在 \(A,B\) 树不同,则操作的顺序是 \(fa_B(u)\rightarrow u\rightarrow fa_A(u)\),像树上的数一样判个环即可。

根节点会操作的话就枚举第一次操作,加上枚举根,拓扑排序,时间 \(\mathcal{O}(Tn^3)\)

AGC035C Skolem XOR Tree

以前做过的,忘了。大 sb。

发现 \(n=2^k\) 无解,因为没有其他数能消掉最高位。

否则考虑增量构造,因 \(2|i,i\bigoplus i+1=1\),可以每次 \(i\rightarrow i+1\rightarrow n+1\rightarrow i+n\rightarrow i+1+n\)\(1\) 和奇数的情况挂任意一个分支即可。

*ARC103B Robot Arms

先发现,所有坐标 \(x\)\(y\) 奇偶不同无解。否则考虑倍增,每次操作与目标点差值绝对值最大的那一维即可。

为什么是对的呢?

考虑一个数减去一个比它大二进制位,肯定把一次取反,然后绝对值 \(+1\) 进位。没错,这就是求 lowbit 的方法。考虑归纳。若当前在第 \(k\) 位,两个数都小于 \(2^k\) 且不相等。那么两个数下一位只有一个 \(1\) 或全是 \(0\) 可以变成 \(k-1\) 的子问题,否则最大的数操作后有两种情况:

  • 在另一个数一串 \(1\) 后,出现两个数某一位都是 \(0\),那么也可以变成子问题。
  • 若有进位,则原来最大的数二进制拆分后是 \(...1111111111\),所以一定是某个 \(2^k\),所以这一位去掉就达到了目标点的一维,那么就不用管了。

诶,那这么归纳的话,保证最大岂不是要从 \(2^{31}\) 开始而不是 \(2^{30}\)?这个问题我再想想。

*ARC103D Distance Sums

成功的没想到最后一步。

容易发现 \(D\) 在一条边的转移:\(D_v=D_u+n-2\times siz_v\)

容易发现 \(D\) 最小一定在重心,证明很简单,因为所有点到重心 \(D\) 的变化一定递减,因为重心是树上唯一/二的点 \(\max(siz_{son})\le \lfloor \frac n2\rfloor\)

容易发现 \(D\) 最大一定在某个叶子。

然后就不会了

一点开题解,发现可以删叶子,然后根据那条转移找编号。重新一看题意,\(D\) 互不相同。

我是 sb。

*AT5761 Odd Sum Rectangles

又成功的没猜到结论。Itst 写的太好了,去膜他吧(雾

传送门

看了下 Global Round 10,发现又什么都不会,被吊打了。

*CF1392G Omkar and Pies

这 tm 都可以前缀和了???

发现两者在最后都操作任意次相同的操作不改变,可以预处理前缀操作交换到哪里。然后 \(r-l+1\ge m\) 的限制可以一边加点一边最短路。因为路径长度最多为 \(k\),那么每个点被更新的次数只有 \(k\) 次,所以直接暴力即可。

*CF1392H ZS Shuffles Cards

推了一个 \(\mathcal{O}(n^3)\) 的式子,怎么都不会,官方题解也看不懂,于是点开 luogu 的题解,发现 TA 的做法好 nb 啊。。。

期望是迭代次数乘一次迭代的期望轮数,由于每张牌的概率为 \(\frac 1{m+1}\),根据期望的可加性,再加上抽到一张鬼牌,期望是 \(\frac n{m+1}+1\)。接着设 \(f_k\) 为还有 \(k\) 张牌没取的期望,\(f_k=\frac m{m+k}(f_k+1)+\frac k{m+1}f_{k-1}\),发现 \(f_k=f_{k-1}+\frac mk\)\(f_1=m+1\),所以 \(f_n=1+m\sum_{i=1}^{n}\frac 1i\)。时间 \(\mathcal{O}(n+m)\)

*CF587D Duff in Mafia

zju 集训的题,又忘了。

二分答案,跑 2-SAT。约束条件是选出来的边,对于一个点的所有边,只能选一个;没选出来的边,对于一个点的同种颜色所有边,只能选一个。发现连的边只和除了自己、并且在一个集合中的点连边,这些东西只和前后缀有关,于是前缀优化建图即可。

\(08.27\)

跟 ljc vp 了一场 Global Round,结果他不知为何不在状态……有点惨。

CF1326A~CF1326C

A 是 233333...,B 可以直接递推(也不算),C sb 了两次,题意差点看成不用全分,最后发现前后的段长不用算进答案。

CF1326D1/2 Prefix-Suffix Palindrome

当场降智系列……

传送门

CF1326E Bombs

发现答案单调不增,可以把 >= 答案的位置 +1,标记的位置 -1,线段树维护前缀 min。记得把前面 <0 的一段去掉。

*CF1326F1/2 Wise Men

这都能容斥,nb。

把 0 的限制去掉,发现只和连续的 1 有关,剩下的就类似子集 exp。

然后我去补学了一下子集 exp,发现就是重复的位也算,只不过跟答案没关系……看完感觉 NOIOL3 那时候我怎么没看懂……我怎么这么傻……

\(09.01\)

前几天太懒了……今天来补坑。

前天打了一场 ZROI,开场什么题都不会,冷静了一下,发现 A 可以找规律,B 不像字符串神题,可以 manacher,C 的贡献可以 oeis,当然也是看到 oeis 的式子才会证的,然后就 1h30min 写完,打了一小时对拍,丝毫没用,后来发现大家都阿克了。

*AGC015D A or...or B Problem

一道神奇的题……

先去掉前缀相同的二进制位,假定 r 有 t 位,那么我们可以构造出 \([l+2^t,l+2^{t+1})\)

因为 or 只会使原数变大,所以接下来我们找到次高位的 1,构造出 \([2^t,2^t+2^{k+1})\),最后并上 \([l,r]\) 即可。

*AGC043D Merge Triplets

找规律未果,开始疯狂猜结论,然后并没有猜到,agcnb。

首先,一定不会出现连续的四个数,\(x_1>x_{2..4}\),这样说明前缀 \(\max\) 的划分不超过 \(3\)

再发现一组中的三个数 \(a,b,c\),若 \(a>b\),那么 \(a\) 选后一定会选 \(b\)。这样的话一组可能会被分成 \(1+1+1,2+1,3\),这就启发我们长度为 \(2\) 的段必须大于等于长度为 \(1\),否则无法匹配,不然就有解,而且一定能构造出来。

那么可以 \(dp\)\(f_{i,j}\) 表示放了最大的 \(i\) 个数,长度为 \(2\) 的段数-长度为 \(1\) 的段数为 \(j\) 的方案数,这样就可以转移了。

*AGC016D XOR Replace

看出了第一步,看来不是全看题解。

发现异或的操作等价于当前的数于全局异或和交换,那么有解的情况就是序列 \(B\) 的数是序列 \(A\) 加上全局异或和构成的集合的子集。

接着算最小操作数,将 \(A_i\not =B_i\) 的位置连一条边,发现答案就是边数+连通块个数-1,直接做即可。

*CF704E Iron Man

又降智了

先考虑在序列上怎么做。因为我们只关心最小,肯定是相对位置的前驱后继。

放在树上,树剖一下,在每条重链上做即可。

*CF1290E Cartesian Tree

还能这么做……

发现笛卡尔树的子树大小其实是一段区间,我们可以算出 \(\sum (R-L+1)\)

接着就是支持以下操作:

  1. 区间加

  2. 区间取 \(\min\)

吉司机线段树正反做两次即可。

*AGC021F Trinity

没救了……计数题不会做了……

首先发现不是对称的形式,且 \(N\)\(M\) 不在一个数量级,猜想是 \(\mathcal{O}(Mpoly(N))\) 的算法。

\(A\) 只和第一次加入的列有关,而且编号没有太大关系,可以 \(dp\)\(f_{i,j}\) 表示 \(i\) 行每行都有至少一个黑格子,放到第 \(j\) 列的方案数,答案就是 \(\sum {n\choose i}f_{n,i}\)

\[f_{i,j}=(1+i+{i\choose 2})f_{i,j-1}+\sum_{k<i}{i+2\choose k}f_{k,j-1} \]

\(\text{NTT}\) 优化即可。

\(09.11\)

*CF983D Arkady and Rectangles

去年不会做的题,再看了一遍题解,终于懂了。

可以扫描线,然后把颜色覆盖变成时间戳最大,维护两个值,一个是可视的最大值,一个已统计过的最小值,因为如果线段树子节点所有的颜色都大于最大值,当前节点覆盖的线段就没用了。然后每次把根节
点的最大值删去,重复此过程,因为一种颜色只用统计一次,所以时间是对的。

线段树+set,时间 \(\mathcal{O}(n\log^2n)\)

CF627F Island Puzzle

好题。

先把不加边的情况特判掉。

接着考虑加边的情况,发现连一条边是一个环,那么可以走到这个环,然后走若干圈,到达目标点。所以不匹配的点必定构成一条树上的路径。

细节有些多,有时间好好理一遍再写。

坑:抄别人的代码的时候他是 tot,我是 cov,结果我抄成 tot,但是我的 tot 是邻接表的边数,自闭了。

\(09.12\)

上次考了两场长乐一中的题,感觉自己 noi 回来不挂题 buff 附体,成功把 OI 打成了 ACM,使自己的期望除以 2 到 3 的随机实数,自闭了

其中有三道题我觉得挺不错的,记录一下。

*D1T4 permutation

题意:随机生成一个排列,将偶数的位置排序一遍再放回去,然后分 k 段,问每段逆序对个数乘积的期望。

n^5+特判,90pts:

每段逆序对个数的乘积等价于每段选一个逆序对,\(f_{i,j,k,0/1/2}\) 表示 \(i\sim n\),偶数的位置是 \(j\),分了 \(k\) 段,\(0\) 表示没选右边和左边的位置,\(1\) 表示选了右边的位置、没选左边的位置,\(2\) 表示选了右边和左边的位置,偶对偶没贡献,奇对奇可以用 \(\frac 12\) 算,奇对偶可以这样算,偶对奇还要在上述的 dp 再加一维,容斥掉,状态也加几个。

正解:

出题人 nb,将偏序关系抽象成一棵树,不是内向树的部分可以容斥,转成内向树后就是问合法拓扑序期望,可以用 \(\prod \frac 1{siz_i}\) 算。

严重怀疑出题人做过 Shrinking Tree

*D1T2 tree

题意就不说了,就是一个 trick。

\((u,v)\) 是直径并且字典序最小,加入集合的点 \(w\) 要满足以下几个条件:

\(\text{dis}(u,v)>\text{dis}(u,w)\)\(\text{dis}(u,v)=\text{dis}(u,w),v<w\)

对于 \(v\) 类似。

那么是否有 \((a,b)\) 满足上述条件却是直径呢?事实上是没有的。

证明的话将 \((u,v)\) 的路径抽出来,考虑不以任何点为根,这里的子树指除了这个点在 \((u,v)\) 路径上相邻的点外能到达的点。显然 \(a,b\) 不在 \(u\)\(v\) 的子树里,接着发现 \(\text{dis}(a,b)\le \text{dis}(a,u)+\text{dis}(b,v)-\text{dis}(u,v)\le \text{dis}(u,v)\),Q.E.D。

*D1T3 cactus

题意:求一个仙人掌邻接矩阵的行列式。

退役吧 sb

发现交换两个数,逆序对的奇偶性只改变一次。证明的话……有更简单的证明,不过行列式交换两行会取反,不就行了。

接下来就是仙人掌覆盖所有点的问题,一个环的贡献是 \(2\times (-1)^{len-1}\),一条边的贡献是 \(-1\),在圆方树上 dp,分圆点和方点讨论即可。

还有我考试的时候把 k-Nim 的结论记错了,转成二进制的我转成了 m 进制,报警了

我也并不知道在扯啥,就把 CF & Atcoder 好题胡扯改成了好题胡扯

记录几道一眼题。

*CF627E Orchestra

枚举矩形上边界,用双向链表即可做到 \(\mathcal{O}(n^2k)\)

*CF639F Bear and Chemistry

先 tarjan 缩点,对于每个询问建出虚树,再把边放进去,跑一遍 tarjan 即可。

*CF671D Roads in Yusland

整体 dp 即可。

线性规划的做法待补。

在题解区看到 Fading 的题解,Fading 居然做过这道题还没做出来 NOID1T2,有点惨

还有一道以前看过题解的题。

*CF643G Choosing Ads

将区间众数的方法拓展到 \(p\%\) 上即可,用线段树维护 \(\lfloor \frac {100}p\rfloor\) 个数即可。

\(09.14\)

CF1320D Reachable Strings

这类题不会,打 ZROI 被暴打了……

题解

*ZROI Round3 B

相同的长度为 \(k\) 的串取反等价于将 \(0/1\) 平移 \(k\) 位,这样可以把连续 \(k\) 个删掉,直接判断即可。

C 我写了个暴力,大概是 \(6\times 10^8\) 的状态+一大坨剪枝,就过了……我谔谔。

ZROI Round3 A

补一个证明,考试的时候想到的。

证明:有一个 \(n\) 个点 \(m\) 条边的图,\(m>0\) 时,\(>\frac m2\) 的割(异色边数量)一定存在;\(m=0\) 时,一定不存在。

\(m=0\) 时显然。
\(m>0\),考虑局部调整。一个点取反,若与他相连有 \(i\) 条异色边,那个 \(\Delta ans=deg-2\times i\)。这就告诉我们,度数只要有奇数就一定有解。若度数全为偶数,那么只需判断是否只存在 \(=\frac m2\) 的方案,即每个点的度数平分。

考虑继续调整。当 \(m>0\) 时,一定存在一条异色边,同时取反与异色边相连的两个点,\(\Delta ans=2\)。所以一定有解。

AGC022F Checkers

LH 讲过,所以去补了一下……具体看 FJ 省冬的课件吧。

*CF1375H Set Merging

这都能分块……确实,用值域分块拟合序列分块,可以分治。答案在每个块查一遍即可。

理论上可以用归并排序、双指针让时间去掉一个 \(\log\),但数据很小,没什么意义……

\(09.15\)

*CF1396D Rainbow Rectangles

比赛的时候想到了枚举左边界,想到了 set 维护,就是没想到把插入变成删除,使得答案跟改变的方向(max -> min)一样,退役吧 sb

*CF1396E Distance Matching

orz liouzhou_101。

还有一篇匹配问题的方法也很好,极其推荐。

题解

MtOI2018 魔力环

前段时间做的,复习了一下 Polya 定理。

一个数约数之和大概是 \(\mathcal{O}(n\log \log n)\) 级别的。(以后记得要看看证明,包括质数密度啥的

还有要注意的是,若一个环没出现超过 \(k\) 的黑色连续段,那么它复制若干次也不会出现。

然后我 m=0 特判错了 WA 了一发

CF1349D Slime and Biscuits

推了一张草稿纸,具体的可以看 liouzhou_101 的推导。

题解

势函数和鞅的停时定理天下第一!

任务计划:

  • 线性规划
  • 转对偶问题
  • 计算几何
  • 博弈论

\(09.16\)

CF1418F Equal Product

没想出来,题解做法 nb。

先想到设 \(\large\frac {x_2}{x_1}=\large\frac {y_1}{y_2}=\large\frac ab\),这样虽然多引入了两个量,但是 \(a|x_2,a|y_1,b|x_1,b|y_2\),所以这两个量实际上是四个量的桥梁。因 \(y_2<y_1\),所以问题转化成求 \(y_1,a,b\)

接下来就是套路的时间了。枚举 \(x_1\) 和约数 \(b\),发现就是支持询问区间大于一个数的最小值。刚开始我写了单次 \(\mathcal{O}(\log^2 n)\) 的线段树+vector,本想改成 \(\mathcal{O}(\log n)\) 的主席树,发现刚刚是 \(\text{MLE}\),空间不变……

在线不行考虑离线,从大到小枚举 \(b\) 和倍数,这样就只用线段树维护区间最小值了。时间 \(\mathcal{O}(n\log^2 n)\)

坑:\(x_2=x_1\times \large\frac ab\) 的时候要转成 long long,不然会 WA。

*CF1261F Xor-Set

用字典树将区间分成 \(\log w\) 段,答案只和后缀 \(0\) 较长的区间有关,直接算即可。

\(09.19\)

打模拟赛,写子任务的时候忘了保留恰好 5 位数字,直接输出整数,自闭了。又想偷懒用 long double 代替 __int128,成功的又自闭了。

CF1218B Guarding warehouses

计算几何好题!

然而 p_b_p_b 的做法看懂了,细节不会写,去借鉴 cz_xuyixuan 的了……

cz_xuyixuan 的做法:极角排序,对于每个极角序区间开棵线段树,然后在线段树上插入线段。因为除了凸包相邻的线段,其他两两不交,所以只需考虑极角序区间中点引出的射线到凸包线段的距离。维护距离最小值和次小值的线段,面积可以用叉积算。

坑:下传标记的时候哪条线段不要写错,还有注意求交点的时候向量不要搞反,注意各种共线的特判,atan2 是从 x 轴负半轴逆时针旋转的,情况很多,有一种没判就可能导致求交点的时候输出 nan。

CF1025F Disjoint Triangles

退役吧 sb

枚举公切线,只需考虑平面右边点的个数,注意到内公切线会被算两次,所以我们只需考虑 atan2<=0 的情况。

\(09.20\)

md,昨天打 ZROI,吃完饭 20:00,打 B,C 无果,最后一小时发现 A 是个 dp,写完 21:40。我想:反正 20 分钟我暴力也写不完,数据也不好造,就不写拍了吧!

WDNMD,以后有时间不写拍,pei,不写拍我就是 sb。

Owen_codeisking 8:15:46
我刚开始写的是对的/kk

Owen_codeisking 8:15:56
然后策略弄错了/kk

Owen_codeisking 8:16:09
就把 E 中间的式子改错了/kk

Owen_codeisking 8:16:23
然后尝试输出 E,发现跟答案没什么关系/kk

Owen_codeisking 8:17:01
要是我刚开始就输出 E,可能就 A 了/kk

分享一个 sb 的比赛经历。

\(09.21\)

*CF733F Test Data Generation

好题!感觉在什么模拟赛见过加强版。

考虑 \(\sum [2|i]{i\choose j}\) 的组合意义,\(f_{i,j,0/1}\) 表示长度 \(\le i\) 的序列,染黑 \(j\) 个位置,\(i\ \text{mod}\ 2=0/1\) 的方案数,倍增 + MTT 即可。或者根据题目所求的,设最后一个位置是奇数还是偶数。具体的:(第二种解法)

\[F(2a,p)=F(a,p)+(F(a,0)+F(a,1)+1)\times F(a,p\bigoplus (a\ \text{mod}\ 2)) \]

*「2017 山东三轮集训 Day7」Easy

怎么对 DS 选手这么友好

可以使用 Border 的四种求法中的方法,树剖后用可持久化平衡树维护一条重链链头到当前点轻儿子的距离最小值,或者动态点分治。

*「JOISC 2020 Day1」扫除

nb。

还得培养子任务对我的启发能力。

题解等我写完再更。

*Codechef MARCH17 Sum of distances

最短路等价于从一段支配点出发,分别计算它们到起点和终点的距离,合并这些距离。所以这题连续三个数构成一个支配集合,即删掉它们原图不连通。接下来用树状数组做二维偏序。

*「WC2018」即时战略

定期重构动态点分治或 LCT + 重链上二分,后一种做法找到点后要 access 一次,保证复杂度。

对了,找到我模拟赛有一道哪里挂分了。我设 sf 是子树的 min,f 是当前的值,上传的时候 sf[v]=min(sf[v],f[u]);

报警了报警了。

\(09.30\)

咕咕咕。

ARC078F Mole and Abandoned Mine

写了一个 \(\mathcal{O}(3^nn^2)\) 的解法过了,发现分两步转移就少掉一个 \(n\) 了,我是 sb。

*AGC033C Removing Coins

思维好题,转成取石子游戏。

ARC068F Solitaire 待补。

*AGC028C Min Cost Cycle

发现 min 和最小是同向的,所以把 min 去掉,改成选点,考虑不合法的连边情况,用堆维护即可。

*AGC028D Chords

区间 dp,方法和计算 \(n\) 个点的连通块个数差不多,正着不好算就反着算,容斥掉不合法的方案即可。

AGC028E,F 待补。

*AGC034C Tests

发现经过调整,可以做到只有一个 \(\in (0,X)\),剩下的贪心取。二分后枚举特殊的是哪个即可。

*AGC034D Manhattan Max Matching

发现 max 和最大同向,把 max 拆掉,跑费用流。

*AGC034E Complete Compress

我怎么把枚举聚集的点忘掉了……

*AGC034F RNG and XOR

看来我 FWT 没学好啊……

题解

*DPC6 E Span Covering

好题!跟 ZJOI2012 波浪的 dp 思想有点像,都是边 dp 边确定状态,并且这种状态能唯一表示一种方案。

这道题的状态即为线段覆盖的左端点相对顺序和相邻左端点之差。

而前者可以使用插入法,后者可以边 dp 边确定。

考虑插入法,而极长段的合并不好合并,考虑长度从大到小插入,这样最多只会合并两个极长段。而且这样的话,dp 的时候极长段个数之和是调和级数级别的。(很多题解说是线性的,有些不懂,不过常数很小,可以忽略不计?)

接着就是推式子的时间了。

\(10.2\)

昨天回去看了一下 THUWC2020 的数据结构题,刷新了我对数据结构题的认识,特别是 D1T3,D2T2,D2T3 这三道题目,虽然解法对于见过类似题目的人略微有些套路,但是这些 idea 还是很好的。

(具体题解有些长,看别人的吧)

看了一场 agc,差点 A 都不会做,这真是。

*AGC040C Neither AB nor BA

没想到。

将奇数位置的 \(A\) 改成 \(B\),转化为相同的 \(AA\)\(BB\) 不能取,用总方案数-不合法的方案数,组合数算一算即可。

*AGC040E Prefix Suffix Addition

不可做题 \(\mathcal{O}(n)\) 系列……

先想只有前缀的版本,设 \(A_0=A_{n+1}=0\)。因为要求加的是不降序列,所以考虑 \(A_i>A_{i+1}\) 的位置,称这些位置满足性质 \(X\)

Observation 1. 若位置 \(i\) 没有操作过,则不可能一次操作同时消去 \(i\)\(i+1\)

证明不难。若操作的位置 \(<i\),则没有影响;若操作的位置 \(>i\),因为 \(x_i\le x_{i+1}\),所以 \(A_i-x_i>A_i-x_{i+1}\),满足性质 \(X\)

由 Observation 1,我们发现答案至少为满足性质 \(X\) 位置的个数。考虑构造,每次操作 \((A_1,A_2,...,A_i)\) 即满足条件。所以答案取到下界,问题转化为将 \(A\) 分成两个序列 \(x,y\)\(x_i+y_i=A_i\),最小化 \(ans=\sum_{i=1}^n [x_i>x_{i+1}]+\sum_{i=1}^n [y_{i-1}<y_i]\)

直接 \(dp\) 不是很行,看看这个式子有什么性质。

Observation 2. 若填完 \(1\sim i\) 后某些 \(f_{i,j}\) 相等,那么 \(j\) 越小越优。

Observation 3. \(f_{i,j}\le f_{i,0}+2\)

由 Observation 2,3,我们只用记录最小和严格次小的方案即可转移。时间 \(\mathcal{O}(n)\)

\(10.07\)

感觉有点咕,开个待做清单。

\(10.14\)

CF1381E Origami

CF1175G Yet Another Partiton Problem

CF538G Berserk Robot

CF494E Sharti

SP11414 COT3 - Combat on a tree

\(10.15\)

*ACL1D Keep Distances

老年人不行了,D 都不会了……

思维好题!(滑稽.jpg)

总结:这类题目可以寻找极大和极小的值来得到一些强的性质。或者可以写个暴力,打表发现决策区间恰好有最大答案个,而且左端点/右端点都是极小/极大的点。

(当然,直接看题解懒得打暴力就无法发现这些性质了)

*ACL1E Shuffle Window

注意到打乱顺序只能确定第一个数的位置,所以把题意转化成不断的 push 和 pop,开始 push k 个,最后 random_shuffle k 个,然后用树状数组算一算贡献。

总结:若只是 swap 两个数,逆序对可以对于两个位置算贡献,任意打乱的话,直接算两个数的相对位置顺序会好算很多。

ARC104F Visibility Sequence

这题跟多校的 Kcats 十分相近……我 TM 比赛的时候 E 打不出来,F 没开,感觉亏大了。

\(10.16\)

怎么最近天天打比赛 E 不会,F 又很傻……

*CF1422F Boring Queries

简单题,考虑根号分治,\(\le \sqrt{n}\)\(maxp=86\) 棵线段树,\(>\sqrt{n}\) 开一棵主席树,因为最高幂次只有 \(1\),可以用 HH 的项链的方式维护。

不过有更 nb 的……将 \(>\sqrt{n}\) 的方法拓展一下,因为 \(log_p maxa\) 最多只有 \(17\),可以对于每个幂次维护一个单调栈。因为最多只有 \(\log n\) 个指数,时间与空间相同,\(\mathcal{O}(n\log n\log maxa)\)

*CF1422E Minlexes

我一直在想怎么贪心……我是不是 sb……

记一个后缀的答案,发现是一个 naive 的比较字典序大小,倍增 hash 即可。

\(10.17\)

ARC 好难……

*ARC105C Camels and Bridge

想了很久,发现差分约束限制有 m 个,过了一会儿发现可以反向思考,询问一段前缀的最大值,于是跑最长路即可。

ARC105D Let's Play Nim

发现使若干个数的和 xor=0 的局面很少。接下来,先奇偶讨论。

若 n 为奇数,则先手在 nim 游戏中是后手,使得 xor=0。那么无论先手选择什么,后手都选择剩下最多的金币加到最多金币的盘子中,这样一定后手必胜。

若 n 为偶数,则先手在 nim 游戏中是先手,使得 xor!=0。那么只有一种情况后手必胜,即所有相同的数出现的次数为偶数。因为先手无论怎么选,后手都可以将加上的数抵消掉。其他的情况先手只要每次选择剩下最多的金币加到最多金币的盘子中就一定必胜。

ARC105E Keep Graph Disconnected

我 TM 写的代码和想的是两个东西……看完题解发现自己就是对的……

首先考虑 n 是奇数的情况,这种情况因为 xy=0,和怎么操作无关。

再考虑 n 是偶数的情况,题解是考虑什么使得奇偶性改变,我是考虑什么时候先手要必胜的话 xy 是奇数还是偶数,发现 x=y=0,ans=1 和 x=y=1,ans=0 的局面一定后手必胜,因为每次先手转换到 x=0,y=1 或 x=1,y=0 局面后手一定能找到一个奇连通块,将它还原。其他的情况先手能通过类似的策略必胜。

ARC105F Lights Out on Connected Graph

好,我二分图都没看出来……

首先连通二分图只有两个染色方案。考虑用所有的染色方案减去不合法的染色方案,容斥一下。

坑 1:因为枚举的是某种颜色子集,所以要 /2,初始值 g[0]=1,枚举子集包括 i 本身。或者可以把 0 也算进去

坑 2:注意容斥的时候要选 lowbit(i),而且这个连通块不能包含 i,即全集。

ARC096C Everything on It

容斥即可。注意子集族的子集个数是 \(2^{2^n}\)

*ARC098D Donation

神题!

先转化 \(c_i=\max(a_i-b_i,0)\),表示经过一个点最大的点。图中的边权就是 \(\max(c_u,c_v)\)。然后找最小生成树,做一个类似点分治的过程,找 \(c_i\) 最大的点,然后分成多个子问题。因为根的权值大于等于子树的权值,所以答案只和最后选了哪个子树有关。最小生成树可以用并查集建出来,时间瓶颈在排序上。

\(10.18\)

昨天打 ZR,正解莫队+分块,我写了分块+bitset,常数翻倍,愉快失去了阿克的机会。(怎么那题是我 yy 过的 idea,我也写过 Ynoi 的题,只想到了次优解,报警了报警了)

今天打 cf(div1+div2),F 的做法过于麻烦,最后没调出来,然后发现我写了两个相似函数,发现有一个函数有些错误(线段树上二分用了 else if),还在另一个函数写了备注,记得要改掉,结果只改了一个,愉快的爆了,最后赛后 2 分钟 AC 了。

以后再 TM 写代码犯强迫症我。。。。。。(此处省略一万句 flag)

记得上次还启发式合并还原的时候没有用可撤销并查集,一整场没调出来,我。。。

口胡 luogu 月赛:

*lg10月月赛IIA 梦中梦与不再有梦

把 1 和 2 判掉,奇数有欧拉回路,偶数的应该是边数-n/2+1。

*lg10月月赛IIB 深海少女与胖头鱼

枚举开始删掉了多少个没圣盾的鱼,接着攻击有圣盾的鱼时,其他鱼都有了圣盾,期望成了一个等比数列状物,算一算即可。

*lg10月月赛IIC 蝴蝶与花

发现 \(n,m\le 2\times 10^6\) 而且输出的左端点还要最小,那么这个 \(val={1,2}\) 肯定有很强的性质。

先 check 一下 l=1 有没有答案,没有,则找到右边最靠近的位置 \(l'\) 使得 \(val_{l'}=1\),判一下 \(l=l'+1\) 有没有答案即可。则找一下 LCP,这样既能保证和最大,又能讨论所有情况,显然最优。

昨晚和 cyw 交流了一下做法,发现自己的做法伪了,然后想了半天 LCP 不怎么会快速求,自闭了

upd: 我又自闭了,当时想对了一半,实际只要找右边最靠近 \(1,r\)\(1\) 就行了。

*lg10月月赛IID 象棋与马

先把式子列出来,猜测 \(\gcd(a,b)=1\ \text{and}\ a\ \text{mod}\ 2\not=b\ \text{mod}\ 2\) 即可。具体证明不怎么会,想到了再补。

接下来就是把 \(\frac{1-(-1)^n}2\)\(\frac{1+(-1)^n}2\) 代进莫比乌斯反演的式子了。

待做:

  • hdu 6773 King of Hot Pot
  • hdu 6791 Tokitsukaze, CSL and Palindrome Game
  • 以及很多当时多校不会的题。
  • Lyndon 分解法
  • BM 求递推式
  • JOISC2020

找到一些 nb 博主:

CF1428D Bouncing Boomerangs

坑 1:注意 \(a_i=3\) 的位置可以重复利用

坑 2:注意 \(a_i=3\) 是优先从大到小,因为要让这些位置重复利用。

\(10.19\)

*CF1307F Cow and Vacation

好题!把 k 转成控制半径(即/2),用 bfs 将距离 <=k 的点加入并查集,最后起点和终点都向目标点跳 k 步,倍增即可。

HHKBPC2020F Random Max

看着非常模板,但是我就是不会均匀分布的概率期望

先套路的分成 \(2N\) 段,类似扫描线,整体维护一个多项式,支持乘或除一个一次式,然后每段算答案时把多项式积分一下。积分这部分要用分部积分法。

怎么感觉我没学过微积分一样,高数水平为 0

坑 1:一次式的常数是 0 时,多项式除法要特判,循环移位一次。

坑 2:注意算区间的答案时扫描线端点要 \(>lmax\),除法不用。

\(10.20\)

zju第一次集训Day9E Epah

\(n\le 10^5\) 的完全二叉树上,点权为 \([0..a_i]\) 内随机实数,求形成堆的概率 \(\text{mod}\ 998244353\)

坑:在子树的多项式加的常数是 \(F_j(b_j)\) 而不是 \(F_j(b_i)\),因为子树的多项式只需满足子树的限制。

\(10.21\)

AGC024E Sequence Growing Hard

注意 dp 数组的定义是大小为 i 的森林,根节点最大值为 j 的方案数,转移枚举最小的 dfn。

AGC021C Tiling

构造好题!考察了黑白染色,直接构造等知识点,给出题人点赞!

AGC021E Ball Eat Chameleons

考虑分类讨论+调整。

*AGC025D Choosing Points

*CF1299D Around the World

将本质不同的线性基都预处理出来,然后跑类似 dp 套 dp 的东西。时间 \(\mathcal{O}(cn),c=374\)

\(10.22\)

AGC041F Histogram Rooks

\(10.23\)

CF1267G Game Relics

CF603D Ruminations on Ruminants

CF1427D Unshuffling a Deck

*CF1205E Expected Value Again

*CF1365G Secure Password

好题!没想到 \(2\log n\) 能变成 \(13\),佩服出题人。

\(10.25\)

昨天联考不敢猜结论的我怕不是 sb。

昨天把找一个点的题写成了找全部点的我怕不是 sb。

还有一大坨 sb 错误,如:

  • 标记永久化 pushup
  • 线段树合并 mn[x]=min(mn[ls[x]],mn[rs[x]]) 写成了 mn[x]=min(mn[ls[x]],mn[ls[y]])
  • build(1,1,id_tot) 时忘判 id_tot=0
  • 树在建图时 i<n 写成了 i<=m
  • 多测有一个 add 的 vector 没有清空完全
  • 提交的时候编译语言忘选 c++11

一定要写拍!!!不要偷懒!!!

CF1149D Abandoning Roads

坑:当 val=b 时,>=4 的状压判,<4 的特判 u 和 v 是否在同个连通块。<4 只会经过 1 次,因为 2b>2a。

*「JOISC 2020 Day4」治疗计划

我连第一步都没想到……

跑最短路,dij+线段树+堆。因为边权只和相连的点有关,所以只会被拓展一次,时间 \(\mathcal{O}(m\log m)\)

ARC106E Medal

E 结论题,F 套路题……

首先,你要知道 hall 定理:

若一个二分图,两边的点集满足 \(|X|\le |Y|\),那么检查 \(|X|\) 的所有非空子集,若对于 \(S\in X\),与 \(S\) 相连的点集为 \(T\),都有 \(|S|\le |T|\),那么二分图存在完美匹配。

推论:二分图完美匹配个数为 \(|X|-\max(|S|-|T|,0)\)

暂时不会证,留坑待补。

然后这题就没了。。。

\(10.28\)

一个晚上+一节自修课(因为不选生物)做不完一套比赛是不是没救了……

嗯,成功发现 AT 的题目非常克我,CF 一场还是有一半的套路题,AT 就都是思维题思维题思维题……

不过最近也终于能做出一些简单的思维题了 QAQ

SIISDHPC2020C ThREE

差点 C 都不会做……

考虑按深度奇偶性染色,将排列的点按模 \(3\) 分为三类,先填 \(\ge \lceil \frac n3\rceil\)\(1,2\),然后任选一些位置填 \(0\)。若深度为奇数或偶数不够填的时候,若为奇数,则将奇数的位置全填 \(0\)\(1,2\) 随意填,偶数同理,这样一定满足条件。

SIISDHPC2020D Manga Market

JKLover 搬的联考题。那个 \(a_i>0\) 的部分分吼啊!

考虑 \(a_i>0\) 怎么做。考虑贪心,将商店按 \(\frac {(b_i+1)}{a_i}\) 从小到大排序,那么 Takahashi 去商店的顺序一定是这个序列的一个子序列。发现若 Takahashi 去了一个商店,便从 \(t\) 时刻去往 \(t+a_i\times t+b_i+1\)\(t\) 一定翻倍,那么考虑 dp,\(f_{i,j}\) 表示前 \(i\) 个商店走了 \(j\) 个商店的最小时间,因为第二维只有 \(\log T\),可以快速转移。

\(a_i=0\),则在刚才的 dp 上,对于每个 \(j\) 贪心选 \(b_i\) 小的直到正好 \(\le T\)。时间 \(\mathcal{O}(n\log T)\)

看来我 \(ABCD\) 还是会的!\(E\) 因为我以前看过 Itst 的题解,也写过题解,就不写了。

NPC2020C Folia

唯一会的题……

先将 \(n=0\) 判掉,(我就没判 RE 了一次!)考虑怎么判无解。\(l_i\) 表示第 \(i\) 层最少有多少个非叶子节点,那么 \(l_{i-1}=\lceil \frac {l_i+a_i+1}2\rceil\),看一下是否 \(l_0+a_0\le 1\),不满足即无解。

再设 \(r_i\) 表示第 \(i\) 层最多有多少个非叶子节点,那么 \(r_{i-1}=r_i+a_i\),是一个关于 \(a\) 的后缀和。那么再遍历每层,\(rem=\min(2\times (rem-a_i),r_i)\),每次将 \(rem\) 加到答案即可。

NPC2020D Urban Planning

数基环树连通块可以数环。分环和树讨论,算一下贡献即可。(似乎可以用分治 FFT 优化到 \(\mathcal{O}(n\log^2 n)\)

总结:数集合个数可以抓住集合的特殊性质,方便计数。

*NPC2020E Binary Programming

神仙题,膜拜出题人,wtcl。中午再更。

题解

*NPC2020F Sorting Game

少了最后一步,有些可惜。中午再更。

题解

*TM&NFIPC2020F Triangles

不会 pick 定理,感觉会这个定理再给我 1h 应该还是想的出来的……

题解

这场的 C 被我直接暴力 100 次过了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,E 写复杂了,可以枚举第一个数,转化成子集 and 和为 0,上 FWT 即可。

\(10.29\)

*CF724G Xor-matic Number of the Graph

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈我线性基白学了哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

随便拉一棵生成树出来,把环丢进线性基,等价求 \(val_u\bigoplus val_v\bigoplus v\)。对于每一位算一次,有两种情况,全 \(0\) 的话就是 \(0\),有 \(1\) 的话就是 \(2^{|S|-1}\)\(|S|\) 是线性基中的元素个数。

CF724E Goods transportation

E 居然最难 QAQ

发现是网络流模型,考虑将最大流转成最小割然后 dp,\(f_{i,j}\) 表示前 \(i\) 个点选了 \(j\) 个点保留入边的最小代价。可以稍微想想,入边出边都不选一定不优,所以枚举选入边还是出边即可。转移显然。

坑:记得 chkmax 改成 chkmin 的时候函数里面比较符号也要改一改。

CF724F Uniformly Branched Trees

一不小心就发现了一道计数好题 QAQ

无标号树的 dp,考虑将重心作为根转成有根树计数,分单重心和双重心讨论。发现两个子树互换同构的必要条件是子树大小相同,所以可以枚举子树大小,再开一维表示子树的个数,然后组合数算。

因为这个组合数可以重复,若从 \(n\) 个方案选 \(m\) 个,考虑再插入 \(m-1\) 个点,第 \(i\) 个点表示方案 \(i\) 等于方案 \(i+1\)。所以答案即为 \({n+m-1\choose m}\)

坑 1:\(n\le 2\) 要特判,因为根节点度数为 \(1\),其他情况根节点度数为 \(d\)

坑 2:双重心的答案根节点的度数为 \(d-1\),因为要除去双重心之间连的边。

CF1437F Emotional Fishermen

周神:你怎么这题 都 不 会

\(a\) 排序,\(f_{i,j}\) 表示前 \(i\) 个数,使 \(a_i\) 为当前最大值,选了 \(j\) 个比它小的数的方案数。转移分两种,\(a_i\) 成为当前序列的最大值,或将一个 \(\le \lfloor \frac {a_i}2\rfloor\) 的数插入末尾,答案就是 \(f_{n,n-1}\)。前面的转移可以前缀和优化,时间 \(\mathcal{O}(n^2)\)

CF1437G Death DBMS

一道要用 AC 自动机的数据结构题。

询问可以直接在 AC 自动机匹配,询问 fail 树上当前点到根路径的最大值,树剖+线段树即可。因为字符串可以相同,所以还要开很多 multiset 维护。

upd: 看完题解发现我傻了,原来在 AC 自动机上暴跳 fail 的复杂度是对的,这样树剖和线段树都不用了。证明待补。

*CF1399F Yet Another Segments Subset

又忘了,Owen sb。

一个区间包含最多区间个数可以建成一个 DAG,然后在 DAG 上跑 dp,用树状数组优化 dp。然后不相交的区间再做一次 dp,时间 \(\mathcal{O}(n^2\log n)\)

\(10.31\)

【模板】Lyndon 分解

【模板】Runs

ZJOI2020 字符串

送我退役的题……膜 nealchen

*AGC010D Decrementing

博弈好题啊,可惜我长久不会直接弃疗看题解了……

*CF1236F Alice and the Cactus

分类讨论,情况巨多无比……

\(11.01\)

昨天打了一场 ZR,难得的 AK 了一场,然后发现大家都阿克了。

ARC107C Shuffle Permutation

感觉在 agc 看过类似的题,swap 行列可以分开来处理,然后一个连通块的位置可以任意 swap,那么暴力判断,算一下阶乘之积即可。

ARC107D Number of Multisets

没救了,不会 dp 了……

加进去一个数,然后讨论这个数是否为 \(1,f_{i,j}=f_{i-1,j-1}+f_{i,2\times j},(i<j,f_{i,j}=0)\)

*ARC107E Mex Mat

瞎搞题,默认自己能做出来好了

*ARC107F Sum of Abs

网络流建图神题。

题解

既然题解讲得很详细了,我就稍微总结一下。

  • \(+\)\(-\),这样代价和收益同号,便于计算。
  • 根据绝对值的正负性建二分图
  • 根据连通块,可以 \(v'\rightarrow u,u'\rightarrow v\)

以上建图满足题目的所有要求,跑最大流即可。

\(11.02\)

sb 错误合集。

  • 暴力区间覆盖用并查集加速、将覆盖过的段缩起来的时候要检查右端点和它右边,不然复杂度错的。
  • CF1444A:注意 \(p\) 的质因数分解可以包含 \(q\)\(>\sqrt q\) 因子的 \(k(k>1)\) 次方。
  • CF1444C:fa[v]=u,val[v]^=...,异或的是 \(v\),不是 \(u\)
  • 按秩合并的并查集注意 swap 的时候换根的时候不能只换根或只换原来的,根和原来的都要换。
  • 分清是 x 还是 c[x]。
  • 分清边界是 n 还是 cnt。
  • 分清 == 和 !=。
  • 注意 empty() 函数返回 1 是空,0 是非空。

\(11.03\)

我又来更 sb 错误合集了。

  • for(int i=n-1;i>=0;i++)
  • const int inf=0x3f3f3f3f3f 几个 3f???
  • 注意一边 update 一边 query 的时候哪个先做。
  • for(int i=sz-1;i;i--) 注意这里 sz 是开区间,若要倒序访问 [1,sz-1] 的元素需要 i>0!(因为 sz=0 时会一直访问下去)
  • 有 modify 和 update 两个函数的时候,而且这两个函数长的差不多,复制的时候记得递归那里的函数名要改掉。

具体的错误:

void modify(int rt,int l,int r,int u,int v)
{
	S[rt]+=v;
	if(l==r) return;
	int mid=(l+r)>>1;
	if(u<=mid) modify(rt<<1,l,mid,u,v);
	else modify(rt<<1|1,mid+1,r,u,v);
}
void update(int &rt,int l,int r,int u,int v)
{
	if(!rt) rt=++sz,ls[rt]=rs[rt]=sum[rt]=0;
	sum[rt]+=v;
	if(l==r) return;
	int mid=(l+r)>>1;
	if(u<=mid) modify(ls[rt],l,mid,u,v); // update
	else modify(rs[rt],mid+1,r,u,v);
}

变身口胡战士!这么多题要打我当场自闭

*AGC027C ABland Yard

等价一个环 \(AABB\) 循环,不会证明。

*CF1039E Summer Oenothera Exhibition

瞎想了一个做法居然是对的……

考虑根号做法,长度 \(>\sqrt N\) 暴力跳,否则用 \(\text{LCT}\) 跳,时间 \(\mathcal{O}(N\sqrt N\log N)\)

*CF1037G A Game on Strings

擅长想出离正解一步的做法的我是不是没救了……

我刚想着把相同的数相邻位置的区间预处理,然后算,时间爆炸,结果它告诉我直接对于每个 \(r\) 处理一遍就行了……

我是不是 sb……

注意点 1:中间的答案可以预处理,得到 pre,suf 后两个端点的答案然后异或一下。

注意点 2:mex 最多只有 26 位,可以压位 \(\mathcal{O}(1)\) 找。

时间 \(\mathcal{O}(26^2N+26Q)\)

*CF975E Hag's Khashba

怎么这个年头做个 OI 还要物理知识……

发现多边形怎么变,重心都是很好维护的,因此维护重心即可。

*CF1017G The Tree

好像是去年 Fading 怒切的题目,然而我并不会操作 2......

操作 1 比较简单不讲了,讲一讲操作 2。

我想了什么找到根路径时间最大的覆盖操作,比时间的大小,看来真的是数据结构题做傻了

首先可以区间覆盖,问题就是怎么将 x 子树里的点到根的后缀最大值赋成 -1。发现可以询问修改之前 x 的后缀最大值 val,区间覆盖 -(val+1)。秒啊!

下午阿克了一场校内模拟赛,结果发现大家都阿克了。

*CF936E Iqea

这 TM 都可以建点分树……

\(11.05\)

*CF986F Oppa Funcan Style Remastered

同余最短路 nb!特判 k=1/2 这题就没了,还要加个 pollard_rho。

*CF924F Minimal Subset Difference

数位 dp + dp 套 dp 即可。

n,m 不要打反!能特判就特判!要记得写拍!

*CF1442D Sum

这 tm 不就是 agc034c Tests......

我怎么做过类似的题都不会了……

*CF1442E Black, White and Grey Tree

不会,待补。

还咕着的题:

  • SIISDHPC2020F Preserve Diameter
  • CF827F Dirty Arkady's Kitchen
  • CF1190F Tokitsukaze and Powers
  • Codechef March Challenge 2020 Division 1 BREAK

\(11.08\)

*CF1310D Tourism

随机黑白染色 \(T=5000\) 次,暴力 \(\mathcal{O}(n^2k)\) dp。随一次的正确率为 \(\frac 1{2^{k-1}}\),所以总的错误率为 \((\frac {511}{512})^T≈0.000056845461206\)这乱搞题就 nm 离谱

\(11.09\)

昨天口胡完没写,今天来补坑。

*CF1310B Double Elimination

这 nm 是 B? 那我要自闭了。。。

原来觉得这个自己操纵胜局和这个规则就不可做,还要按编号顺序,结果发现按编号顺序其实已经把这题变简单了。。。

发现在第 \(i\) 轮之后,\([a2^i,(a+1)2^i-1]\) 一定有一支队伍属于胜者组,有一支队伍属于败者组。那么可以 dp,\(f_{l..r,0/1,0/1}\) 表示区间 \([l,r]\),胜者组的队伍是否在 \(a\) 中,败者组的队伍是否在 \(a\) 中,最多的比赛数。这样我们枚举两个区间的 \(0/1\),再枚举三次对局的胜者,就可以 \(\mathcal{O}(2^7)\) 转移了。这个 dp 区间的编号可以用类似线段树的方法存下来。

*CF1310C CF1310C Au Pont Rouge

想了一个逐位确定再跑 dp 的方法,大概是 \(\mathcal{O}(26N^3)\) 的,看了一下题解,出题人 nb!

首先,不要数据结构学傻了,两两之间的 \(\text{lcp}\) 是可以 \(\mathcal{O}(N^2)\) 递推出来了。得到了这个,我们可以将所有子串拿出来暴力排序。没想到吧

然后二分,转化为 \(>S\) 的划分数。这步是真的 nb。直接正的 dp 需要不断比较,但字典序靠前的字符更为重要,考虑反着做,这样满足条件的右端点是一段后缀,后缀和优化一下即可。

最后字符串要取满足条件的最右边的字符串。

*CF1310E Strange Function

没想到吧我 cf 也能出三合一

\(k=1:\)\(a_1\ge a_2\ge ...\ge a_t,\sum a_i\le N\) 的方案数。
\(k=2:\)\(a_1\ge a_2\ge ...\ge a_t,\sum i\times a_i\le N\) 的方案数。这个可以调和级数枚举。
\(k\ge 3:\) 方案数不多,用 \(k=2\) 的方法暴力做。

*CF1268E Happy Cactus

好妙的转化方式!

题解

*ARC089D ColoringBalls

花了一个半小时才看懂题解,是不是太菜了。。。

\(\mathcal{O}(N^5\log N)\) 的做法不会,看了 \(\mathcal{O}(P(N)\times Poly(N))\) 的做法。

先附赠一个表

1 1
2 2
3 3
4 5
5 7
6 11
7 15
8 22
9 30
10 42
11 56
12 77
13 101
14 135
15 176
16 231
17 297
18 385
19 490
20 627
21 792
22 1002
23 1255
24 1575
25 1958
26 2436
27 3010
28 3718
29 4565
30 5604
31 6842
32 8349
33 10143
34 12310
35 14883
36 17977
37 21637
38 26015
39 31185
40 37338
41 44583
42 53174
43 63261
44 75175
45 89134
46 105558
47 124754
48 147273
49 173525
50 204226
51 239943
52 281589
53 329931
54 386155
55 451276
56 526823
57 614154
58 715220
59 831820
60 966467
61 1121505
62 1300156
63 1505499
64 1741630
65 2012558
66 2323520
67 2679689
68 3087735
69 3554345
70 4087968
71 4697205
72 5392783
73 6185689
74 7089500
75 8118264
76 9289091
77 10619863
78 12132164
79 13848650
80 15796476
81 18004327
82 20506255
83 23338469
84 26543660
85 30167357
86 34262962
87 38887673
88 44108109
89 49995925
90 56634173
91 64112359
92 72533807
93 82010177
94 92669720
95 104651419
96 118114304
97 133230930
98 150198136
99 169229875
100 190569292

暴力程序

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105;
int n; ll f[maxn][maxn];
int main()
{
	freopen("czx.out","w",stdout);
	cin>>n;
	f[0][0]=1;
	for(int j=1;j<=n;j++)
		for(int k=0;k<=n/j;k++)
			for(int i=k*j;i<=n;i++) // i
				f[i][j]+=f[i-k*j][j-1];
	for(int i=1;i<=n;i++) cout<<i<<' '<<f[i][i]<<endl;
	return 0;
}

发现 \(P(70)=4087968\),实际上还没这么多。。。

判断可重集用贪心匹配,剩下的计数是两个组合数状物相乘。

*ARC091D Strange Nim

找出规律就不会了。。。

首先,\(\operatorname{SG}\) 函数求出来异或一下就完了。可以得到:

\[\operatorname{SG}(n) = \begin{cases} 0 & 0 \le n < k \\ \frac{n}{k} & n \bmod k = 0 \\ \displaystyle \operatorname{SG} \!\left(n - \!\left\lfloor \frac{n}{k} \right\rfloor\! - 1 \right) & n \bmod k \neq 0 \end{cases} \]

\(n\bmod k=0\)\(\not =0\) 的情况是可以互推的,\(n\bmod k=0\)\(\operatorname{SG}\) 函数可以用数学归纳法证明。

那么转移可以 \(\!\left\lfloor \frac{n}{k} \right\rfloor\!\) 相同的一起做,复杂度分析类似整除分块的方法。

鈤,在机房的椅子上睡着了,King crimson!

看了一下去年 rushcheyo 大爷的 noip 模拟题,并成功摸了一个下午

NIKKEIPC2019-2E Non-triangular Triplets

构造好题!

先判无解,\(N<2K-1\)。接着分三组,\(A=[K,K+N),B=[K+N,K+2\times N),C=[K+2\times N,K+3\times N)\)。构造时先 \(A,C\) 步长为 \(1\)\(B\) 步长为 \(2\),这样可以达到上界,将 \(K+2\times N+i\) 后面的 \(+i\) 利用起来。

总结:有时候可以先找什么情况无解,从而获得一些性质。

\(11.10\)

JSOI2008 最小生成树计数

惊不惊喜意不意外我更 bzoj 的题了

定理+题解

有了这三个定理就可以解决这题了。。。

*ARC093C Bichrome Spanning Tree

写了个假算法,自闭了。

正解就是把最小生成树弄出来,先将最小权值 \(=X\)、生成树不全同色的情况给判掉,再加入一条边,算出路径最大值。因为最小生成树的性质,一条边即可保证黑白相间最小。

我写了 \(1\sim i-1\) 同色,\(i\) 异色,其他任意的方案数。但是这种方法要算 \(i+1\sim m\) 中有几种方案取到最小生成树。这可以类似正解的方法算,不过就比正解多了个 \(n\),属于负优化。

*ARC101D Robots and Exits

sj 大爷给我们出过。

为什么不能 \(x_i\le x_j,y_i\le y_j\) 呢?因为若出现这种情况,阶梯状的面积会相互包含,方案数会算重。

ARC099D Eating Symbols Hard

难得的一道 sb 题,我都会

哈希即可,注意要求进制的逆元,模数要是个质数,比如 20190816170251

我一开始写错了没看出来,以为是单哈希的锅,结果我单哈希和双哈希都写了一遍

*ARC097D Monochrome Cat

我感觉枚举那个点开始,然后换根 dp 非常有道理。于是懒得打了去膜拜 std 了。

好,换根 dp 假了,浪费了一道思维题,唉

删掉黑色的叶子节点,发现回路的答案是个定值,再考虑一条路径对答案的贡献,发现是树的直径状物。

总结:从最简单的地方入手,寻找不变量,就有可能发现一些性质。

校内模拟赛 树上的序列

题面:

你有一棵包含 \(n\) 个节点的有根树,以节点 \(0\) 为根,同时节点 \(i\) 的父亲节点为 \(f_i\)

但是这样的树不免过于单调,于是你将树上每个节点赋予了一个属于 \([1,L]\) 的整数权值 \(a_i\)

出于好奇,你想要知道有多少长度为 \(L\) 的节点序列 \(x_1,x_2,\cdots,x_L\),满足 \(a_{x_i}=i\)\({x_i}\)\({x_{i+1}}\) 的祖先。

但是这样太简单了,接着你会对这棵树的权值进行 \(Q\) 次修改,第 \(i\) 次修改会将节点 \(i \bmod n\) 的权值修改为 \(p_i\)

你能解决这个问题吗?答案对 \(10^9+7\) 取模。

\(1 \le n,Q \le 5 \times 10^5\)

想不到吧,我树的题目就是可以线性

dp 好题!

转载自:题解

考虑没有修改怎么做:维护 DP 数组记录当前点到根以 \(i\) 结尾的方案数。只需要 DFS 入栈出栈的时候修改即可。具体来说,我们从上到下转移 DP,点 \(u\) 会被它的所有祖先给贡献得到。考虑 DFS 的过程,遍历到点 \(u\) 的时候,只有它的祖先在栈中。我们另外维护一个长为 \(L\) 的数组,表示在栈中,并且结尾为某数的方案数。入栈的时候加入当前点的贡献,出栈的时候删除这个点的贡献。这个做法的时间复杂度就是 \(O(n)\) 的。

本题有两个关键性质:节点按照深度的顺序标号,同时每 \(n\) 次修改是按深度递增的顺序进行的。我们不妨考虑连续 \(n\) 次修改可以一起做:对于每个点 \(u\),计算修改点 \(u\) 权值之后答案的变化量。

根据题目的性质,我们可以发现当修改节点 \(u\) 的时候,它的所有祖先都已经被修改,而它的所有后代都没有被修改。我们按照修改后的权值求出它祖先的 DP 值,按照修改前的权值求出它后代的 DP 值,再将它们合并。

求出祖先的 DP 值应用之前的方法即可。为了求出后代的 DP 值,我们可以发现 \(u\) 后代在 DFS 的顺序上是一个区间,我们只需要另外维护一个长为 \(L\) 的数组,表示已经遍历过的点的 DP 值之和,将进入 \(u\) 和退出 \(u\) 的两个时刻作差,就能得到后代的 DP 值之和了。

每次统一处理能够做到 \(O(n)\) 的时间复杂度,所以总时间复杂度为 \(O(n+Q)\)

*ARC092D Two Faced Edges

题解

*ARC095D Permutation Tree

不要被同构吓到,要好好分析连边的性质。。。

题解

*ARC102D Revenge of BBuBBBlesort!

这结论我 tm 怎么可能猜出来……

*ARC096D Sweet Alchemy

FJ 省冬讲过,大概是先差分,然后根据完全背包的性质调整,一个物品放若干个,剩余的物品放最多 \(n\) 个,跑多重背包。

*ARC100D Colorful Sequences

花了好久才看懂题解……

题解

注意到答案=全集-补集,然后分类讨论

  • \(A\) 包括 colorful seq,那么补集=0。
  • \(A\) 没有重复的元素,而且 \(A\) 的不同排列答案一样,考虑一起算。
  • \(A\) 有重复的元素,考虑算每次出现出现的贡献,前缀和后缀都算一遍。以前缀为例,\(f_{i,j}\) 表示前 \(i\) 个数后面 \(j\) 个不同的方案数,每次转移枚举多放一个不同的或者和前面某个相同,前者可以直接转移,后者需要一个后缀和优化。

\(11.11\)

全员恶玉怎么这么好看,直接半个早上没了

下午打模拟赛,T3 一直没想清楚怎么写,写完所有题、前两题没拍时三个半小时快用完了,又急着吃饭,于是信仰提交,发现 T2 有个地方写错+数组开小了,就当做自己写完拍就阿克了算了

忧国的莫里亚蒂怎么这么好看,直接半个晚上没了

「JOISC 2017 Day 2」门票安排

这么神的贪心还是第一次见!

题解

*「JOISC 2017 Day 2」火车旅行

向两边最大的连边,然后向两边倍增出范围即可。

\(11.12\)

*「JOISC 2017 Day 3」长途巴士

感觉自己不怎么行诶,这种级别的题都不会做了。。。

转移分两种,\(i\) 是否要走完全程,否则就早一些下车。后者的专移枚举 \(j\),然后 \([j+1,i]\) 的下车时间显然是在同一段 \(T\) 下,贡献一样,加上 \(\sum C\),是一个斜率优化的式子。维护凸包即可。

总结:不能把自己定死,我刚开始设 \(f_i\) 为前 \(i\) 个人,\(i\) 不下车的最小代价,非常麻烦。。。而且更关键的是没想到一段区间的人在同一段 \(T\) 下车。。。

*「JOISC 2017 Day 3」自然公园

转载自:zyk 的博客

如果直接已经找到的图有点直接连到了 \(x\),就直接加入 \(x\),每次找出一个连通块的 dfs 序,二分找到最后一个和 \(x\) 有连边的点,然后删去这个点,继续在分裂出来的连通块里找直到找不到一个点和 \(x\) 有连边,因为有度数限制,询问次数是对的。

如果没有点直接连到 \(x\),考虑二分出 \(x\) 到已经找到的图的编号最大的点 \(y\),先递归加入 \(y\)

*「JOISC 2017 Day 4」绑架 2

暴力找拐弯点复杂度是对的,因为每次拐弯权值会增大,所以单次询问状态数 \(\mathcal{O}(N)\)。多次询问题解中说状态数 \(\mathcal{O}(N\sqrt Q)\),证明不会。

*「JOISC 2016 Day 1」俄罗斯套娃

莫名其妙想到了最小链覆盖=最长反链。

直接扫描线+树状数组即可。

*「JOISC 2016 Day 2」雇佣计划

傻题。

*「JOISC 2016 Day 1」棋盘游戏

分类讨论题。

先判无解,然后对于每个连通块 dp。\(f_{i,j,0/1}\) 表示第 \(i\) 列,第二行的空格在当前操作序列第 \(j\) 个,通过行/列转移的方案数。用前缀/后缀和优化一下即可。

*「JOISC 2017 Day 4」Dragon 2

根号分治很显然,那个二维数点还是很巧的。

刚开始我看成了多条道路,自闭了

代码还是会写的。

*「JOISC 2016 Day 3」回转寿司

分块+两个堆即可。

*「JOISC 2016 Day 3」电报

瞎想了一个解法居然是对的。

一个大环的情况特判,保留最大的边,若有环就从环上断一条边,再加一条最大的指向该点的边。

*「JOISC 2016 Day 4」危险的滑冰

广搜都不会是不是没救了

蹬一下代价 \(1\),走一格代价 \(2\),用两个队列跑 bfs 即可。

*「JOISC 2018 Day 1」道路建设

居然是道暴力题,大草。

注意到 LCT access 的复杂度是 \(\mathcal{O}(n\log n)\) 的,所以直接暴力把同色段拉出来做逆序对即可。

\(11.13\)

「JOISC 2018 Day 1」帐篷

我居然会

先打个 \(\mathcal{O}(n^3)\) 的 dp,发现这个 dp 有一维的贡献可以快速算,于是就变 \(\mathcal{O}(n^2)\) 了。

顺便一提,若这题要做到 \(\mathcal{O}(n)\) 的空间,滚动数组要模 \(3\)

*「LibreOJ NOI Round #2」不等关系

我忘了当时怎么写的 \(\mathcal{O}(n^2)\)

用容斥把 \(>\) 限制忽略掉,发现方案数等价于把 \(1\sim n\) 填入若干递增序列,并且长度为 \(a_1,...,a_k\)。这个 dp 可以做到 \(\mathcal{O}(n^2)\),并且可以用分治 \(\text{NTT}\) 优化到 \(\mathcal{O}(n\log^2 n)\)

好像和 CF1326F1/2 Wise Men 有点像……我又不会改编题了……

「JOISC 2018 Day 2」修行

做这题的时候突然想到上一题,然后愉快写了个 \(\text{MTT}\) 把这题切了,然后发现有 \(\mathcal{O}(n)\) 做法。

喜提 loj 代码最慢 & 最长(比我长的都是模板长)

神仙的解法,转载自:zsy 的博客

  • bzoj1069 两边的要求的点(构成最大面积的)会跟对角线旋转的方向一起在凸包上同向旋转。
  • bzoj1185 凸包上的一条边一定与矩形的一条边重合。

刚突然看到两道题,提交的地方未知

*XSY3320 string

题解

*「CSP 2019 十二月」魔数

题解

那个用 \(u_3,u_4\) 表示是 smg......

\(11.14\)

忙于给模拟赛打对拍,已经一天没写题了。

*「JOISC 2018 Day 3」比太郎的聚会

想到根号分治就是傻题了。

JOI 怎么这么多根号分治?

*「JOISC 2018 Day 4」糖

好神仙的题目,但并没有看懂别人的代码。

睡一觉起来发现模拟赛有一题偷懒用 map 被卡常了,造数据的时候没注意到一般情况,到手的 ak 就这么没了。唉。

「JOISC 2018 Day 4」图书馆

0202 年了,怎么还有卡交互次数的交互题

在保序回归的论文中看到的,然而我保序回归并没看懂

最优解询问次数最多只有 \(8000\sim 9000\),看来我的常数有些大。

编号的顺序比较难处理,我们考虑算出 \(N-1\) 个相邻对。

Key observation: 从一个集合中取出一个数,操作次数变化 \(0,+1,-1\)

  • \(0:\) 在连续段的端点
  • \(+1:\) 孤立点
  • \(-1:\) 在连续段的中间

这样可以整体二分,获取一个编号的相邻编号是否 \(\le \text{mid}\)

坑:\(N=1\) 时这条链只有 \(1\) 个点,度数为 \(0\),要特判。

还咕着的题:

  • 「JOISC 2016 Day 2」三明治
  • 「JOISC 2016 Day 2」女装大佬
  • 「JOISC 2016 Day 4」最差记者 2
  • 「JOISC 2017 Day 3」幽深府邸
  • 「JOISC 2018 Day 1」栅栏
  • 「JOISC 2018 Day 2」路网服务
  • 「JOISC 2018 Day 2」最差记者 3
  • 「JOISC 2018 Day 3」安全门
  • 「JOISC 2018 Day 4」糖
  • 「JOISC 2018 Day 4」野猪

\(11.15\)

成功阿克了一次 ZROI。

ZROI Round 9 二叉树染色

也许是太久没推比较麻烦的 dp 题了吧,昨天 ZR T3 写了很久,刚开始以为不可做 QAQ

研究子树颜色翻转的本质,发现若没有操作 \(1\),答案是同色连通块的数量 \(-1\)

那么路径不交,可以考虑 dp,\(f_{x,0/1,0/1/2}\) 表示 \(x\) 颜色是否为黑色,有几条向下连上来的路径,转移有些麻烦。

f[x][c[x]][0]=f[x][c[x]^1][0]=0;
chkmin(f[x][c[x]][0],f[y][i][0]+f[z][j][0]+((c[x]^1)==i)+((c[x]^1)==j));
chkmin(f[x][c[x]^1][k+l],f[y][i][k]+f[z][j][l]+(c[x]==i)+(c[x]==j)); // 有些问题的
chkmin(f[x][i][0],f[x][i][j]+1);

大概长这样的 dp。注意,c[x]^1 那维 \(0,1\) 要特判一下。因为 \(x\) 点在路径上,所以从 \(x\) 点的子树(不包括 \(x\))向下连上来 \(0\) 条和 \(1\) 条实质上都是 \(1\) 条连到 \(x\) 点的父亲。

*CF827F Dirty Arkady's Kitchen

用一些奇技淫巧优化到 \(\mathcal{O}(m\log m)\) 的题。主要是在两个点反复横跳,然后利用 \(l_2\le r_1\) 判断有交,然后每条边只会被拓展一次。

*CF704D Captain America

有源汇上下界最大流模板题。因为只会口胡不会打去学了一下

\(11.16\)

vp 了一场 cf,发现 A,B,C 好像不怎么难,D1 想了一年,D2 赛后半小时才调出来。

CF1446D1/D2 Frequency Problem

若整个序列有多个最大的,那么直接输出 \(n\);否则一定有一个严格最大的数,设为 \(val\)

若一个区间最大的数没有包含 \(val\),一定不优。考虑调整,这个区间一定是另一个合法区间的子区间。

那么可以枚举值 \(i\),设 \(val=1,i=-1,\text{other}=0\),找 \(\text{sum}=0\) 的区间。若有其他数比 \(val,i\) 出现次数严格更大,答案一定更大,也就是说,我们求出来的答案对最终答案没有影响。

D1 就被我们解决了。

D2 就是套个根号分治。强烈谴责怎么只有 750,根号难打不只一倍

csp 挂分严重,也是自己平时习惯全写完再对拍的缘故,以后还是要写一题拍一题。

*CF578E Walking!

划分完的构造是分类讨论,LR,RL,LL,RR 四类, LL,RR 合并完了只有一种,LR,RL 取出最大的位置合并到另一个那里去,然后再分类讨论。

划分的正确性是好证的,因为贪心构造的本质是把 L(...)R(...)L(...)...L(...) 每个连续的序列取出第一个,然后相同的合并。划分完后有 \(k\) 段,答案的下界就是 \(k-1\)

找到了一个神奇的引理:LGV 引理

还有若干好玩的题目,传送门1(生成函数妙啊!),传送门2(其实我不太看得懂他说的题意),传送门3(那个平移路径真的妙),传送门4(线代不会.jpg)

\(11.17\)

正式啥题都不会,开始口胡。

*「CodeChef WALKBT」Walks on the binary tre

题解

struct cmp{
    inline bool operator()(CI &x, CI &y)const{
        return cpr(rt[x], rt[y]).fr;
    }
};

第一次见这种 cmp,可能是我太菜了。

*「CodeChef PKLVES Chef and Elephant Tree」 的加强版

题解

叶子在连续的 dfs 序上有很强的性质。

*51nod 1260 排列与二叉树

题解

zju 集训的时候直接 oeis,题解都没看懂……

学习了广义二项式系数和解生成函数!

最小表示法的证明还不怎么会。

CF1288E Messenger Simulator: 考虑补上 \(n\sim 1\) 这个序列在开头,跑数颜色。

*HDU6760 Math is Simple

题解

jc 大爷的多校题,想到第一步后面就好推了。

*51nod 1226 构造质数

题解

论文

题解看了,论文没看。

五边形数定理:传送门

下午模拟赛,有道 dp 题被我搞成了生成函数,推了两页纸,花了一个半小时,zbl。

[国家集训队]阿狸和桃子的游戏

没错,我以前抄题解的题现在忘了

*「CTSC2018」青蕈领主

非常神仙的题,现在可能就被叫做析合树计数了吧。

\[f_n=(n-1)f_{n-1}+\sum_{i=2}^{n-2}(n-1-i)f_if_{n-i} \]

题解1

题解2

CF1065F Up and Down the Tree

唉,胡错了两次。

先处理出子树能到深度最小的祖先,然后再递推出每个点向上的深度最小的祖先,把叶子的答案挂到 \(k\) 级祖先上去。因为这个深度以上的祖先都访问不到,所以构成子问题,可以 dp。

这场的 G 待补。

*「JOI2019 Final」独特的城市

算法联赛难度却很难想!

题解

\(11.20\)

前两天忙于校内模拟赛和颓废,终于开始营业了。

*CF1408H Rainbow Triples

那个把三元组转换成二元组真的 nb!

剩下的就是注意到最小割是一段前缀和后缀,可以用线段树优化。

*「CEOI2020」星际迷航

我是 sb 我是 sb 我是 sb。。。

题解

*「CEOI2020」道路

题解

*CF1404D Game of Pairs

题解

CF1439D INOI Final Contests

3100 的恶意评分

看题解看了很长时间,因为有个转移系数傻掉了一直没理解。。。

那个 \(i+1\) 是因为 \(i-1\) 一定填 LR,最后一个数插入的位置可以填 L,R,所以 \(i+1\) 种。

和等价选一次,平方等价选二次,不要想得到平方想不到和。。。

\(n>m\),可以先想 \(n=m\) 怎么做,然后将没用的位置插入合法的方案中。

所以没用的位置可以先忽略,有可能就会好做一些。

神奇的题:传送门1传送门2

*bzoj2873 光之大陆

圆排列,可以可以。

题解

*CF1452E Two Editorials

枚举第一个区间在哪里,那么每个人的答案是一段开口向下的分段一次函数对一条直线取 \(\max\),那么做一遍扫描线即可。

\(11.21\)

早上模拟赛,下午一起床就三点了,有点颓废。

「CTSC2017」最长上升子序列

杨表题,维护不升的杨表与其转置的矩阵。如果每层都二分会多个 log,直接运用单调性复杂度就是一个根号。

「LibreOJ Round #6」花火

这道题见到还是眼前一亮的。

首先,一定可以第一次交换不相邻的。证明的话,交换顺序对最多会让第二步多消去一个逆序对,而只交换逆序对的话第二步能消去的逆序对单调不升,所以第一次最优。

再考虑怎么计算答案。发现开头一段升,结尾一段升有很强的性质。它满足单调性,对于一个数算贡献的时候可以直接二分出两个区间,做扫描线,维护区间加全局最大值的线段树即可。

*「CodeChef TRIPS」Children Trips

根号分治即可。

*CF1407E Egor in the Republic of Dagestan

建反图,取最短路最大的一个点的颜色更新答案。

*「JOISC2019」开关游戏

nb! Atcoder/JOISC 的思维题 txdy!

当然 CodeForces 也有,不过出现频率感觉没这么高。

可能是这种操作的题没做过多少吧。。。

注意到区间翻转在区间赋值后面的话,可以通过一些操作调换过来。

所以存在最优操作序列,区间赋值后区间翻转,且区间赋值两两不交。

\(\mathcal{O}(n)\) dp 即可。

\(11.22\)

*CF1266F Almost Same Distance

LJC00118 场切的题。

\(k=2l+1\),那么以一个点为中心,换根 dp 出以一个点为根,其他儿子的最大深度,用线段树修改。

\(k=2l\),那么以一条边为中心,要特殊处理。具体看 题解

写了一下昨晚的 ARC,会 C,D,F,E 没想出来。

ARC108C Keep Graph Connected

随便拉一棵生成树出来讨论一下即可。

ARC108D AB

分类讨论题。

先将 \(n\le 3\) 判掉,讨论 \(c_{\text{AB}}=A\) 的情况,\(=B\) 同理。

\(c_{\text{AA}}=A\),答案是 \(1\)

否则 \(c_{\text{AA}}=B\),若 \(c_{\text{BA}}=A\),那么字符串形如 \(ASAB\)\(S\) 是长度为 \(n-3\) 的字符串且连续 \(B\) 只能出现一次,可以 dp 或者直接斐波那契数列。

其他情况一定能构造出所有字符串,答案为 \(2^{n-3}\)

ARC103F Paint Tree

先找一条直径的两个端点,将端点同色的情况判掉。不同色的话,剩下的同色最长链一定经过直径某端点,把以这两个点为根的深度拿出来,从大到小枚举,一个点出现两次颜色的时候 break 即可。

CF739D Permutations

从零开始的线代生活

题解

\(A^*=|A|A^{-1}\)

伴随矩阵 \(A^*\)\(A\) 代数余子式的转置矩阵。

具体可以把 \(AE\) 放进消元,消出 \(EA^{-1}\)。因为 \(|A|\) 是奇数,所以看 \(A^*\) 即可。要 bitset 优化消元。

CF1451E1/2 Bitwise Queries

交互好题!交互次数 \(-1\) 做法居然难了不少。

\[\text{AND}+\text{XOR}=\text{OR} \]

\[\text{AND}+\text{OR}=A+B \]

由这些式子,可以先 \(N-1\) 次询问 \(1\) 和其他点的 \(\text{XOR}\),再询问 \(3\)\(\text{AND}\),就可以在 \(N+2\) 次询问解决问题。

E1 就做完了,但是我们没用 \(N=2^k\) 的性质。

若我们询问出来的 \(\text{XOR}\) 有一对相同,那么询问两个位置的 \(\text{AND}\) 得到这两个位置的数,从而推出所有数。

若没有相同,那么序列是一个排列,一定存在 \(\text{XOR}=N-1\),那么两个数的和就得到了,这样可以搞掉一次询问,在 \(N+1\) 次询问解决问题。

\(11.23\)

POI2014 RAJ-Rally

我推给 cyw 的时候发现他早就切过了……我谔谔

删掉一个点 \(u\),将其他点分为两个集合 \(S=\{v\ |\ p_v<p_u\},T=\{v\ |\ p_v>p_u\}\)\(p_i\) 表示 \(i\) 的拓扑序。所以只存在三种边:

  • \(x,y\in S\)
  • \(x,y\in T\)
  • \(x\in S,y\in T\)

这里的边指单向边。

而前两种很好算,直接正反两遍拓扑排序算出一个点开始/结尾的最长路即可。而集合连边需要算一条边的贡献 \(dis_{u,t}+dis_{v,s}+1\)。按拓扑序做,每次 \(T\) 集合删一个点,\(S\) 集合加一个点,用可删堆维护最大值即可。

CF1451F Nullify The Matrix

终于把 Div2 的题补完了,腰酸背痛,感觉身体被掏空

状态太多了,而且操作也太灵活了,SG 肯定是没有用的,对于这种状态数没法枚举的题,可以将状态变成,对立的一些状态集合,将所有的状态归纳到状态集合中去,然后转化为状态集合之间的转化,若能让某一方一直在必败状态所在的状态集里出不来,那么就可以判断胜负了——喵了个c

博弈白学了.jpg

结论:斜对角线异或和都为 \(0\),后手必胜;否则先手必胜。

考虑证明。设异或和都为 \(0\) 状态为 \(S\),其他状态为 \(T\)。可知 \(S\) 是必败态。

显然操作一次 \(S\) 会变成 \(T\)

对于状态 \(T\)。我们取左上到右下第一条对角线异或和不为 \(0\) 的对角线,可以发现从对角线的任意一个位置出发,对于在这条对角线右下方的对角线,都有一个位置可以被遍历到。这些对角线若有异或和不为 \(0\),因为没有强制减小,将其改变一定可以使得其他对角线的异或和为 \(0\)

再考虑我们取的第一条对角线。因为现在要强制变小,所以调整类似 nim 游戏的调整,取异或和为 \(1\) 的最高位 \(k\),找到某个数该位为 \(1\),将其异或上异或和,一定会变小,相当于 \(-2^k+val\),而 \(val\) 一定不超过 \(2^k\)

Q.E.D

总结:感觉结论有点神仙,不过证明不难证。所以重要的是怎么建立状态集合,猜出结论,把题目所给的性质用起来。

*CF1091D New Year and the Permutation Concatenation

这么 nb 的题才 1700,我是不是可以退役了

*CF1452F Divide Powers

贪心,发现 \(>2^x\) 的数一定从小到大选并且从 \(2^y\) 变成 \(2^{y-x}\)\(2^x\)。接下来就是不断分裂,记得判无解的情况。

upd: 我发现那天想的漏了一种情况,就是还剩一个 \(2^y\) 且剩下的数全分裂都不够 \(k\) 的时候,要将 \(2^y\) 分裂一部分,所以还要一步类似二进制分解的过程。

*CF1452G Game On Tree

不会,没题解,待补

刚开始把题看成 Alice 抓 Bob 了,以为是博弈神题,请问有没有老哥会看错题意的版本啊 QAQ

Let's learn to solve the problem for at least one starting vertex for Alice. Let this vertex be v. In general, Alice's strategy is basically this: run to some vertex u as fast as possible and stay in it until Bob reaches u. Hesitation on a way to this vertex won't be optimal. Visiting the same vertex multiple times won't as well. I guess that can be proven more formally by analyzing the set of possible solutions after each move.

What properties should vertex u have for Alice to be able to escape to it? There shouldn't be a way for Bob to catch her midway. However, it's not necessary to check any midway intersections. If Bob can catch her anywhere on a path, she can also follow her to the end (by moving the same path) and catch her at the destination. Thus, this vertex u should be further from any Bob's chips than from v.

懒得复读了

然后就转成一道数据结构题,因为是离线版本,所以用点分树修改的时候直接对于每个点开个 \(O(size)\) 的数组,这样就把 \(\log\) 搞掉了。

*CF1466F Line Distance

这个结论我能想到个锤子

题解

*ARC103E Random IS

列出 dp 转移方程然后树状数组优化即可。

你说代码?因为一个 sb 看到题解就不想写了,所以

它鸽了。

upd: 我一直没有看懂为什么题解中 \(f_{i,j}=1+\sum_{t=l+1}^{r-1}(f_{l,t}+f_{t,r})/k\)

终于我悟了……

转移方程实际是 \(f_{i,j}=a/(a+b)\times f_{i,j}+1/(a+b)(...)\),和 \(a\) 无关。

题解

CF1439A1/2 Binary Table

好像没保存,写过的没了……那再写一遍好了。

发现 \(2\times 2\) 的方阵可以通过至多 \(4\) 次构造出来。

那么将 \(n\times m\) 的方阵转为 \(2\times m\) 的方阵,将 \(m\) 是奇数的边界判掉,剩下的上 \(2\times 2\) 的构造即可。

CF1439B Graph Subset Problem

挑 战 N P C,成功没调出来……

找度数至少为 \(k\) 的集合可以写一个类似拓扑排序的过程。

而找大小为 \(k\) 的团,可以先沿用刚才的算法跑 \(k-1\),因为不存在度数至少为 \(k\) 的集合,所以至少存在一个点度数为 \(k-1\),然后暴力判断,不行就删去。因为 \(k\)\(\sqrt m\) 级别的,所以复杂度 \(O(m\sqrt m\log m)/O(m\sqrt m)\),set/哈希表。实测 set 也过了。

CF1439C Greedy Shopping

直接找的复杂度是对的。要是 \(a_i>\frac y2\),那么 \(y\) 会少一半;否则 \(a_i\) 少一半。加上在线段树上二分,时间 \(O(n\log^2 n)\)

CF1439E Cheat and Win

一道多合一,感觉出成一棵给定的树会友好很多。

爆肝 4h 总算 A 了

首先,\((x,y)\) 会向 \((x-1,y)\)\((x,y-1)\) 连边,而且连的肯定是最小的二进制位为 \(1\) 最小的那维。

这样也说明拐点只有 \(\log 10^9\) 个,可以暴力找。

再想 SG 函数。这类题有个结论:每个位置都可以视为子游戏,所有只有它为黑色的 SG 函数异或起来就是总游戏的 SG 函数。

而每个点的 SG 函数通过归纳可得到 \(\text{SG}(x,y)=2^{x+y}\)。那么若要先手必败,SG 函数须为 \(0\),那么相同深度的点的个数必须为偶数。

考虑最小操作,发现是差分数组有多少个 \(1\)。不过注意,sum[l]^=1,sum[r+1]^=1 这种写法要忽略 \(0\),相当于把后缀差分向右移动一位。

接着就是建虚树,写个神奇的 LCA 即可。

刚开始不会 \(O(\log 10^9)\) 的 LCA,写了个 \(O(\log^2 10^9)\) 细节较少的 LCA 被卡常了,****

然后就抄了 Itst 的代码,现在还是不会

\(11.25\)

不知为何昨天颓了一天,已在深刻反省。

posted @ 2020-08-23 16:41  Owen_codeisking  阅读(1177)  评论(0编辑  收藏  举报