record 7.8-7.12

[mxr39 A]

喜报,接下来每天都有模拟赛,不用担心没事干辣。

我们盲猜,不会约分。

然后你倒推一下就做完了。

场上 nt,用了 gcd 导致 TLE 挂了一点分。小问题,攒 rp。

[mxr39 B]

如果没有保底,你会不会做?

显然,我们贪心地按照 \(k\) 从大到小选就是答案。

加上保底呢?

我们钦定一些人直接吃保底,剩下的人,仍然按照 \(k\) 从大到小选就行了。

如果钦定 \(S\) 不吃保底,并且按照 \(k\) 从大到小排序,那么答案就是

\[\sum_{i=1}^{|S|}b_{S_i}-i\times k_{S_i}+\sum_{i\not\in S}a_i \]

至此已经有了一个 \(O(n^2)\) DP。

然后写出来之后,发现这个东西是一个凸函数。其实这并不让我们惊讶。

额,然后你发现这个东西,大概可以用平衡树暴力维护整体 DP。

这不会是正解吧?感觉这个做法非常麻烦。

我猜肯定有人写这个东西,但是我不是很喜欢。

写起来其实体验还可以。这场是不是人均 200+ 了?

他给的题解写得很好,可以阅读一下。

UOJ 里的一个题

证明:

\[\sum_{i=1}^n(-1)^i\frac{\binom ni}{i}=-H_n \]

可能有一个什么唐唐归纳法。

额然后看了一个很牛的做法啊,就是我们想办法把 \(\frac 1i\) 给它吸收进去,但是直接这样肯定是没办法吸收的,就想办法给 \(\binom ni\) 拆一拆。

\[\begin{aligned} \sum_{i=1}^n(-1)^i\frac{\binom{n}{i}}{i}&=\sum_{i=1}^n(-1)^i\sum_{j=1}^n\binom{j-1}{i-1}\frac 1i\\ &=\sum_{i=1}^n(-1)^i\sum_{j=1}^n\binom{j}{i}\frac 1j\\ &=\sum_{j=1}^n\frac 1j\sum_{i=1}^n\binom{j}{i}(-1)^i\\ &=-\sum_{j=1}^n\frac 1j \end{aligned} \]

然后我们再整一个 GF 做法。额我又不会了。

\[\begin{aligned} \sum_{n=1}^{\infty}x^n\sum_{i=1}^n\binom{n}{i}\frac{(-1)^i}{i}&=\sum_{i=1}^{\infty}\frac{(-1)^i}{i}\sum_{n=i}^{\infty}\binom{n}{i}x^n\\ &=\sum_{i=1}^{\infty}\frac{(-1)^i}{i}\frac{x^i}{(1-x)^{i+1}}\\ &=\frac 1{1+x}\sum_{i=1}^{\infty}\frac{(-\frac{x}{1-x})^i}{i}\\ &=\frac 1{1+x}\ln(1+\frac x{1-x})\\ &=\frac 1{1+x}\ln(\frac 1{1-x})\\ &=-\frac 1{1+x}\ln(1-x) \end{aligned} \]

非常好啊。

[mxr40 A]

今天的题咋都这么难。其实也不算难,就是全都是我最不擅长的类型。我们看看能不能整出一点东西来。

你有不同颜色的球,然后一次操作可以放下不同颜色的球各一个到箱子里,或者拿起指定一个颜色的球。你手上最多同时拿 \(B\) 个球,你随时可以放弃球。最后把手上所有球都扔到箱子里,问箱子里最多有多少个球。

感觉是个贪心一类的东西,状态很复杂,不太能 DP 的样子。

显然箱子里的球最多等价于放弃的球最少,而放弃一个球当且仅当目前手上有 \(B\) 个球的时候会发生,所以我们的目标某种意义上是减少当前手上球的个数,也就是放尽可能多的球到箱子里,也就是希望当前手上的球颜色不同的尽可能多。

