7.18-7.24 总结

CF1408H Rainbow Triples

标签:模拟费用流,线段树

感觉模拟费用流就是先把图建出来,使问题更直观,再一波乱贪心,用一些DS来维护。

这道题就是极好的例子。啊这个题应该叫模拟最大流?

我们依靠对问题的分析建出来了个图,然后最大流=最小割,就发现图的特殊性质带来的优势,把问题转化成了一个二维偏序状物。

具体的有点长,懒得写了。

AUOJ1622 小Y的序列

标签:伯努利数,二项式反演

啊就是这么个式子:\(\sum_{j=0}^n j^k=k![x^k](e^{x(n+1)}-1)/(e^x-1)\)

怎么来的呢,\(j^k=k![x^k]e^{xj}\) 对吧,然后等比数列求和

这个就可以拿来求 \(\sum_{j=0}^n j^k\) ,当 \(k\)\(n\) 不变的时候。

然后我们这个题用容斥的技巧推一下就好了。懒得写了。大概就是一个:

“恰好”和“钦定”间的处理。

gym102155E

标签:FFT

一句话题意就是求 \(\left\lfloor\dfrac{n}{99}\right\rfloor+\left\lfloor\dfrac{n}{999}\right\rfloor+\left\lfloor\dfrac{n}{9999}\right\rfloor+……\)

\(n\)\(10^{10^5}\) 级别。

这个等于 \(n(10^{-2}+10^{-4}+10^{-6}……)+n(10^{-3}+10^{-6}+10^{-9}……)+……\)

然后我们统计每个 \(10^{-i}\) 出现的次数。

\(n\) 和这个卷起来就好了。感觉一开始“这个等于”很关键。

注意小数部分特殊处理。

CF1707D Partial Virtual Trees

标签:前缀和

感觉要是这场打了能涨大了,因为 C 和 D 都是很快想出来的。
但是没用。等下次真打 div1 还是要萎。

那个 \(S1!=S2\) 的限制很反,直接容斥解决。

然后记 \(dp_{i,j}\) 表示 \(i\) 子树内活得最久的点在第 \(j\) 棵虚树还存在。

然后转移分两种:

第一种,我们点 \(i\) 活得最久。那剩下的点就直接求个前缀和,再乘起来,很简单的。

第二种:我们点 \(i\) 活得不是最久。我们考虑枚举最久的所在的子树 \(v\)

假装枚举最久时间 \(t\) 和第二久的时间 \(t2\) 这个方案就是 \((t-t2)dp_{v,t}(\prod dp(v2,t2)-\prod dp(v2,t2-1)(v2!=v))\)

发现可以整理一个 \(a_ib_j(i-j)\) 的形式,枚举 \(i\) ,还是能前缀和一下算。

需要注意的是当算 \(dp_1\) 的时候不能算进去第二种情况

铭记前缀和优化

CF1648E Air Reform

标签:kruskal 重构树,启发式合并

啊既然路径权值是所有边的 \(\max\) ,让它最小,我们不难想到用 \(kruskal\) 重构树处理。

把原图的树建出来,这个补图上 \(u\)\(v\) 的边权就变成了两点的 \(lca\) 的权值。

题就是想让你把补图的最小生成树求出来。

我们还是依据 \(kruskal\) 算最小生成树的思路,贪心的尽量取更小的。

于是直接 \(dfs\) 一遍整个树,然后对于一个点 \(x\),先让 \(ls\) 内 和 \(rs\) 内处理完,再考虑合并。

如果 \(sz_{ls}>sz_{rs}\) 就交换 \(ls\)\(rs\)

然后枚举 \(ls\) 端每一个联通块 \(G1\) ,再枚举内部每一个点 \(x\),再枚举 \(rs\) 端每一个联通块 \(G2\) ,再枚举内部每一个点 \(y\) ,如果 \(x\)\(y\) 间在原图没边

就直接 merge \(G1\)\(G2\) ,把 \(G2\)\(rs\) 端删去

然后每个 \(G1\) 处理完丢掉 \(rs\) 端去。因为会有两个 \(ls\) 端的联通块,通过一个 \(rs\) 端合并在一起了。要认真处理这种情况。

为啥复杂度是对的。

