record 6.10-6.14
* [abc357 G]
观察到 \(m\le 50\),说明绝大多数行它们都是完全没有阻挡的。考虑使用 dp 的方法计算,对于有阻挡的部分我们暴力计算,这部分复杂度是 \(O(nm)\) 的。
对于没有阻挡的部分,我们考虑进行一个快速计算。考虑第 \(x\to y\) 行都是空的,第 \(x-1\) 行的情况是 \(\{a_n\}\),我们先考虑那些在第 \(x-1\) 行就已经有了的数。
观察到,一个序列 \(a\) 经过 \(k\) 次前缀和变化得到 \(b\) 之后,\(b_i=\sum_{j}val_{k,i-j}a_j\),这显然是卷积的形式,我们可以快速计算。
注意到有些位置是事后出现的,我们要考虑这部分怎么计算。
额我最初的想法是,给它配一些合适的初始值,然后它就可以自己计算了。后来发现这初始值配起来有一点困难,可能也能配,找规律不清楚能不能找出来。
然后阅读了 sol,这个感觉有点牛的。
它先容斥一手,这个是常规手段。然后观察一下,发现特殊的 \(m\) 个可以单独贡献,对于新加入的 \(n\) 个,贡献可以拆成 fft 的形式,就可以做了。
这个题的问题出在,我们最开始没有去做容斥,我想着是先研究清楚没有这个限制的情况再继续做,殊不知没有这个限制的情况也是一个容斥的东西。有的时候没有思路了可以不必死磕。当然也可能是我的这个做法也行只不过我没做出来。
* [YDRS#008 E]
场上一看是数论题就没动力了。
要求 \(\sum_{x=1}^n\sum_{y=1}^n\sum_{z=1}^n[x^y=y^z]\),考虑对 \(x,y,z\) 进行质因数分解之后变成 \(\prod_i p_i^{\alpha_i/\beta_i/\gamma_i}\)。
对单个质因子 \(p\) 考虑,这相当于要求 \((p^{\alpha_i})^y=(p^{\beta_i})^z\),即 \(\alpha_iy=\beta_iz=val_i\)
然后经过一些简单的分析,你发现记 \(d=\gcd(val_i)\),那么这所有的条件都等价于计数满足如下条件的 \((z,val_i)\) 对。
设 \(d=\prod p_i^{a_i},val_i=e_id\),显然需要 \(\lceil\dfrac{val_{mx}}{a_i}\rceil\le z,z\mid val_{mx}\),
阅读了 sol,感觉自己啥都不会了。
显然 \(p\) 是一个前缀,并且当 \(b\ge 3\) 的时候有用的 \(p\) 就不多了,你可以对每个 \(b\) 去处理一下有用的 \(p\) 的前缀和。
当 \(b=1\) 时,变成 \(\sum_a\sum_p[p\le\frac na,p^a\le n]\),随便做做。
当 \(b=2\) 时,变成 \(\sum_a\sum_p[2\mid p^2][p^2\le\frac{2n}a,p^a\le n]=\sum_a\sum_p[2\mid p][p^2\le\frac{2n}a,p^a\le n]\) 照样随便做做就行了。
[CF1979 E]
似乎并不是很难。
我们转切比雪夫,然后考虑枚举最靠左的那个点,进行一些讨论之后发现几种情况都是比较简单的。
然后 sol 里头说了发现原坐标系一定存在两个点满足 \(|x_i-x_j|=|y_i-y_j|\) 然后做一些什么东西,这个本质上仍然可以从切比雪夫里头推出来。
* [CF1979 F]
甭管有没有用,你先想想怎么保证一个完全图删了 \(n-2\) 个边之后仍然存在哈密顿路径。
首先显然删 \(n-1\) 个边可以删同一个点的,这样就爆了。所以这个界是紧的。
考虑证明合法性,使用数学归纳法。为了进行归纳,我们需要一个点,这个点连的所有边当中,被删了的边要介于 \([1,n-1-\lceil\frac{n-1}2\rceil]\) 之间,然后我们删了这个点之后就能归纳了。
那是不是一定存在这么一个点呢?感受一下,大概确实如此。
然后它这个询问操作本质上就是,你给一个度数下界 \(x\),它给你返回 lower_bound 的编号,并且顺便把这个点删掉,再找不直接相连的一个点,给你返回编号。这东西一点感觉都没有,感觉在乱问。
这种东西一般都是要先有一个找哈密顿路径的算法,然后对着这个算法套交互上去。
我们猜一个做法:考虑每次选择剩下能走的点当中,度数最小的一个,并且把这个点删除掉。怎么感觉不太对。
好消息是写了个暴力发现这玩意确实是对的。坏消息是你用它给的询问似乎没办法实现这个算法。
阅读了 sol。
这个题的逻辑应该是这样的:首先我们意识到这是套了交互的壳,本质上是要找一个适应这种询问的哈密顿路径算法。然后猜测这个算法是递归的,我们尝试归到更小的情况,然后进行组合。这个时候我们之前分析出来的,这个点被删了的边要介于 \([1,n-1-\lceil\frac{n-1}2\rceil]\) 就有用了,因为你进行一些计算发现,剩下的肯定要有度数大于 \(n-3\) 的点,你就分这个度数是 \(n-2\) 还是 \(n-1\) 讨论。如果是 \(n-2\) 我们直接就可以到一个更小情况,如果是 \(n-1\),你发现还得带一个添头,这个添头显然度数越小越好,事实上我们只需要它 \(\le n-3\) 就可以了,然后把这两个同时删掉,就可以继续做。
感觉思路其实挺清楚的,不应该想不到。
[CF1984 D]
要糖丸了。看了 tag 才会这个东西。
刚读题觉得挺神秘的啊。
其实你想一下,只要 \(t\) 不是全都是 a,我们把整个字符串当中的 a 都删了,那 \(t\) 剩下的部分肯定得是这个新字符串的循环节,这循环节不是很多,然后你再讨论讨论看看这个 a 怎么说就行了。
复杂度大概是 \(O(n\log n)\)。
[CF1984 E]
这个一眼就是点分树对吧,它的目标是让我们最大化点分树的叶子个数。
然后你有一个想法就是把点分树变成某种给每个点的标号,这个标号可能是层数也可能是个排列,它大概还要满足一些额外的条件。然后对这个标号去做一些叶子的东西。
我们考虑使用排列的标号方式,这样一个点是叶子当且仅当,它是根并且只有一个儿子,或者它不是根并且周围点的标号都比它小。
那显然,我们为了最大化这样的叶子个数,可以考虑取一个树上独立集,根需要单独考虑。并且这样的选择方案一定对应于一个排列,问题是它是否对应于一个合法排列。
通过感受这股劲,我们大概知道确实对应于一个合法排列。让我们来写一下。
喜报,过了。
[CF1984 F]
这东西看着挺有意思的。
我们先考虑给你一个 \(s\) 让你判合法。
显然可以把 \(s\) 划分成若干连续段 P 与 S,每个连续段内只有开头的元素是不确定的,换言之,我们十分清楚相邻的两个位置能否同时是 P 或者 S,这启示我们找到相邻的两个位置能否是 PS/SP 的条件。
对于 PS 而言,你发现这时你知道了整个序列的和,你只需要要求所有 PS 的和都相同就行了。
对于 SP 而言,你发现如果你知道了整个序列的和,那么你就知道了这两个位置的和是多少,并且经过探究,你发现这些东西都是等价的。
现在发现整个序列的和是很重要的,考虑分有没有 PS 两类来讨论。
如果没有 PS,说明这是 SSSSSPPPPP 类型,你其实还是知道整个序列的和,然后随便做做。
如果有 PS,你发现可能合法的整个序列的和是 \(O(n)\) 种,考虑对每一种和 \(sum\) 分别计算。
你发现这个时候问题变成,给定一些修改,形如钦定 \(a_{i,*}\to a_{i+1,*}\) 是否合法,然后询问最后 dp 的结果。这个显然可以矩阵加上线段树来处理对吧。
那这样,似乎我们就做完了。问题出在,我咋是个 \(O(n\log n)\) 呢?
我们一点点写写看看。
看了 comment 里头有个人也是这么做的,所以我们就对了。写了一下,跑得飞快啊。
[CF1984 G]
通过打表找规律,我们发现,当 \(k=n\) 时,排列不变,当 \(k=n-1\) 时,排列可以变成轮换。
当 \(k\) 是奇数时,排列可以变成任意结果,当 \(k\) 是偶数时,排列可以变成奇偶性相同的结果。
那显然找到最大的 \(k\) 我们可以解决了,问题是怎么用这个 \(k\) 进行排序。
\(k=n/n-1\) 都是 trival 的。我们考虑一般的情况。先考虑 \(k\) 是奇数的时候。
算了不用考虑了,你发现这个操作基本上跟 \(k+1\) 的轮换是等价的,然后就变成了 sd 一轮的那个题。
~ [mxr24 A]
看上去不是很困难。
显然,让 \(k\) 是黑色比较困难,我们考虑反面。因为最后的终止情况是不能有相邻的白球,因此它左右两侧必须是黑球,因此 \(k-2,k+1\) 必须进行过操作。
剩下的就是两块独立的长度分别为 \(k-3,n-k-2\),我们只需要计算出现这种情况的概率就可以了。这概率可以考虑对每种最终情况出现的概率进行加和。
具体来说,如果一个最终情况,它有 \(p\) 次操作,那么出现这种最终情况的概率就是 \(p!\frac{(n-2p-1)!!}{(n-1)!!}\),而对于一个长度是 \(n\) 的段而言,它最终进行了 \(p\) 次操作的方案数是 \(\binom{p+1}{n-2p}\),那么真正的答案就是
阅读了一些 tip。
我们进行一个感受,发现两侧是独立的。也就是说,如果我们记 \(dp_n\) 为长度为 \(n\) 的序列,最后染色要求最右侧的是白色的概率,那么答案就是 \(dp_kdp_{n-k+1}\)。
考虑怎么算这个 \(dp\),考虑你第一步是怎么走的,于是就有 \(dp_n=\frac 1{n-1}\sum_{i=1}^{n-2}dp_i\)。
所以上面的计算方法是错误的,原因是每次操作的概率是在不停改变的。
感觉我烂完了。
这个题还有一些不清楚的地方,就是为啥两侧是独立的。毕竟你真的把算式列出来的话,你左侧取一个数也会影响接下来的概率,并且还有左右取的顺序的问题。
[mxr24 B]
这个是不是只有 sam 能胜任这种工作。
先考虑计数。
对每个 sam 节点,我们来考虑这一组 endpos 相同的节点,它们合法的条件是什么。
首先,\(len\ge mxgap(endpos)\),这样可以保证它能够把中间部分给覆盖了,然后 \(mxgap\) 可以启发式合并什么的随便做做。其次,\(lps(s,s_i)\ge v_p,lsp(s,s_i)\ge v_s\),这个是在处理可以超出去的部分。
而因为这一组它们是一条后缀链,所以 \(lps\) 本质上是在 kmp 的 fail tree 上跳到 lowerbound 处,然后相当于又被转化为了 \(len\ge val\) 的要求,其实就是起始位置在一个区间里头,终止位置都相同。
\(lsp\) 本质上是对翻转之后 kmp 的 nxt 数组有一个 \(\ge\) 的要求,那这个其实可以被我们扔到主席树上做就行了对吧。
那现在计数我们会了,考虑怎么找最短、字典序最小的一个。
首先考虑最短怎么做。这个可以类似求出来这个最短的长度。然后有一个比较菜的做法,就是我们把所有长度是这个的给它提取出来,然后一个个 check,直接定位到 sam 上节点去爆算就行了。
UOJ 里的一个数学题
三个人在玩游戏,一开始随机两个人对局,每个人赢的概率都是 \(\frac 12\),一个人轮空。接下来输的人轮空,剩余两人对局,一直进行直到存在一个人输了 \(k\) 次为止。问期望对局数。
显然,我们可以考虑序列 \(S\) 记录下来每一局的败者,这个序列只有相邻两项不能相同的路径,并且这样的序列跟对局情况是一一对应的。
考虑在这个序列上存在一个人出现了 \(k\) 次,不妨假设这个人是 C,那显然 C 的 \(k\) 次出现把序列 \(S\) 分成了非空的 \(k\) 段,每段内部一定是 AB/BA 交替出现。这样我们情况已经很确定了,剩下的就是计算部分。
[百度之星 2024 第一轮初赛 B]
为啥我三分钟还没写出来???
显然,如果设 \(T=\text{lcm}(1,2,\dots,n)\),那么最后的答案就是
首先 \(T\) 的计算,我们可以依次找出每个质因子的次幂来解决。
\(F\) 的计算,你可能可以直接认为这是 Direclet 前缀和,使用 FMT 相同的方法可以做到 \(O(n\log\log n)\)。为了理性愉悦,我们尝试做到 \(O(n)\)。
这需要这函数的特殊性质。考虑我们乘上一个质数 \(p\) 之后会发生什么。不妨设 \(z=z'p^\alpha\),如果 \(\alpha=0\),那么 \(F(zp)=(1-\frac 1p)F(z)\);如果 \(\alpha\ge 1\),那么 \(F(zp)=F(z)\)。这样,我们就可以筛一筛了。
\(S\) 的计算,我们先计算出 \(\frac 1i\) 的前缀和 \(s_i\),\(\frac 1{i^2}\) 的前缀和 \(t_i\),那么
至此,我们可以在线性时间内解决这个问题。
来都来了,顺便手推一下线性求逆元的部分。
设 \(p=xq+r\)
nm,想错了。
它是每遇到一次都会打一次招呼,所以 \(i<j\) 的打招呼次数是 \(T(\frac 1i-\frac 1j)\),白浪费感情!!!

浙公网安备 33010602011771号