你可能会想到这样一个贪心:如果新进来的球对应颜色的个数比手上最大值要小,我们就交换。这是为了尽可能“均分”手上的限制 \(B\)

显然这个有一个问题,如果当前是一个平面上面镶了若干个凸起,然后你新进来一个新的凸起,最优方案交换不交换都有可能,这得看接下来进来什么球。也就是说我们的决策没办法完全由这之前的东西所决定,会被之后的情况所影响。

接下来有两个路子,一个是想办法说清楚怎么被之后的所影响,或者是一个反悔贪心一类的东西;另一个是,我们换一个思考顺序,使得在这个顺序下是没有影响的。

或者换个建模啥的,我们可以想到一个类似于匹配的东西,但是稍微想了一下发现没啥做法。

那看起来只有说清楚之后的影响这一个路子了。但是好复杂啊,会不了一点。

所以我现在不会一个比暴力好的做法。

为啥已经有人过了???接下来我们考虑死磕这个题。

想了一个假贪心,写了一下发现所有样例都过了,拍也没拍出来问题。一交发现寄了。

额,你发现假贪心改一行代码就对了。

这个是这样的。我们考虑之前说的类似于匹配的建模,这个建模显然更高屋建瓴一点,然后就是考虑怎么进行匹配。

首先,我们只考虑其中的某一种颜色。显然,对于一个球而言,不可能出现它后面两个洞 \(x<y\)\(y\) 被匹配了,而 \(x\) 没有。对于洞是类似的。因此我们可以声称,如果有匹配的话,一定是某个球跟某个洞匹配,这样的关系只有 \(O(n)\) 种。

剩下的问题就是,你有很多种颜色,怎么去确定我们该让哪个颜色上不让哪个颜色上。

你考虑最优方案,然后我们扫描最优方案,扫到了一个 \(-1\) 位置,考虑它之前每个颜色的最后一次可匹配的出现,发现一定是贪心在此处匹配所有能匹配的,否则留到后面只会变得更长,没有意义。

因此我们按照这个顺序贪心即可。

我不明白为什么这么多人都会的题我却没想出来,事实上我离正解非常接近,并且正解也不困难。NOI 场上最怕的就是这个,如果别人都会你却不会,那就爆炸了。

怎么避免这种事情发生?我们是不是经常想一想,一个正常的 OIer 会怎么想。

[mxr40 B]

\(n\) 个东西,每个东西有 \(k\) 个档位,你要给每个东西选一个档位。

定义两个东西的不融洽度,是 \(f(i,x_i)+f(j,x_j)+c|x_i-x_j|\),全局不融洽度是两个东西不融洽度的最大值。你要最小化这个东西并输出方案。\(k\) 很小。

注意到最终方案当中,只有每个档位 \(f(*,x)\) 的最大值是有意义的,所以就只剩下 \(k\) 个数两两取最大值了。那接下来你就钦定其中一些东西是最大值,你考虑存不存在一个合法方案。

考虑档位 \(i\) 的最大值落在 \(p_i\) 位置,接下来对于任意一个东西 \(a\)\(\exist i\in[1,k],f(p_i,i)\ge f(a,i)\),这就是合法的条件。

然后你发现这个条件可难做。

另外一个做法是,你考虑任意两个选择的不融洽度,然后二分一下,相当于有一些连边表示这两个选择不能同时被选,问你存不存在合法方案。这是 k-sat 问题,我不好讲能不能做。

感觉这几个想法都比较萌萌哒。