首先成功匹配的次数是 \(O(n)\) 的。然后不成功匹配的次数怎么算。

一个 \(x\) 会被算多少次。有两种,一种就是直接被枚举到,一种是被丢进 \(rs\) 端后往上,成为了另一个 \(ls\)

那这个过程就是 \(O(\log n)\) 的,因为我们进行了 "\(sz_{ls}>sz_{rs}\) 就 \(swap(ls,rs)\)" 的操作。

所以这一部分一共是 \(O(m\log n+n)\) 的。很神奇。启发式合并,很神奇。

P6758 [BalticOI2013] Vim

标签:“线头”dp

挖槽这个太牛逼了。就是把一个序列上反复横跳的路径,我们想象它是一根线,然后在每个点切一刀分成若干段,然后我们考虑顺序的考虑这残破的每一段

在想办法连上线的同时,也统计了答案。我们还可以在每个线上记一些信息。

说到这个题,首先有一个贪心,能看出来每一段是有一根线或三根线的。就是跳,取E,跳,取E,的过程。

于是记 \(f_{i,j}\) 是考虑到了第 \(i\) 段,然后第一根线想跳到后面第一个为 \(j\) 的,然后当前总代价最小值。

\(g_{i,j,k}\) 同理是第一根线跳到 \(j\) ,第三根线跳到 \(k\) 。转移不难,分 10 类讨论。

TOPCODER 14069 BearDestroys

标签:状压dp

(\(n\le 13,m\le 30\) )

挖槽这个也很nb。首先他要求的操作顺序是先按 \(i\),再按 \(j\)。我们直接状压就是 \(O(nm2^m)\) 的。G。

我们换一个想法。考虑它一个格子 \((i,j)\) ,它的决策只会影响 \((i,j+1)\)\((i+1,j)\) ,\((i+1,j-1)\) ,\((i-1,j+1)\) 的决策。

于是我们以先按 \(i+j\) ,再按 \(i\) 的顺序操作。很神奇吧!

再在这个基础上 dp ,复杂度就变成了 \(O(nm2^n)\)

gym102586A Cookies

标签:复杂度分析

先把它的题意转化成这样一个过程:

每次添加一个数 \(x\) ,然后从 \(1\)\(n\) 顺次考虑

  1. \(o_i=1\) ,则 \(b_i>x\) 的情况下要 \(swap(b_i,x)\)

  2. \(o_i=2\) ,则 \(b_i<x\) 的情况下要 \(swap(b_i,x)\)

最后 \(ans=ans+x\)

那发现连续一段 \(o\) 相等的情况下可以合并,用一个堆维护。\(o_i=1\) 则弹最大的,\(o_i=2\) 则弹最小的。

然后再考虑,设前面一坨 \(o_i=1\) 堆顶为 \(a\) ,后面一坨堆顶为 \(b\)

如果 \(a<b\) ,因为此时没法连续刷两个堆,所以无论 \(x\) 取何值,这俩堆的顺序都不重要了。

于是可以交换它俩,再和两边的堆合并。反之同理。

如果 \(a>=b\) ,考虑两个堆在 \([b,a]\) 间的数的个数。

发现每次起码要减1。于是直接跑,复杂度是对的。

怎么想到的呢。我觉得得把这些情况讨论好,才能发现这些性质吧。

比赛总结

  1. 打了两场 div2,一场 div1。都打挺好的。只是 EDU 因为开场没做出来C,心态暴躁,吃了很多罚时,以后要稳住。

  2. 打了一场 ABC,打得很垃圾。G和H都不难啊,G那个转移方法和所谓“斯坦纳树”有点像,不该想不到。

  3. 打了两场多校。贡献为负吧,只会做简单题,还半天调不出来。感觉没有偶环就是仙人掌,这个性质很有趣,记录一下。

  4. 打了两场模拟赛。全是套路题,除了那个“线头”dp。我欧拉路径都能求挂,要注意到欧拉路径的起点有两种情况,一种进化成回路,则出-入=0,一种出-入=1

就写这么多。暑假还有5周(可能只有4周?疫情结束就要回去whk?),状态得好起来。

posted @ 2022-07-25 20:25  grass8woc  阅读(86)  评论(1编辑  收藏  举报