其他分享
首页 > 其他分享> > 7.18-7.24 总结

7.18-7.24 总结

作者:互联网

昨晚上耍手机耍到凌晨三点,真的离谱,感觉自从上周放了假以来越来越颓了。
有时候还不如上一天文化课,饭后课前搞OI来得好。
每天玩4k人菜瘾大,Malody 3dan 都过不去,真的乐
学习效率真的很低,因为颓的机会太多了。一周时间,暑假作业只做完了数学和一半物理。
得改变一下了。

扯了一堆无关的东西,现在要总结这一周做的好题。以后要坚持3天一更,延续省选前的传统。

但是也不能和那段时间写的一模一样。不能想到哪儿写到哪儿,也不能是几天的日记合并在一起。

主要目的还是得收集一些好题,以及总结一些教训。

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。于是直接跑,复杂度是对的。

标签:总结,10,rs,7.24,7.18,然后,枚举,ls,dp
来源: https://www.cnblogs.com/Sakurajima-Mai/p/16518721.html