[UNR #3 D1 A]

我们需要更多的题来保持手感。这场 UNR 好像比较简单。

你要从 \(n\) 个物品中选出 \(m\) 个,物品有属性 \(s_i,v_i\),方案的价值是 \((\sum_{i\in S}v_i)^a-|\max_{i\in S}s_i-\min_{i\in S}s_i|^b\),最大价值是多少。\(n\le 2\times 10^5,m\le 50,1\le a,b\le 2\)

显然来对 \(a,b\) 进行一个分讨。如果 \(a=b=1\),这显然是可以 \(O(nm)\) DP 解决的。

如果 \(a=2,b=1\),我们考虑进行一个扫描线,然后枚举 \(mx\),对于每个 \(mn\) 维护这之间 \(\sum v_i\) 的最大值。

哦哦,我大概会了。好题啊!

[UNR #3 D1 B]

这种题恰恰是我不擅长的,所以我们要好好做一做。

一共有 \(n\) 个任务,你每天可以完成 \(m\) 个任务,任务之间有依赖关系,构成一棵树。问你最少多少天可以完成所有任务。

\(m\le n\le 10^5\)

你发现你的目标是用最少的天数完成任务,换句话说,你希望每一天完成任务的额度都没有被浪费。

有一个猜测:我们每次贪心选度数最多的,度数相同贪心选高度最高的。

另外还有一个思路是,我们先估一个下界出来,然后证明下界是可以取到的。

一个 nt 下界是 \(\lceil\frac nm\rceil\),显然不一定取得到,所以我们的答案跟形态有关。

额但是有一个贪心是对的。就是你考虑当备选点 \(\le m\) 的时候,选择方案都是唯一的,当 \(>m\) 的时候,你发现当且仅当你选择了一个叶子,才会导致备选点减少,所以你尽量避免选择叶子就可以了。

但是不光这样。你发现我们会选择叶子,当且仅当目前非叶子节点不够多了。所以我们在考虑贪心策略的时候,还要注意,尽量保持非叶子节点个数 \(\ge m\)。例如按照 \(dep\) 贪心就是正确的。

[mxr31 A]

怎么今天比赛就无了,让我随机找一场来补一下。

这是个特殊图让你求最大团。为啥我感觉一个团必须所有人都有一个公共交点。

假的。应该这么说,它是由一些有公共点 \(x\) 的线段,以及若干个不经过 \(x\),但是绕了整个环大半圈的线段,这两部分组成的。

如果不是环而是链的话,那么上面这个猜测是正确的。

这性质可能不太够。我们当前做法自然是枚举一个交点,然后考察这边选了哪些线段,以此来推断另一边选择的线段要满足什么条件。

问题出在,这个条件并不是一两个参数就能说清楚的,并且这样的条件种类是很多的。

接下来能做的,应该是使用贪心的原理,尝试减少我们的枚举量。或者更换一种枚举方式。或者我们有一些性质没有发现。

如果我们真的确定了一个交点,那么剩下的这是一张二分图,会有连边表示说这两个点之间是矛盾的。

额,我们更绝一点,枚举两个交点,然后变成一张二分图,连边表示矛盾。这样复杂度是 \(O(n^2m\sqrt{m})=O(n^5)\),好歹是个多项式做法。

那你干嘛要这样。你考虑对于没有连边的两个点,连一条边,表示矛盾。接下来就是要求一个最大独立集,任意图最大独立集。

当然这个图有性质。

阅读了 sol,我们发现的性质反而阻碍了我们思考。你只需要考虑枚举某一个在最大团内的弧就可以了。这有什么方法可以引导我们想到这一步吗?

[mxr31 B]

分析 \(A\)\(B\) 的 cover 需要满足什么条件。

发现显然,\(A\)\(B\) 的 border,cover 关系有传递性。如果记 cover 集合是 \(S(B)\)\(A\)\(B\) 的最长 border,那么 \(S(B)-B\subseteq S(A)\)

并且发现,\(S_i\) 如果是 \(S_j\) 的 border,但是不是它的 cover,那么对于 \(k>j,S_i\) 也不是 \(S_k\) 的 cover。换言之,一旦退出就永久退出了。

这样我们就很会一个离线算法。考虑在 sam 上进行值域线段树合并以维护 endpos,同时可以维护 pre,这样就能在线段树上二分求出它的 lim,然后对 kmp 的 fail tree 进行树剖,支持单点修改,查询到根的链上异或和。

然后我们想一想在线算法。

考虑怎么能知道某个东西要被删掉了。我们维护每个前缀上一次出现的时刻 \(lst_i\),考虑如果 \(cur-lst_i>len_i\) 也就是 \(cur>lst_i+len_i\) 就说明爆炸了。这样我们只需要查询这些位置,就能知道哪些位置该删了。

所以现在的问题仍然是,怎么在线地在链上查这个东西。

我们有一个性质没有用上,就是 cover 的传递性。由这个,我们可以知道,一个链上 lim 是递减的。或者说 fail tree 关于 lim 构成一个大根堆。那显然我们一个点实际上的 cover 构成 fail tree 的一个前缀,所以 cover 关系构成一棵树,我们想办法求解这个树。

那么我们只需要在一个点被删除的时候,把它跟它的父亲合并起来,就可以了,这只需要 dsu 就可以维护,不需要什么 lct 一类的。

我发现,我的问题是,题目一旦稍微变得复杂了,我就难以抓住重点。

[mxr42 A]

咋不太会啊。冷静一下。

你发现我们很好奇最优策略到底是啥。这就有两种情况,最优策略是容易描述的,或者最优策略本身就需要我们进行 dp。

贪心打剩下的人当中命中率最高的是假的。

经过分析,你发现第一个人的策略,应该是比较自己打中的情况下,不同 case 的胜率哪个最高。有一个简单的贪心,就是对于同一段敌人,它只选胜率最高的那个。

然后你发现即使是 AEAE 这种情况,第一个人的策略就必须通过计算来展现了。所以我猜测最优策略没办法简单描述。

但问题是,我们做 dp 的状态太多了,这状态数类似于 \(3^{\frac n3}\)。有一个想法,我们能不能延后决策,或者我们更改一下 dp 顺序啥的。

不会做。打表观察了一下选择,发现有点像是有一个顺序,它会按照顺序选择第一个还活着的敌人。假的。

另一个思考角度是,你考虑这个人在选择时的所有状态,发现一定是原状态的一个子集。然后就不会了。

不是咋都会 A???这咋做的。

[mxr42 B]

没看懂样例啥意思啊。

它是不是把空集也给算上了。逆天。

我们先考虑一个怎样的字符串可以被清空。显然它需要是偶数。然后你发现消除是一个匹配的过程,你发现就是不能匹配 01

这样的话,我们大概就有了一个 \(O(n^3)\) 的做法。你发现它居然一点部分分都没有。

我们考虑把当前的问题描述得更清楚一点。相当于我们有两步:子序列,填 ?

你可以描述成,对于每种填问号的方法,我们都进行匹配,只需要满足匹配不能相交,不能匹配 01,其他的无所谓,也就是说,可以有数没有被匹配,这样的方案数。

也可以描述成,对于一种满足上述条件的匹配,我们考虑有多少种填 ? 的方案,使得没有匹配 01 产生,这个显然单独考虑每个匹配带来的贡献就可以了。

感觉第二个描述更好一点。

考虑另外一个匹配的方法,就是类似于栈,我们记录 \(dp_{i,j}\) 表示当前已经考虑了前 \(i\) 个位置,然后有 \(j\) 个未匹配的左括号。你发现不太够,需要记录 \(dp_{i,j,k}\) 表示有 \(j\) 个未匹配的 \(0\),有 \(k\) 个未匹配的 \(1\)。显然是可以进行转移的。

额我好蠢,它要计数的是可以删空的字符串个数,不是问你删空的操作方案个数。

这种不能匹配 01 的,根据我们之前那个题的做法,发现不能删空的一定形如 0(00|11|10)*1

设计一个自动机,手玩了一个 \(n=6\) 的,这怎么样都能做了。

posted @ 2024-07-12 17:25  PYD1  阅读(12)  评论(0)    收藏  举报