『竞赛日记 2020 』(上)

2020 竞赛日记

目的是总结没有来得及写完的题目中蕴含的idea以及梳理每日所学。

Jan.

14
  • 成功地换上了\(Ubuntu19.10\) 心情一颗赛艇 还是我太naive了 真·对\(Ubuntu\)一见钟情,太好用了趴。 立志精通\(Ubuntu\)
  • 集训队\(dalao\)安博施讲题 主题是并不简单DP。
DP杂题 \(I\)
  • [x] \(CF372B\ Counting \ Rectangles\ is \ fun\)

​ 题目本质上是求四维偏序。先描述一个矩阵,处理成一个仅带有0和1的四维矩阵,再告诉你一个四元组 \(\),求解\(i,j,k,l(i\leq k,j\leq l)\)满足

\[\begin{cases} \ i \ge \ ai \\ \ j \ge \ bi \\ \ k \le \ ci \\ \ l \le \ di \\ \ f[i][j][k][l] = 1 \end{cases} \]

的总方案数。考虑到类似这样的二元组\(\)描述的是一个无限扩展的平面,把每个\(f(i,j)=1\)的点投影到整个平面中,如此,便可\(\mathcal{\mathcal{O} } (1)\)求出某个点右上方所含的包含\(1\)的点。至于投影,如果需要 \(ai\leq i\)则在\(x\)轴上作后缀和,反之作前缀和[1]。这个东西的名字叫偏序,二维的叫做二维偏序,四维则叫做四维偏序。

  • [x] P3746 组合数问题

  组合数本身的性质适合递推,考虑到每个物品只有选与不选两种,设计方程\(f(i,j)=f(i-1,j)+f(i-1,j-1)\)。矩阵加速并滚掉\(i\)维度即可。

  • [ ] P2519 \(Problem\ a\)

  可将题目转化为选取任意个带权集合,各个集合没有交集,使得最终的权值最大。

  • [ ] P3188 梦幻岛宝珠

  大致是利用二进制,对于每一个\(a\)对前面的\(a\)做一遍背包,再将所有背包根据一点奇技淫巧合并即可。合并蕴含了贪心的思想。

  • 上课的时候与 $ wyx\ wey\ hkh\ wyc\ lys\ zjy$ 一起讨论出了课堂上的很多题目。有时候真是人多力量大,某个人可能想到了这个思路但没深入想便放弃了,但如果讲出想法没准就有人可以顺着思路想优化。默契×10086 !
  • 学习了\(LateX\)的一点皮毛。\(LateX\)着实好用,用来表达一些公式关系之类的再好不过了。
15

\(AC\)自动机这个东西不难,现学现用嘛。”

“二项式反演很简单的,知道\(f(i)\)\(h(i)\)很简便的。”

​ —— \(dalao\) 安博施

“机房就是一个摩尔庄园。”

​ —— \(Imakf\)

  • 今天也是安博施讲课。如果说昨天是并不简单DP的话,那今天就是魔鬼DP了 AC自动机容斥原理树上斜优警告 真的还有好多东西不会。思维也完全跟不上,讲的东西只能意识跟着走,一时半会根本想不出来代码怎么实现。
DP杂题 \(II\)
  • [ ] ~$ K\ perm\ counting$

    ​ 将一个序列横着写一遍纵着写一遍形成一个方阵后,每个排列就可以对应方阵中的一行\(0/1\),加上\(\neq k\)的条件可以看成是给方阵画 \(y=x\pm k\) 的图像,再将横/纵坐标相同的所得的点连起来形成一根链,这样可以得到若干条链,要求链上的任意两点不相邻。在若干条链上DP即可。

  • [ ] $ BZOJ4361 \ isn$

  • [ ] \(P3349\) 小星星

  • [ ] \(P4728\) 双递增序列

  • [ ] \(P3311\) 数数

  • [ ] \(BZOJ1767\ harbingers\)

  • 今天复习了一下树形DP,在DP1上也写了两个题。希望自己能重新回顾DP1和DP2,按计划在放假的十几天内把这十几天来布置的题目认真做完总结好。尤其是DP2,多训练思维。

16

“期望的本质是积分。” —— \(Imakf\)

“信息学最重要的是数学基础。” —— \(ysuperman\)

“期望可以代表整体。如果这串数随机选一个期望为\(k\),你就认为每次选择都是\(k\)。”
—— \(lightmain\)

  • 早上罕见地 \(7:30\) 才起床 还下了点小雨 预示今天的悲惨??

  • 上午讲解概率和期望。

概率期望 概念
  • [ ] 概率分为古典概型和几何概型。古典概型结果有限,几何概型结果无限。古典概型和几何概型中每个基本事件的发生概率均相同。任意两个基本事件互斥。

  • [ ] 互斥事件:如果事件\(A\)与事件\(B\)不能同时发生,则称事件\(A\)与事件\(B\)互斥。

    对立事件:如果事件\(A\)与事件\(B\)必有且仅有一个发生,则称事件\(A\)与事件\(B\)对立。

    独立事件:如果事件\(A\)与事件\(B\)相互没有影响,则称事件\(A\)与事件\(B\)相互独立。

  • [ ] 性质:互斥事件任一发生可加,独立事件同时发生可乘。

    ​ 即 \(P(A \cup B)=P(A)+P(B)\ \ P(A \cap B)=P(A)*P(B)\)

  • [ ] 全概率公式:$P(A)=\sum _{i=1}^n{F(Bi)*P(Bi)} $ \(F(x)\)表示\(x\)\(A\)中的比例

    全期望公式:\(E(A)=\sum_{i=1}^n E(Bi)*P(Bi)\)

  • [ ] 几何概型一般转化成坐标系考虑。随机变量就是维度,坐标系中的点对应一个基本事件,满足条件的事件(点)所组成的a度量(面积/体积等)与总度量的比为满足条件的事件的发生概率。

  • [ ] 在区间\((a,b)\)中等概率选择一个实数,其为有理数的概率是 \(1\),为无理数的概率也是 \(1\) 。即概率为 \(1\) 的事件不一定是必然事件。

概率期望 例题 [2][3]
  • [ ] 在\((0,1)\)内任取两个数\(a、b\)\(|a-b|>=0.5\)的概率为\(\_\_\_\)\(a^2-b>=0\)的概率为\(\_\_\_\)\(a^2+b^2\leq 1\)的概率为\(\_\_\_\)
  • [ ] 把木棍砍成三截,能拼成三角形的概率为\(\_\_\_\)
  • [ ] 正实数范围内任意选三个数,能拼成三角形的概率为\(\_\_\_\)
  • [ ] 给定一个\(2*2\)的方阵,初始时位于左上角,每次随机走向一个相邻的格子,则走到右下角的期望时间为\(\_\_\_\)
  • [ ] 长度为 1 的线段上随机取两个点,则以这两个点为端点的线段的期望长度为\(\_\_\_\)
  • [ ] 圆内任意取四个点,则四个点在同一半圆的概率为\(\_\_\_\)
  • 中午天气难得放晴 预示下午状态转好??
  • 下午讲解概率DP 说是概率,设状态90%都是期望QAQ
概率DP
  • [x] \(P5014\) 红包发红包

    ​ 在一堆数字中等概率取数,可以把每次取数都简单地看成是取了期望值。大数定律告诉我们,在随机事件的大量重复出现中,往往呈现几乎必然的规律,而这个必然的值就是期望。所以可以简单认为单次选择必然选中期望值。 ( 口糊数学证明??)

  • [ ] \(CF1245E\ Hyakugoku\ and\ Ladders\)

  • [ ] \(P1291\) 百事世界杯之旅

  • [ ] \(CF24D\ Broken\ robot\)

    ​ 高斯消元。

  • [ ] \(P3232\) 游走

  • 今天上午感觉不是很好,可能是由于本身概率期望的概念就没搞得很清楚,就引入了微积分。学东西还是要首先把握最核心的,最基本的,再去创新,再去与别的东西融会贯通。课堂上讲的一些题目非常经典,抄到了日记上,以后要多多温习、领会。经过中午把概念理清楚,下午听课就好多了。

  • 真·我还是太弱了。\(Imakf\) 大佬讲到排列组合会排列组合,讲到概率期望会概率期望,讲到高斯消元会高斯消元,讲到微积分连微积分也会,而且都是能拿来做难题的层次。平心而论,我的数学基础还是有些薄弱。多理解,多做题,多去看看书,不会的就问。希望以后至少达到碰到常规上的排列组合啊之类的可以轻松做出来的层次吧。

  • 今天写了一道计数题,自己手推,受益匪浅。数学题一定要多做,练出感觉来。DP1也写了1道题。DP1的题目还是挺有嚼头的,争取\(AK\)

  • 调试数据太弱一直是我的缺点。整理一下方法?

如何设计有强度的调试数据
  • [ ] $0\ /\ 1/\ $负数
  • [ ] 数列中含有重复数字
  • [ ] 题目设定的极限数据
  • [ ] 多模字符串匹配问题中相同的模式串
17

  “人生就像动态规划,你的一个又一个阶段是由上天安排的,而你,决定的是在这一阶段可以由上一阶段的哪些状态转移而来。越勤奋,越幸运,并不代表这一次你决策的方向有多么优秀,却代表着现在的这一个状态能够续写多少可能的结果。”

  • 上午,信息组与生物组联谊去隆平科技园做实践活动。博物馆中看到了很多专业的生物知识,或许放在小学初中我就当看看就过去了,但我今天确能看懂许多东西了。所谓的“三系法”等等经生物组巨佬 \(ljw\) 讲解也大概搞清楚了。知识的确可以改变一个人的许多,包括看待事物的心态,学习知识的速度等。蛤蛤 \(ovo\)

好像与竞赛内容无关,算辽

  • 下午写了一道数位DP。 大概是我没看题解切的第三道数位DP?? 现在数位DP的感觉还不错,普通的数位DP可以纯凭一己之力想出来了。但比较难的,创新一点的题就是个未知数了。

  • 晚上华精聚会

  • \(22:30\) ~ \(24:00\) 可能是我搞竞赛的主力时间(哭)。很开心,DP1除了那道容斥原理的题,其余都写了。DP1的题目确很有意思,值得一刷。

  • [x] \(Blocks\)

      区间DP。关键是如何设置状态。题目难点在于每一段区间内我们应该分成多少段合并。枚举分成多少段是 \(2^n\) 级别的,显然不可做。考虑到其实这 \(2^n\) 中,我们其实又有大量冗余的计算,对于\(r\)后面剩了相同数量同种颜色的状态,我们是可以合并的。于是问题可做了。

18 小年快乐

\(Oh,my\ sweet \ summer\ child,what\ do\ you\ know\ about\ fear\ ?\)

"生于夏季的小可爱啊,你又知道什么是危险吗\(?\)"

​ ——《权力的游戏》

  • 上午做树形DP。成功AK了树形DP。
  • [x] \(P2279\) 消防局的设立

​ 首先应区分好选择某点与覆盖某点的不同。看题解前本题给我的一个困扰是如何处理兄弟节点相互覆盖的问题。题解是在父亲节点处处理兄弟节点互相覆盖的问题。而实现这个转变只需要考虑每个节点覆盖到向上\(x\)层的最优方案就可以了。

  • [x] \(POJ2486\ Apple\ Tree\)

​ 本题的难点在于我们不能确定一棵子树究竟是走到底还是走回来。而这个问题的关键又在于最后是否回到子树的根,而非经过子树的根几次。一定要把握住问题的关键去设方程。

  • 下午只想着放假,无心学习。跟着 \(zzt\) 学习了一下怎么装 \(ubuntu\) 。貌似回家路上我还满怀希望呢。
  • 晚上,安装 \(ubuntu\) 失败。整个晚上,一事无成。被家里电脑整疯了。欲语泪先流。
19
  • 昨天的自己不像自己啊。或者说不像我心目当中的自己吧。为了装一个 \(ubuntu\) 真就荒废了一个晚上呢。也许这是我的一个顽疾吧,放假的时候心总是立刻就散漫了,总是想着像以前小学那样,一颓一上午甚至是一天。今天没做多少常规作业,\(CF\) 的比赛没有坚持,\(vjudge\) 上的题目也没做。效率极低。你要记住你现在还很菜呢。该改变的时候就不要犹豫吧。

  • 状压DP告一段落。

  • [x] \(P2831\) 愤怒的小鸟

  • 啊李庚希真是太漂亮辽。

20
  • 数位DP告一段落。

  • [x] \(HDU4507\) 吉哥系列故事——恨7不成妻

​ 题目的难点在于如何实现平方和的递推。考虑到每一次求解平方和时:\(ans(now)=\sum_ {i=0}^{up}ans(i)\) ,而\(ans(i)=i^2*\sum_{i'=0}^{up'} num(i')+\sum_{i'=0}^{up'} ans(i')+2*i*\sum_{i'=0}^{up'}sum(i')\)(其实也很好理解,就是完全平方式的展开公式,由于是累加所以带个\(\sum\))所以每次记录下\(num(i)\)符合条件的数字个数、\(sum(i)\)符合条件的数字和以及\(ans(i)\)符合条件的数字的平方和即可实现递推。

  • [x] \(POJ3208\ Apocalypse\ Someday\)

​ 二分+数位DP。

21
  • 之前做的题目量看上去很多,但实际上都是那一类里面最简单的几个题。要啃硬骨头!尤其是培训之间学的模模糊糊过去的知识点(斜率优化 四边形 DP杂题等等)要多练习。

  • [x] \(P3303\) 淘金

​ 一道小技巧很多,非常优秀的题。首先考虑一维情况下,所有变换后有金子的格子上的数字\(x\)一定可以写成\(2^a * 3^b * 5^c * 7^d\)的形式。于是将n以内的这样的数离散化,对每个数作一遍数位DP,看看它能由多少数字转移过来(记为\(c(i)\))即可。二维的答案就是\(c(x)*c(y)\)。处理出前\(k\)大也需要技巧,可以利用大根推来维护。

  • [x] \(P3195\) 玩具装箱
  • [x] \(P2120\) 仓库建设

​ 两道斜率优化模板题。斜率优化注重式子的变形,在变形过程中可以自己定义大量参数来简化过程,但在打代码时一定要注意自己定义的参数在\(0\)处的初始化。

23
  • 开始写数据结构了。
  • [x] \(POJ1733\ Parity\ Game\)

​ 关系并查集。区间\([l,r]\)的奇偶性不好转移,记前缀和为\(S(i)\),则区间\([l,r]\)的奇偶性实际上就是\(s[l-1]\)\(s[r]\)的关系。据此建立关系并查集即可。

  • 对于线段树的模板不够熟练,要多敲。向\(yxt\)学习,以后每天一遍。
25 大年初一

"\(POJ\)的题目都好难。"

​ ——罗艺翔

  • 哈哈哈哈关系缓和了\(QAQ\)

  • 今日线段树:WA;错因:标记下传时没有上传值;区间修改时没有标记下传。

  • 继续做\(DataStructure\)的题目

  • [x] \(POJ2182\ Lost\ Cows\)

​ 思维题。重点是要发现当倒叙遍历时,\(Ai+1\)就是当前位置上的数字在剩余的数字中的排名。值域线段树维护就可以啦。

  • [x] \(POJ1151\ Atlantis\)

​ 扫描线的思路挺好想的,重点是如何维护线段树。可以这样考虑:每个区间有一个标记,如果标记\(>0\),则整个区间都被覆盖,反之,则该区间被覆盖的部分由左边被覆盖的和右边被覆盖的组成。据此维护线段树即可。还应注意这个方法没加标记下传,是有局限性的,不可随意推广。

  • 加油!明后两天正面刚平衡树!
26
  • 今日线段树:WA;错因:数组类型没开\(longlong\)
27
  • 今日线段树:AC!官宣我与线段树!
28
  • 平衡树终于打过了!明天开始争取每日一遍平衡树+线段树!
平衡树 \(Treap\)
  • [ ] 本质:带旋二叉搜索树。

  • [ ] 基本功能:\(Insert、Delete、Get\_val、Get\_rank\)

  • [ ] 核心思想:旋转不会改变\(BST\)的性质,但可以改变堆的性质,且旋转只改变了当前节点与其父节点的堆的性质。故对于一个满足\(BST\)性质但不满足堆性质的树一定可以通过旋转使其成为\(Treap\)

  • 于是顺便用平衡树做了几个题。

  • [x] \(P3369\) 普通平衡树

  • [x] \(P2234\) 营业额统计

  • 还有几个用线段树/并查集做的题,非常经典,重点总结。

  • [x] \(POJ2828\ Buy\ tickets\)

​ 值域线段树好题。首先观察题目发现是插队问题,于是从链表或逆推两个角度去思考。但是由于题目每次询问给的是排名而非值,而排名一直在变化,所以用链表不好做。首先可以发现,当前数\(Ai\)的含义是轮到\(i\)\(i\)之前有多少人,那么逆推推到\(i\)时,\(i\)之后的已经各就其位了,\(i\)就应该站在第\(Ai\)个空位置上。查询第\(Ai\)个空位置,选择用值域线段树。完结撒花~

  • [x] \(SPOJ1716\) 区间在线求最大子段和

​ 求和线段树好题。我首先所想的也是考虑要求前后缀的最大子段,但我没有把它深入去思考,上升到维护的层面。还是思维太局限了 这题给我的最大启示就是同一棵线段树绝不仅仅只能维护一个\(sum\)啊,\(max\)啊,它还可以维护许多东西,只要区间整体的信息是由子区间的信息传递来的,就都可以维护。

  • [x] \(POJ2912\ Rochambeau\)

​ 关系并查集好题。先总结一下关系并查集。关系并查集常用于只知道两者之间关系,每个数隶属于哪个集合不确定的题目。常见的题目为各种循环有序集等。每个集合中的元素关系相互确定,且值均以代表元素的值为\(0\)进行计算。不同集合中的元素关系无法确定,但可以通过转化进行合并。本题为关系并查集的变式。枚举法官即可。

29
  • 今日线段树:AC。

  • 锻炼了一下关系并查集。

  • [x] \(POJ1417\ True\ Liars\)

​ 关系并查集+动态规划。加深了对关系并查集合并时的一点理解:可以看成是数轴上的四个点\((x,y,fx,fy)\),其中\(dis(x,y)=d,dis(x,fx)=val(x),dis(y,fy)=val(y)\),自然\(,dis(fx,fy)=val(x)+d-val(y)\)

30
  • (扫描线+)线段树的一天。

  • [x] \(POJ3667\ Hotel\)

​ 线段树的灵活运用。注意处理时保留的是最长的连续值的长度,至于求解第一个位置,可以递归时处理。毋需保留。

  • [x] \(P1856\ Picture\)

​ 求解平面上\(n\)个矩形的周长交集。显然扫描线+线段树。细节注意:由于求解长度时必然是两个坐标相减,若对于一个\([1,4]\)的区间,其结果由\(x[2]-x[1]+x[3]-x[4]\)转移而来的话显然少了\([2,3]\)这一段,所以每次求解答案时应\(x[r+1]-x[l]\)。查询的一开始时候把右端点\(-1\)就可以啦。

31

区间静态第K大,线段树上持久化。

​ ——沃茨基 · 硕德

被逼的无奈只能拿可持久化开刀了QAQ

  • 被可持久化支配的一天。可持久化代码不难打,较其他数据结构模板也较容易理解,但难以实际应用,有必要对此进行总结归纳。
主席树
  • [ ] 本质:有诸多根节点的线段树

  • [ ] 区别:与线段树节点与区间一一对应关系不同,主席树区间可以对应诸多节点。

  • [ ] 核心思想:对于仅有单点修改的线段树,其每次修改的操作只会影响一条链上的点,于是就可以新建一个根记录时间戳,根节点的左右儿子中不包含被修改节点的直接继承上一个时间戳,另一个新建一个节点,递归更新,最大限度的利用了空间。

主席树经典应用
  • [ ] 静态区间单点修改 且树上保存的权值具有可减性;

  • [ ] 访问历史版本。

  • 今天数据结构落幕了,回想起\(25\)号,那时候不抓紧的话真的可能一题也没做了QAQ。抓紧时间,对自己更有信心,借着这段时间状态不错认真学信息。

  • [x] \(P3919\) 可持久化数组

​ 可持久化的基础。模板题。

  • [x] \(P3834\) 区间第\(k\)

​ 静态区间第\(k\)大问题模板。首先,现在考虑权值大小问题时学会往平衡树和权值线段树方面去想。其次,平衡树上每个点保留的是区间中的数本身,不具有可减性,而权值线段树上每个点保留的是当前区间内小于等于区间右端点的数的总数,具有可减性。于是考虑可持久化权值线段树解决本题。

  • [x] \(P3402\) 可持久化并查集

​ 个人感觉可持久化的题目中最难的一道。首先要明确的是,由于可持久化中只支持单点修改,所以不能够进行路径压缩。其次,在寻找集合的代表节点中,由于我们已经把之前的信息都继承过来了,所以\(f\)数组中一直都是当前节点的父亲点值,而非某一个之后添加的编号。换句话说,\(f\)数组里的值恒小于等于\(n\)。顺便学了带秩合并。

  • [x] \(P4735\) 可持久化\(Trie\)

​ 本质上与之前的很相似。结合题目的区间要求,可以给\(Trie\)树加个\(cnt\)\(cnt\)具有可减性,与之前的可持久化权值线段树就一致了。

  • 以后碰到了区间限制的题目也可以考虑可持久化做法啦!!

Feb.

2
  • 开始字符串专题了。今明两天主攻\(KMP\ Hash\ Trie\ AC\)自动机。今天重点做\(KMP\)\(Hash\)

  • [x] \(POJ1840\ Eqs\)

​ 本来应该是个哈希题的,但我用哈希死活\(TLE\),后来学习网上的用\(short\)过的。 \(excuse\ me\)?!!

  • [x] \(POJ1961\ 4\ Numbers\)

​ 与上题一样是个哈希模板,但我用\(vector\)的哈希死活\(TLE\),网上的链表做法可以过,我\(copy\)下来自己造数据跑结果跑的没有我的程序一半快\(qnq\)。心如死灰地抄题解走人。

  • [x] \(POJ2406\ Power\ Strings\) & \(POJ2752\ Seek\ The\ Name,Seek\ The\ Fame\) & \(POJ1961\ Periods\)

​ 三个题都揭示了\(KMP\)算法中\(Fail\)数组的其他性质。\(Fail\)数组的本质是前后缀匹配的最大值。先摆结论:假设匹配\(t\)数组,若\(n\%(n-Fail[n])=0\),那么\(t[fail[n]-1,n]\)必然为串\(t\)的最大周期子串。证明很简单,由于\(n\%(n-Fail[n])=0\),所以原串必然可以被分成\(k\)份,每份\(n-Fail[n]\)个。由\(Fail\)数组的定义可知,将最大前缀与最大后缀拎出来比较可以发现第一份必然全等于第二份,第二份必然全等于第三份......以此类推即可得证。同时,按照这个方法对\(Fail[i]\)进行一次,可得到次大周期子串。

  • 今天最大的收获莫过于学会了扩展\(KMP\)
扩展\(KMP\)
  • [ ] 本质:高效求解文本串的每一位与模式串的最大相同前缀。

  • [ ] 与\(KMP\)的区别:\(KMP\)应用上还是不够广泛,局限于字符串匹配问题中。而扩展\(KMP\)应用范围就广泛多了。并且在求解完扩展\(KMP\)问题后字符串匹配问题也迎刃而解。

  • [ ] 核心思想:假定目前已匹配完的文本串最远的的位置为\(Maxp\),与之对应的位置为\(p\),对于文本串的第\(i\)项,我们将与文本串的首项与\(p\)对齐,然后\(i\)\(i\)之后一直到\(Maxp\)就已经与相对应的模式串对应好了。但我们要求解的是最长前缀,故我们现在要知道对于模式串的某一位与模式串本身的最大前缀。\(Next\)数组闪亮登场。而\(Next\)数组的求解就是模式串自己更新自己的过程。至此,算法大致成型。

  • [ ] 一定要多画图理解

  • 终于把做题记录补完了。哪天抽空我得把\(Typora\)告诉老师。

  • 待完成的好题

  • [ ] \(POJ3167\)

  • [ ] \(POJ2185\)

3
  • 今天效率不错,学习了很多新东西。感觉这几天随着强度加大我每天的学习也更充实了。
  • 看看今天学习的新算法吧\(QAQ\),以后多复习。
\(Manacher\)算法
  • [ ] 基本功能:求解最大回文子串。

  • [ ] 核心思想:类似于扩展\(KMP\),充分利用已求解的信息。假定目前右端点最靠右边的回文子串的右端点为\(R\),中点为\(Mid\),那么对于当前枚举到的第\(i\)\((i\leq R)\),必然有\(p[i]>=min(R-i+1,p[mid*2-i])\),即由于前后关于\(Mid\)对称,则\(i\)可继承\(i\)的对称点信息。再扩展\(p[i]\)并适时更新\(R\)\(Mid\)即可。

  • \(Manacher\)做了点题目。

  • [x] \(P3805\ Manacher\)模板题

  • [x] \(P4555\) 最长双回文串

​ 本题的实质是求解两个数组\(L\)\(R\),满足\(L[i]\)为以\(i\)为左端点的最大回文子串长度,\(R[i]\)为以\(i\)为右端点的最大回文子串长度。我最开始的想法是边\(Manacher\)边更新所有的\(L[i]\)\(R[i]\),但不幸地\(WA\)掉了,原因诸如这组数据:\(BBABBA\)\(L[5]\)(从1标号)显然是\(5\),然而由于计算\(p[4]\)\(R\)端点更新为了\(6\),故\(L[5]\)计算错误。之后我就发现:每个\(L[i]\)\(R[i]\)一定都是由某个\(mid\)推出来的\((i\in[Mid-p[Mid],Mid+p[Mid]])\),再通过递推对目前所有满足条件的\(Mid\)带来的值取\(max\)即可。

\(AC\)自动机
  • [ ] 基本功能:高效实现多个模式串与单一文本串的匹配。
  • [ ] 核心思想:将多个模式串构建成一棵\(Trie\)树,对每个节点(假定当前节点为\(i\))求解一个\(Fail\)指针,满足\([0,Fail]\)[4]\([0,i]\)\(Trie\)树上存在的最长后缀。这样就可以在当前节点失配时快速找到下一个可能满足的位置。\(Fail\)指针的求解:首先第一层的节点的\(Fail\)值必定为\(0\);其次,由于\(Fail\)指针的求解具有层次性(必须先求解深度浅的再求解深度深的),考虑用\(BFS\)暴力搜索;第三,\(Fail(t[u][i])=Fail(t[f[u][i])\),即自己的失配指针为父节点的失配指针的与自己所含字母一致的儿子。
  • [ ] 细节注意:对于不存在的儿子节点,由于可能有\(Fail\)指针指向它,为了保证正确性,应使不存在的儿子节点编号直接等于其父亲的\(Fail\)指针的相同儿子的节点编号。
  • [ ] 复杂度注意:与文本串匹配时,仅暴力跳\(Fail\)可能会导致复杂度退化为\(\mathcal{O} (|S|*|T|)\)。将\(Fail\)指针看成边,可得到一棵\(Fail\)树(节点为字符串),树上任意两点的\(LCA\)为该两点的最长公共后缀。且树上的每个节点均为\(Trie\)树上的某个前缀。暴力跳\(Fail\)其实质就是沿着一根链一直向上跳。至此,优化就很明显了。可以每次只保留每个点的\(ans\),最后拓扑排序,每个点的\(ans\)再加上自己子树的\(\sum ans\)就好了。复杂度为\mathcal{O} \((|S|+|T|)\)
  • [ ] 扩展:\(Trie\)图、\(Fail\)树、可持久化。
  • 用AC自动机做掉了洛谷上的三个模板。前两个都是普通AC自动机,后一个则需要拓扑排序的优化。
  • [x] \(P3808\ AC\)自动机模板
  • [x] \(P3796\ AC\)自动机模板加强版
  • [x] \(P5357\ AC\)自动机模板数据加强版
后缀数组\(SA\)
  • [ ] 基本概念:\(SA[i]\)保存第\(i\)名的后缀的起始位置。
  • [ ] 实现原理:倍增+基数排序 (扩展:\(DC3\))
  • [ ] 核心思想:\(Rank[i]\)表示当前以\(i\)开头的字符串的排名,与\(SA[i]\)构成映射关系。首先根据每个单个字符排序,得到\(Rank\)数组,即每个位置的关键字。首轮排序完后,我们再把相邻两个\([i,i+1]\)的的\(Rank\)合并。自身的\(Rank\)为第一关键字,其后面的\(Rank\)为第二关键字进行排序。排序完后,第\(i\)位上的关键字是以i为起始位置的后缀的前两个字符的排名,第\(i+2\)位置上的关键字是以\(i\)为起始位置的后缀的前两个字符的排名,这两个一合并,即为以\(i\)为起始位置的后缀的前四个字符的排名。至此,倍增思路应不难想出。由于仅有两个关键字,且关键字范围不大,故所用排序为基数排序。
  • 待完成
  • [ ] \(P3804\) 后缀自动机 及练习题
  • [ ] \(P5496\) 回文自动机 及练习题
  • 加油!明天也要像今天一样效率满满哈\(QAQ\)
4
  • 今天的学习状态上午效率不高,但下午看线段树\(PPT\)的时候非常专注,基本上理解了大多数的题目。

  但依旧打了2h才出一个题目QAQ,实现能力太差了...

  • 上午:树状数组初步。了解树状数组的功能等。
树状数组初步
  • [ ] 基本功能:单点修改区间查询。

  • [ ] 进阶功能:区间修改区间查询(任何只涉及单一变量的具有可减性的连续求和)/求第K大的数、求数K的排名/前驱/后缀等。

  • [ ] 与平衡树的区别:线段树实现平衡树的功能必须要求值域范围比较小。

  • 找了几个模板题做。

  • [x] \(POJ2985\) 第\(K\)小集合

  • [x] \(P3372\) 树状数组实现区间修改区间查询

  • [x] \(P1972\) \(HH\)的项链

​ 好题。我一开始的想法是主席树,但发现很难使节点具有可减性。正解是离线算法,将所有的待求解区间排序再处理。在线转离线+排序是个很棒的思路。

  • 树状数组还有很多拓展功能今天上午没学,明天上午加油!下午重点完成的线段树。

  • [x] $P4198 $ 楼房重建

​ 较灵活的线段树。启示:线段树上某个区间的值被修改后若会影响到其兄弟节点的值,不要放弃思路,考虑是否能在兄弟节点上继续递归维护,将复杂度做到\(\mathcal{O} (log^2n)\)

  • [x] \(P4097\) \(Segment\)

​ 标记永久化的精髓体现。永久化的标记一定是基于整个区间得来的。即当前节点的标记是能覆盖到节点所代表的整个区间的。同时,标记永久化后每个节点的答案就由递归路径上的所有节点决定,而不是它本身的值单一控制了。标记永久化灵活简便,但貌似不可以以此处理所有的标记。使用时要注意。

  • [x] \(P3373\) 线段树模板二

​ 经典好题。当要维护两个懒标记(如同时有区间乘法维护\(mul\)和区间加法维护\(add\))时,需自定义一个求答案的方法。重点:先考虑如何求答案,在考虑标记之间如何互相维护。本题中,求解答案既可以一路向下求每一层的\(add×mul\),再加入答案之中;也可以只是求\(\sum add\),最后加上当前节点值。再考虑如何维护。若用第一种方法,则每次新增一个\(add\)时,加入标记的必须是\(add/mul\)\(mul\)则自由维护;而用第二种方法,每次新增一个\(add\)时,加入标记的是\(add×mul\)\(mul\)仍然自由维护。显然,第二种维护避免了实数运算,高下立判。

5
  • 今天感觉一天效率都有点低...或许是线段树更高级以后代码量激增导致做题速度变慢了吧。还是要更熟练!

  • [x] \(CF444C\ DZY\ Loves\ Colors\)

​ 线段树经典应用:区间覆盖问题。第一次独立尝试标记永久化写题,但仅对值作了永久化处理,覆盖标记没有任何传递处理。(注:覆盖标记是不能永久化处理的!)这个题目给我一个血淋淋的教训:任何标记,要么永久化处理,要么就下传,总之一定要被传递。

  • [x] \(P2572\) 序列操作

​ 区间覆盖问题。思维难度不大,独立思考做出来的。但代码量嘛...\(4kb\)警告...,而且基本上包含了很多基础内容。打完以后觉得自己的线段树实现能力更强了。对了,这个题\(1A\)

  • [x] \(P6055\ Siano\)

​ 区间覆盖问题的变式。题目一个很重要的性质:当第一次对序列排序后,任意时刻序列均有序。对于“削去\(>=\)大于等于\(Limit\)部分”的操作,考虑分为三步实现,首先,二分查找(与性质联系上了!)出第一个大于等于\(Limit\)的点,然后,区间求和\([limit,n]\),最后,区间覆盖\([limit,n]\)。区间求和与区间覆盖可以合并写。性质找到,思路理清后,代码实现就很简单了。注意:由于存在区间求和操作,则每次临时求解区间最大值操作复杂度为\(\mathcal{O} (logn)\)。直接维护区间最大值来简化代码和时间复杂度。

  • [x] \(P4041\) 奇怪的计算器

\(Siano\)的强化版,再维护一个区间最小值即可。技巧:设定一个\(f\)函数,\(f(x)=k1*x+k2*...+kn\),每次传入不同的\(k\)值,来实现同一函数维护各式各样的乘法加法。\(1A\)

  • 总的来说,今天重点突破了区间覆盖类的线段树题目,并且阅读了一篇教线段树卡常及拓展的\(PPT\)。思路大致理解了。先留个坑,以后记得敲。
  • [ ] 非递归版线段树
6
  • 上午主要练习\(RMQ\)\(LCA\)问题。整个上午感觉效率不高,\(LCA\)看完基础实现的三种方法后,看了三道例题,但只有两道看懂了,有一道还没有敲。图论太恐怖了\(QAQ\)

  • [x] \(P1816\) 忠诚(\(RMQ\)模板)

  • [x] \(P3379\) \(LCA\)模板

​ 以往都是用倍增去做,但今天学到了\(RMQ\)做法和\(tarjan(Orz)\)两种方法。尤其是\(tarjan\)做法,在离线情况下可以做到近乎线性的复杂度。 可是我太菜了我写的tarjan比以前写的倍增还慢

  • [ ] \(P3320\) 寻宝游戏 (思路懂 对拍\(10000\)能过 但交了就\(WA\)

​ 图论题目有许多技巧,比如本题需要用到结论:树上任意点集的极小连通分量的边权和=按时间戳排序并首位相接后的\(\sum dis(a[i],a[i+1])\)\(dis(i,j)\)表示树上两点的最短路径长度。令\(d(i)\)表示节点i到根节点的路径长度,那么\(dis(i,j)=d(i)+d(j)-2*d(LCA(i,j))\),问题转化为在线求解\(LCA\),大功告成。

  • [ ] 严格次小生成树(暂时未写)

​ 思路:用\(Kruskal\)求最小生成树时是根据边权来贪心的,所以有:最小生成树上的两点路径上的边权最大值小于等于连接两点的任意一条非树边。依据这个性质,暴力枚举每条非树边,倍增求出该边上的两个端点树上路径的最大和次大值来更新答案即可。

  • 下午和晚上继续学习线段树,感觉不错,一道黑题可以自己有思路,另一道黑题看完题解后思路能够理清楚并且一遍\(AC\)

  • [x] \(SP1776\) 区间最大子段和

​ 类似于模板题。

  • [x] \(SP2916\) 区间最大子段和变式五

​ 枚举情况,拆分区间分类讨论。

  • [x] \(SP1557\) 区间最大子段和变式二

​ 线段树好题。题目要求区间最大子段和,且相同的数只算一次。注意到条件:相同的数只算一次,联想到HH的项链那题,在线转离线+询问区间排序,每次询问区间右端点右移时都类似于区间加法。本题亦然。将询问的区间根据右端点由小到大排序逐一处理。令\(last[i]\)表示数字\(i\)出现的上一个位置。维护序列\(s[i]=\sum_{j=i}^{k} a[j]\)\(k\)为当前外层循环中的原序列中的某个数)(计算\(s[i]\)时相同的数也只算一次),那么一定在某个时候\(s[i]\)求出了区间\([i,j]\)\(j>i\))的最大子段和。但我们不能只看当前的最大值,因为以前出现过的某个值可能更大,且也是合法的(就相当于某一段没加上来),所以我们维护一个历史最大值。同时,我们还应该维护一个历史最大\(tag\),表示从上次\(pushdown\)到现在的最大的延迟标记(也是相当于如果有一段不够优秀,我们就不加它了)。综上,共维护四个量\(Tag,Max,hMax,hTag\)借以维护\(s[i]\)序列的当前答案就可以了。

  • 线段树树状数组专题结束了,但对其的学习还远没有止境。有时间再拓展,再升华。

  • [ ] 树状数组· 图案统计问题

  • [ ] 线段树·泛区间覆盖问题、二维线段树问题、在\(DFS\)序上维护问题、延迟标记合并问题、树套数问题

7
  • 今天开始了\(LCT\) 平衡树 点分治 树链剖分专题。然而专题时间还是三天。加量不加价QAQ(这可能是最可怕的专题??每一个都如雷贯耳就是不会 (逃
  • 不管怎么难♂ 学习还是要继续的。喜大普奔的是,今天学会了\(Splay\)。它不仅比\(Treap\)功能更强大,也挺好写挺好调的。
平衡树\(Splay\)
  • [ ] 本质:带伸展操作的二叉搜索树。

  • [ ] 核心思想:与\(Treap\)类似,但不再是依靠二叉堆来维持平衡,而是伸展操作——将自己旋转到根的位置,以此来保证平衡。(随机情况下树高为\(logn\)

  • [ ] 双旋:当爷爷父亲自己呈一字形时,需要先旋转父亲,再旋转自己。若只是旋转自己,当旋转到根时最坏情况下树仍为一条链,而双旋可以使父亲与爷爷的父亲两个节点在同一层,保证复杂度。这种优势一定体现在\(4\)层高以上的树。 我才不会说我画一个三个点的树分析半天找不出双旋的好处

  • 当然是用\(Splay\)写题目啦。\(Splay\)是真的挺好写的,三个题目两个两\(A\)一个一\(AQAQ\)

  • [x] \(P3369\) 普通平衡树

  • [x] \(P4309\) 最长上升子序列

​ 首先输入方式就暗示我用平衡树写(当然好像权值线段树也可)。然后就是一个简单的线段树优化\(DP\)

  • [x] \(P3391\) 文艺平衡树

​ 区间翻转模板题。当平衡树维护一个序列时,中序遍历即为原本序列,类似查询第\(K\)大就成了查询序列第\(K\)位。\(Splay\)还有一个很好用的性质,就是当要对区间\([l,r]\)操作时,可以将\(l-1\)转到根节点,\(r+1\)转到根节点的幼儿子,这样\([l,r]\)就全都在\(r+1\)的左子树上了,方便操作。区间翻转就是\(r+1\)左子树上的每个节点的左右儿子都互相交换。这题给我的最大启示:平衡树既可维护数列(节点之间有大小关系),也可以维护一个序列(节点之间有对应在原序列中的先后关系),两种维护说白了最后计算答案(排序后的数列或者原序列)都是用中序遍历。而只要是中序遍历,旋转操作就不会改变该树的性质。甚至除被旋转的两点外,其他点的性质都可以不变。(如本题中待旋转点的爷爷旋转时甚至可以不下传标记)。

  • 今天看了下点分治,发现其实也没有想象中那么难,但有许多细节需要注意。明天重点突破点分治,再总结。
8

\(——My\ queen,one\ not\ does\ simply\ struggle\ against\ the\ fate.\)

\(——I\ dare\ change\ this\ fate.We\ will\ fight\ valiantly\ to\ the\ last\ Enderman.\)

\(——\)"\(Ender\ Wish\)"

  • \(Enderwish\)\(BGM\)实在是太好听啦\(QAQ\)。末影女王好帅气!说的每一句话都用最少的字达到最激励人心的效果。好燃!!

  • 根据谢超才神仙的README,每日平衡树可以不写多了,但每日要保证一个来练手感。坚持下来!

  • [x] \(P2596\) 书架

​ 题目不难。基本是Splay基本操作组合一下。TLE了一次,本以为Splay写挂了,后来发现是由于数组开小了\(QAQ\)(存在删除节点再添加节点所以要开两倍空间或建一个\(rubbish\)数组)。但平衡树本身还是没有写挂!开心!越练越熟练!

  • 今天如约开始点分治专题。
点分治
  • [ ] 核心思想:对于一些问题,我们可以归纳为经过根节点/不经过根节点两类。而不经过根节点的一定经过某个子树的根节点。分治模型初现。若直接分治,复杂度为\(\mathcal{O} (T*n)\),显然\(T\)极易退化成\(n\)。所以每次把根节点设为重心,来保证复杂度。

  • [ ] 实现技巧:对于某个子树求重心时,首先需求出子树大小。(一遍DFS 为了简便实现,我们可以记一个\(Part\)变量,表示当前子树大小,则\(Part=size[to[i]]>size[p]?Part'-size[p]:size[to[i]]\)\(Part'\)为原来的\(Part\))。一定要注意当前节点可能是原重心的父亲节点,这时要特殊处理。

  • 于是用点分治淀粉质做了几个题练手感。

  • [x] \(P3806\) 点分治模板

  • [x] \(P4178\ Tree\)

​ 点分治+树状数组。或者点分治+双指针也可以。

  • [x] \(P4149\ Race\)

​ 以后要练习点分治用这题,不要用模板。我最开始的点分治求重心假了,但是过上两题轻轻松松......感谢这一道题把我卡飞了,让我意识到了自己找重心的问题。(特别鸣谢:\(yxt\ (Orz)\)指出我找重心的错误并教会了我真的求重心方法)。

  • [x] \(CF293E\ Close\ Vertices\)

​ 点分治+二维偏序。这一题可以说是前几题的综合版。既限制权值最大值,也限制边数最大值。前几题都可以简单的每次找重心求解,但本题只能用容斥方法写点分治了。点分治的容斥,应该算最初级的那种。先\(Calc\)一遍\(p\)值,由于我们其实只需要经过\(p\)点的,那么所有起点终点在同一棵子树里的答案需要减掉。枚举每条边调用一遍\(Calc\),注意此时应加上之前的必经的路径长度和边数。

  • 顺便学习了下树上维护\(DFS\)序问题,做了一道主席树+\(DFS\)序。明天多练习几道再一起总结。
  • [x] \(P3899\) 谈笑风生 标题好暴力啊QAQ

\(DFS\)序的灵活运用。考虑到难点是处理\(B\)点在\(A\)的子树中的情况,也就是求\(\sum_{i\in subtree A}size[i]\)\(DFS\)序有一个很好的性质,就是节点\(u\)子树中的每个节点的\(dfn\)\(\in [dfn[u],dfn[u]+size[u]-1]\)。这东西显然可以用线段树维护。而由于限制深度差不能超过\(k\),所以我们以深度为下标,而只知道深度并不能确定该点是否在子树上,所以我们需对每个点建立一棵完整的线段树——显然,套上可持久化就可以咯。

9
  • \(Ceris\)\(Abigail\)\(Rain\)!或许老外做的片不喜欢大团圆结局??
  • \(Azura\) 是真的太暖心了。理想型啊。
  • 首先自然是每日平衡树啦。
  • [x] \(P4567\) 文本编辑器

​ 感觉不错,写完平衡树后也没怎么调平衡树。但输入数据太坑了\(qnq\),硬是拖了我很久。

  • 说好的DFS序当然不能鸽掉啦 咕咕咕 但将\(DFS\)序运用到极致的树链剖分自然是重点啦。
树链剖分
  • [ ] 本质:用各种维护序列的数据结构维护处理后的\(DFS\)序。

  • [ ] 核心思想:普通的\(DFS\)序除了子树编号连续外,只能保证子树根后的连续一段为某一条链(\(DFS\)的搜索顺序决定)。显然,我们可以添加优化,使被记录的这条链最长,也就是已知信息更多。自然而然地,我们就引出了重边的概念。并且由于某一条轻边一定连接两条重边,所以我们可以一直跳到根。而在节点跳跃的过程中,某两个点跳到同一根重边上时,就意味着两点均经过了它们的简单路径——非常实用的性质。

  • [ ] 基本操作:子树内的修改查询/两点间的简单路径上的修改查询/树上单点/边修改查询 (水到渠成QAQ

  • 于是就泡在树链剖分里泡了一天。

  • [x] \(P3384\) 重链剖分 & \(SP375\ Qtree\)

​ 子树内的修改查询/两点间简单路径上的修改查询模板题。

  • [x] \(P2146\) 软件包管理器

\(Exciting\)! 可能是蕴含的思维难度不大吧 我看了一会就想到了区间覆盖线段树维护,\(2h\)打完调完交一手直接过了哈哈哈。太开心了。以后做题都要介个样子\(QAQ\),良性循环。

感觉点分治和树链剖分都是模板居多??

  • 晚上看了近\(3h\)的杂文和\(LCT\),基本弄懂了\(LCT\),但时间已经不够了。留个坑,明天填上。
  • [x] \(LCT\)
10
  • 今天是寒假集训自习的最后一天,首先还是每日平衡树。

  • [x] \(P1486\) 郁闷的出纳员

​ 这道题关键在于如何处理添加和删除操作。区间加法自然是可以的,但有一种更好的办法。当有添加操作,并且每次操作的对象都是整个数列时,我们可以记一个变量\(delta\),加减操作都直接在\(delta\)上进行,那么每次的答案就是\(v+delta\)。注意一点就是把数字插入树中时也要减去当前的\(delta\)。剩余的就是模板了。本题也让我对\(splay\)中的\(Find\)操作有了更深的理解,当存在原数时,\(Find\)返回原数对应的树上结点值;当不存在时,返回原数的前驱或后驱。由于不存在原数,所以大于前驱的所有数大于原数,小于后驱的所有数小于原数。

话说我这个题只用了1.5h就A了 看来韬哥说得对哈 真是越打越熟练

  • 不能鸽掉\(LCT\)\(8\)
\(LCT\)
  • [ ] 本质:森林。对每条实链开一棵\(splay\),用\(splay\)维护森林中的每棵树的实链,以深度作为关键字(维护相对深度),保证中序遍历到的各点深度严格递增。
  • [ ] 重点:从大到小总共有四个层次:\(LCT\)森林、森林中的树、树上用\(splay\)维护的实边、\(splay\)的根节点。
  • [ ] 层次之间的关系:森林中的各树互不联通;一棵\(splay\)的根节点,由一条轻边指向为当前\(splay\)中中序遍历最靠前的点在原树上的父亲。轻边认父不认子,重边互相记录。每个节点包含且仅包含于一个\(splay\)中(单个节点视为一棵平衡树)。

如下图是森林中的一棵树,图一为原树,图二为加\(splay\)维护后的树。绿框内的树处于同一\(splay\)中。

  • [ ] 核心函数:
  1. \(Access(x)\):将节点\(x\)所在的树的根到节点\(x\)的链变为实链,且起点为根节点,终点为节点\(x\)。实现方法:先将\(splay(x)\)使该点成为所在\(splay\)的根,由于节点x为终点,所以此时直接\(c[x][1]=0\)实现断边,此时\(f[x]\)指向了上一个\(splay\)的某个节点,\(splay\)那个点,再让它的右儿子直接等于此时的\(x\)(认父不认子),既实现了断边有实现了添边。令\(x\)等于当前节点,再往上反复到根节点即可。
  2. \(Makert(x)\):将节点\(x\)变为所在的树的树根。实现方法:先\(Access(x)\),再\(splay(x)\),此时由于\(x\)深度最大,我们将整个\(splay\)翻转后,\(x\)深度最小,就是原树的根了。为什么可以直接翻转呢?由于其余的\(splay\)维护的是里面各点的相对深度关系,所以其余的\(splay\)都是不变的。譬如图二,我们交换\(A\ E\)两点后,\(G\)所在的\(splay\)显然是不变的。
  3. \(Findrt(x)\):找到节点\(x\)所在的树的树根。常用于判断连通性。实现方法:先\(Access(x)\),再\(splay(x)\),一路向左找就可以了。建议此时再\(splay(y)\)以保证复杂度。
  4. \(Split(x,y)\):拉出一条节点\(x\)到节点\(y\)的链。该链上包含且仅包含节点\(x\)到节点\(y\)上的简单路径上的点。实现方法:先\(Makert(x)\),再\(Assert(y)\)好显然啊 建议此时再\(splay(y)\)以保证复杂度。
  5. \(Isroot(x)\):判断节点\(x\)是否是树根。实现方法:利用认父不认子判断是否为轻边。
  • [ ] 基本功能:动态维护树上的连通性/处理两点间路径问题。但对于处理子树问题的能力不足。

  • [ ] 拓展:\(Top\ Tree\)

  • 自然是用\(LCT\)写题目啦。

  • [x] \(P3690\ LCT\)模板 & \(P3203\) 弹飞绵羊 & \(P3950\) 部落冲突

​ 三道题目都是简单的删边添边以及查询连通性/节点深度等操作,但三道题放在一起,有的需要祭上整个\(LCT\),有的却只需要部分操作即可。这提示我应灵活运用\(LCT\)做题目。

好吧 做这些题目纯粹是为了练习模板

  • 通过这段时间的学习,我深感自己效率不高。原因在于什么呢?现在做题思路往往比较清晰,但由于代码量激增,极容易细节出错。谨收集部分这段时间来流过的泪和流过的血,以示以后的自己。
\(Bugs\ Collection\)(持续更新)
  • [ ] 认真思考,专心编程,冷静调试。编程最大的\(Bug\)就是心情浮躁。
  • [ ] 数组大小问题:\(Manacher\)、前向星双倍空间,线段树四倍空间,主席树\(40\)倍空间(\(32\)倍也);操作中有加点/加边/构建主席树的操作的,数组大小应加上询问数;二分图题目数组大小格外小心,尽量大的开吧。
  • [ ] \(!\)运算优先于\(\&\&\)的运算级优先于\(||\)的运算级 位且运算优先于异或运算优先于或运算 尤其在快读中小心。
  • [ ] 输入输出有锅首先看快读快写。读取字符和字符串都用\(cin\)或者\(scanf('\%s')\),因为\(\%c\)会读入回车和空格。
  • [ ] 区间求和的标记永久化写法\(Modify\)函数递归必须分三种情况大力讨论。
  • [ ] 写线段树时,标记要么下传要么永久化。
  • [ ] 在某些线段树的题目中,父亲节点权值减去左儿子节点权值并不简单等于右儿子节点的权值。\((P4198)\)
  • [ ] \(AC\)自动机暴力跳\(fail\)指针复杂度仍是\(\mathcal{O} (n*m)\)
  • [ ] 平衡树中的\(Update\)函数\(size\)最后记得\(+1\)
  • [ ] \(splay\)\(rotate\)操作是有顺序要求的\(!!\)
  • [ ] \(DFS\)中遇到\(from\)后不是\(return!\)\(continue!\)
  • [ ] 点分治中边权和往往可能会大于我们需要求的那个数,记得特判/双指针法。
  • [ ] 求重心时要考虑好当前联通块的大小。应分为当前节点为上次节点祖先/子孙两种情况讨论。
  • [ ] \(LCT\)中若需要记录当前节点连向哪里,进行删边/添边操作时,记得更新记录。
  • [ ] 线段树/平衡树上的\(update\)操作都是等于\(!!\)等于\(!!\)
  • [ ] 博弈论注意区分每轮最优解/全局最优解。特别注意先手赢后换边的问题\(!!\)
  • [ ] 注意求\(SG\)函数时注意转移为或初始必须赋值\(0\),而此时若为边界状态可能反而为\(1\).
  • [ ] 做\(Kruskal\)的变式时,若存在自环,那么选定某条边时要考虑自环这种情况。不然\(cnt\)就会错。
  • [ ] 左偏树中\(Pop\)操作记得把原根的集合指向\(Merge\),因为毕竟是原根,可能会有一些点指向它。
  • [ ] \(SPFA\)判负环是用节点入队次数而非松弛次数。也可以用路径上的节点数来判。
  • [ ] 建二分图时不一定是无脑无向边\(!!\)
  • [ ] KM算法中一定是左部减右部加!!因为右部到左部一定是匹配,而左部可以枚举出边。
  • [ ] 并查集合并两点时如果只是直接连边,而不连到对方父亲节点上,可能会爆递归栈!!
  • [ ] \(Dinic\)算法中\(BFS\)部分赋\(d\)初值的时候注意值域范围。\(TLE\)时注意\(i\)放在函数内定义!!
  • [ ] 网络流最后如果要判定某些边来输出方案之类的话,注意满流的边已经反了。
  • [ ] 网络流建模中注意那些两个点之间连一条边的情况!!
  • [ ] 注意double型一定要 \(\%lf\) 输入!!\(\%f\) 会WA。。
  • [ ] 可撤销并查集注意边的编号、删除顺序!!撤销完后记得把撤销的边从待撤销边集中删去——防止RE!!
  • 还有一些重要的数据结构知识没有学习,留坑。
  • [x] 可并堆\(/\)左偏树
  • [ ] \(PAM/SAM+Trie\)\(PAM/SAM\)
  • [ ] 线段树合并\(/\)李超线段树\(/zkw\)线段树
  • [ ] 无旋\(treap/SBT\)
  • [ ] \(Top\ Tree\)
  • [x] \(cdq\)分治
11
  • 开始考试啦。为时五天,每天应该都是一些数据结构+思维题吧。
  • 今日总结:
  • [x] \(T1\ distinct\) & \(T4\ allbarns\)

​ 两道题都是哈希题目,充分检测出了我知识的漏洞:只觉得只有一个数才能哈希。实际上,对于一个二元组、三元组等也是可以哈希的,主要有移位法和相乘法两种,核心也是尽可能让每一个数字参与运算。\(T4\)还考察了数学知识。我只晓得通过矩形三个点可以确定第四个点的性质,在本题中它就是\(\mathcal{O} (n^3)\)的;而另一个性质任何中点重合且长度相等的两根线段都是矩形对角线就可以\(\mathcal{O} (n^2)\)过这道题。以后做计算几何题目若还未找到正解,可以从几何性质多思考。

  • [x] \(T2\ Sequence\)

​ 均摊\(\mathcal{O} (1)\)求解一个数左边/右边第一个比它大/小的数。我首先想的是\(\mathcal{O} (n^2)\)暴力,然后想到如果\(a[now]\)已经大于\(a[i]\),那么之前\(i\)覆盖的点\(now\)也可以覆盖。于是就是可爱的冰茶姬啦。当然,还可以用一种叫笛卡尔树的数据结构。

  • [x] \(T3\ homework\)

​ 冰茶姬染色做也用堆贪心做。总之就是满足条件的情况下选择最优的方案。

  • [x] \(T5\ light\)

​ 差分数组维护环形等差数列。其实主要是这道题我都没考虑DP,更别说优化了 设状态\(f[i][j]\)表示前\(i\)个数,舒适度选\(j\)的可以节省的操作数。于是答案就是\(f[n][1...m]\)的最大值。每次\(i+1\),本质上是在\(f[1...m]\)\([a[i]+2,a[i+1]]\)这一段插入一个等差数列。于是就可做了。

12
  • 考炸了\(QAQ\)。在第三题是原题,第二题想出\(80\%\)的情况下我还能顺风翻盘,佩服自己。
  • [x] \(T1\ Gift\)

​ 本套题中我觉得最难的题\(qnq\)。对倍增的思想不够熟练,对其的运用也仅仅局限于求最近公共祖先。本题给我的最大启发就是:倍增就可以理解是二进制下的分块,由于每个数可以二进制拆分,所以某个节点其上任意深度的节点都可以被查到,所以可以一个二进制块中记录最大最小值。

  • [x] \(T2\ amerce\)

​ 自己动手敲的第一道\(SG\)函数题。考场上想到了\(Trie\)树上\(DP\),但没有考虑到“一直输攒机会最后再赢”这种既有必胜策略又有必败策略的情况。以后要小心。

  • [x] \(T3\ num\)

​ 线段树模板题。

14 情人节快乐
  • \(Ceris\)是真的\(QAQ\)。(//▽//)

  • 今天考试前两题都\(A\)掉了。\(T3\)有点莫队想法,但终究没打出来。

  • [x] \(T1\ color\)

​ 线段树+状压。

  • [x] \(T2\ kom\)

​ 树剖裸题。

  • [x] \(T3\ secret\)

​ 所以人还是要掌握一些容斥的知识。对于求交集的问题,可以考虑分开求两个集合与并集,也可以考虑求全集与补集。这不仅是数学思想,很多题目都是这样转化的。

15
  • 考试\(A\)\(T1\)\(T3\)。可惜没有\(AK\)。重点总结下\(T2\)

IOI赛制万岁!

  • [x] \(T1\ Hotel\)

​ 简单的线段树覆盖问题。

  • [x] \(T2\ Mou\)

​ 维护一个序列,支持往里面加入一个等差数列,查询第一个大于\(K\)的数两个操作。显然由于存在查询操作,不能双差分来维护。考虑线段树维护。考场上的时候我大致觉得需要维护区间最大值和区间总和,但不知道该如何维护最大值(因为只要是在序列位置之前的插入操作似乎都会影响到最大值)。题解处理的很巧妙。题解中记录的最大值是相对最大值,即真实的最大值减去区间前面的数的和。与该区间无关的数的修改对于该区间的相对最大值显然是无关紧要的。这样就很好进行修改了。查询时只需要减去左区间的总和即可。由于是维护离散化以后的数列,所以区间用左闭右开的方式。

  • [x] \(T3\ sequence\)

​ 看到最长公共前缀想到在\(Trie\)树上跳\(LCA\)。然后进一步发现对于序列的求解,类似于贪心,只需保留每一号序列字典序最小的方案,用链式前向星可以均摊\(\mathcal{O} (1)\)的求解,这样连\(Trie\)树也不用建立了,直接\(\mathcal{O} (n)\)生成了一棵树,再记录下每个序列的结尾编号,求\(LCA\)即可。

16
  • [x] \(T1\ boatherds\ \&\ T2\ multik\ \&\ T3\ czyak\)

​ 点分治板子。

  • [x] \(T4\ Gourmet\)

​ 贪心,每次从口感度满足条件的食物中选择第一个价格大于等于当前羊的。由于每次选择第一个价格大于等于之的,所以一定是最优的。又每只羊在可以的情况下都应被满足,所以这样一定是正确的。这类贪心题目都是先按照第一关键字排序,每次插入第一关键字符合的,再找到第二关键字最优的。但这种方法大概是建立在每只羊在可以的情况下都需要被满足的基础上的,如果不强制要求这点,而是只需要满足\(K\)只羊,或许情况会有所不同。一时还想不清楚这样怎么做。\(qnq\)

17
  • [x] \(T1\ adera\)

\(Trie\)\(+set\)\(Trie\)树上的题目一定要考虑清楚时空复杂度,其复杂度一般都是与字符总长/询问总次数有关。上次也做了个类似\(Trie\)树的题目。感觉越做越有感觉。

  • [ ] \(T2\ circle\)

​ 扫描线+圆。震惊了我天扫描线还可以肝圆和三角形 没时间学了。以后填。

  • [x] \(T3\ date\)

​ 题目大意是给定一棵树,从树上选取\(k\)条相连通的边\((k\in[L,R])\),使得边权的中位数最大。中位数的题目多半凭经验做(雾),总结一下大概有平衡树/对顶堆/值域线段树/分块/二分答案这五种。本题就是以二分答案为基础的。二分答案后,将边权大于等于二分出来的值的边边权设为\(1\),否则设为\(-1\),这样就可以快速判断一条链的中位数是否大于二分值了(即链上的总权值是否大于等于\(0\))。这样就成了一个子任务:判断是否存在一条链,边数\(\in[L,R]\)且边权和大于等于\(0\)。这条链必然经过/不经过根节点——也就可以转化为点分治做。用线段树\(Max[i]\)维护边数为\(i\)时的边权最大值,套上点分治模板就可以啦。注意点分治\(Getdis\)中的剪枝,以及当满足条件时立即退出。

18
  • 最后一场考试,以图论结尾。以我的悲伤结尾
  • [ ] \(T1\ Busstop\)

​ 每次锁上一个点,然后\(DFS\)判断一下连通性即可。

  • [ ] \(T2\ szp\)

​ 基环树上的\(DP\)

  • [ ] \(T3\ zaw\)

​ 求正权有向图上的最小环(规定必须包含节点\(1\))。由于起点终点必然不相等(即至少有一位二进制位不同),于是我们可以枚举每个二进制位来分组,在分组后的起点集合和终点集合间跑最短路。

  • [ ] \(T4\ Chris\)

​ 将题目求解的式子转化一下,可以得到\(ans=\sum_{i\in V}dis(1,i)*v(i)\)(也就是原式子是将点权合并同类项,而此处是把边权合并同类项)。然后由于最短路的每次扩展,都是建立在已被扩展的点的基础上的,所以这个题就是最短路的生成树。

  • [ ] \(T5\ dvalue\)

​ 枚举一条边为最小值边,暴力做\(Kruskal\)

19

"累并快乐着是一种很幸福的感觉,比无所事事的感觉好。"

\(——\ ysuperman\)

  • 进入图论学习了。今天主攻最小生成树及其变式。明天主攻最短路及其变式。

  • 图论题总是会有一些奇怪的想法,或者干脆没想法。即使有想法我也不会证明。往高层次走的话,我希望我还是能掌握一点证明方法,能独立证明几个简单的结论。这样对做题的思路也有启发作用吧。

  • 最小生成树的最重要的性质(以下简称仙性质\(Orz\)):原图上的任意一条非树边,连接的两个顶点在最小生成树上的简单路径上的任一条边的权值均小于等于该边。

  • 还有一条性质:删去原图中所有边权大于等于\(k\)的边,删完后原最小生成树的连通块数必然等于图上的连通块数。证明已懂。

  • [x] \(P4208\) 最小生成树计数

​ 定理:若图\(G\)的最小生成树的边集为\(T\),则在所有\(T\)中,边权相同的边的数量一定。

​ 证明:根据\(Kruskal\)的求解,当将把权值小于\(k\)的边全部处理完后,若此时将等于\(k\)的边全部加入,此时:(1)若无环,则权值为\(k\)的边必须全部用上,得证;(2)若有环,令所有简单环的数量为\(C\),则我们共需要删除\(C\)不影响此时连通性的边以消去这些简单环。显然,每次都必须全部加上再删去\(C\)条,则边权相同的边数量一定。

​ 有了上面定理,再加上题目的限制,就容易求解了。当然,还有一种矩阵树的正解,但我没学\(Orz\)

  • [x] $P4180 $ 严格次小生成树

​ 定理:图\(G\)中至少存在一个严格次小生成树,可以由最小生成树删去一条边再添上一条边得到。

​ 有了这条定理,我们就可以先求出最小生成树,再在树上倍增,维护链上最大值和严格次大值。然后枚举边用最大值或严格次大值更新答案即可。

  • [x] \(P1550\) 打井

​ 加深了我对\(Prim\)算法的理解。无论是开边还是新建井,只要能让当前应被扩展的点的\(dis\)最短即可。

  • [x] \(P2245\) 星际导航 & \(P1967\) 货车运输

​ 最小瓶颈生成树。做完严格次小生成树后做这两道题感到极度舒适。若要求路径上的最大值最小,就是最小生成树上维护链的最大值。为什么?因为仙性质$QAQ $。

  • 其实今天还学习了很多题目的思想,但是在没时间打了。
20
  • 今天做最短路专题。
  • [x] \(P5960\) 差分约束系统模板 & \(P2294\) 狡猾的商人 & \(P3275\) 糖果

​ 差分约束系统三道模板题。差分约束系统利用了最短路中的\(dis(x)>=dis(y)+val(y,x)\),来实现差分。当有一条\(x_{1}-x_{2}>=c\)的约束条件出现时,就连一条\((x_{2},x_{1},c)\)的有向边。这样每一条从\(x_{a}\)\(x_{b}\)的路径边权和都表示了一条\(x_{b}\)\(x_{a}\)的约束条件。显然跑最长路就知道了\(x_{a}\)的下限。最巧妙的是,当约束条件以等式形式(如\(x{1}-x{2}=c\))给出时,此时应该在图中加入两条边,一条正着连\((x_{2},x_{1},c)\),一条反着连\((x_{1},x_{2},-c)\)以充分利用条件。

  • [x] \(P2483\) 魔法猪学院/\(k\)短路模板

​ 一切\(k\)短路的基础都是:在\(Dijkstra\)中,\(x\)号点第\(k\)次出队就是\(x\)号点的第\(k\)短路(当然是在同一起始点之下)(并不保证一定为简单路径)。强烈谴责某度上的博客上来就是A*或者可持久化可并堆让我迷惑好久 然后这个算法是纯搜索,复杂度为\((k(n+m)logm)\),然后我们可以用\(A*\)来优化,估价函数为当前节点的已有的距离与当前节点到终点的最短距离。但这并不是正解,正解是可持久化可并堆来维护边集。考虑到当求出来最短路径树时,在此时图上的非树\(i\)边求\(\delta(i)=val(i)+dis(e[i].from)-dis(e[i].to)\)\(dis(x)\)表示节点\(x\)到终点的最短距离)(\(\delta(i)\)就是将\(i\)加入最短路径树,断掉\(i\)连接的两个顶点中间的所有路径会对最短路造成的增量),然后就每次找一条增量最短的边加入即可。

  • [x] \(P3377\) 左偏树模板

​ 左偏树,可并堆的一种实现形式。每个节点上有两个权值:\(dis\)\(val\)\(val\)满足堆性质,\(dis\)定义为离根最远的叶子节点到根的距离,满足\(dis[ls]>=dis[rs]\)。每次合并两个堆的根节点,将根节点大的递归合并到另一个根的右儿子中。最后上传时要记得维护\(dis\)的性质。

  • [x] \(POJ3463\ Sightseeing\)

​ 题目大意:求解两点间的最短路径数和次短路径数。根据k短路的性质,对于每个节点我们只需保存其次短路和最短路的路径长度和数量即可。实现起来有点技巧(数组\(0/1\)维免去\(if\)判断)。

  • [x] \(HDU2833\ WuKong\)

​ 题目大意:给定四个点\(s1,s2,e1,e2\),求\(s1,e1\)的最短路径与\(s2,e2\)的最短路径最多共同经过多少点。运用到最短路的性质:最短路上的任意子路径也是最短路。所以两条最短路径的交集一定是连续的一段(如果不是连续的一段,那么两段交集中间那一段要么有一方不是最短路,要么是等价的,不如直接重合)。所以用\(floyd\)算出任意两点间的最短路最多点数是多少,然后就可以暴力判断了。

  • [x] \(P2868\) 观光奶牛\((BFS\&DFS)\)

​ 题目大意:给定一个图,图上每个节点有权值\(F\),边上有权值\(L\),要求解一个简单环,满足\(\sum F/\sum L\)最大。做的第一道\(01\)分数规划题。首先,由于是环,所以我们把节点上的权值放到入/出的边上都可以(但是当然要统一)。其次,所谓\(01\)分数规划,就是二分答案\(Mid\),将边权全部改为\(F[i]-Mid*L[i]\)。若存在正环,即存在\(\sum_{i}^{i\in E}({F[i]-Mid*L[i])>=0}\),变形可得\(\sum F/\sum L>=Mid\),即存在更优的值。二分模型就出来了。当然判负环也可以。二分\(+dfs/bfs\)判负环即可。实测\(dfs\)\(bfs\)快大约\(3\)倍。

21

如果我不在战斗,那么我就在前往战场的路上。

​ —————— \(ParaUni\)

  • 感谢袁老师给了这样一个喘息的时间。我大致总结了一下目前知道的,可以学习但还没学的知识,还有很多。数据结构欠的有,图论没有学的知识也有很多。学习了高级算法之后,看题目的一些心态、思路等都发生了很大的变化。或许这也是量变的一种吧。联赛前给我一个月时间搞\(OI\),我可能会无所事事;但现在,即使停课一学期,我在\(OI\)也有明确的任务和目标了。感觉以前的实力、心态都不配称作一名竞赛生,现在才刚刚入门。还是有点后悔啊,如果初二那会儿少摸鱼,多去探究不懂的知识,早点进入这种状态的话,没准我现在也比较厉害了。现在只恨自己没有时间学更多的知识。
  • [x] \(HDU2433\ Travel\)

​ 题意:给定一张无向图,边权均为\(1\),对每条边求如果该条边被删除后图上任意两点的最短路径之和,不连通输出\(INF\)。首先朴素做法是枚举边,每次做一遍\(Floyd\)。时间复杂度肯定爆炸。考虑到只改变了一条边,而我们重算了所有的最短路,势必会造成大量冗余计算。显然,只有出现在\((u,v)\)之间的最短路的边才有可能更新答案。于是记录下每一个点的最短路径树中有哪些边,每次就判定是否需要更新答案。由于边权均为\(1\),故更新也只需要一遍\(BFS\)。总复杂度\(\mathcal{O} (N*M^2)\)(根本跑不满)。注意\(BFS\)的复杂度不要假掉了!!

  • [x] \(POJ1734\ Sightseeing\ Trip\)

​ 题意:求无向图的最小简单环。首先朴素做法是枚举两个点,然后跑最短路。复杂度\(\mathcal{O} (N^2*MlogN)\)。我们发现:既然我们要求任意两点间的最短路,何必不直接\(Floyd\)呢?考虑\(Floyd\)中,当外层刚好为\(k+1\)时,表明经过任意个编号不超过\(k\)的节点从\(i\)\(j\)的最短路已经全部求解完成了,此时,\(min_{1\leq i即表示一个由编号不超过\(k\)的节点构成的,且经过节点\(k\)的最小环长度。(注意规定了\(i保证环合法)。为什么可以规定\(i呢?事实上,由于是无向图,所以只要\(i,j\)枚举到最小环上的最大节点相连的两个节点即可,而至于谁是谁是没有关系的。而有向图就不能这样。最后输出路径也很巧妙。由于\(dis(i,j)\)是由节点\(k\)中转而来,所以我们可以在更新\(dis(i,j)\)记录\(pos[i][j]=k\),然后再递归处理,每次处理一个开区间。

  • [x] \(P5905Johnson\) 多源最短路算法模板

​ 适用于稀疏图上的多源最短路算法。此前一直困扰我的是它的势能为什么一定要用最短路来求。今天想明白了,其实只是最短路处理之后的势能满足\(h[to[i]]\leq h[from[i]]+val[i]\),这样可以保证处理之后的任意一条边的边权非负。

  • [x] \(POJ1201\ Intervals\) & \(P4878\ Layout\)

​ 两道差分约束题目。序列上的差分约束一般约束的是前缀和,于是在各点权值非负时一定有\(sum[i]-sum[i-1]>=0\)这个约束条件。而当序列又是集合时则有\(sum[i]-sum[i-1]\leq1\)这个约束条件。只有当题目中隐含的约束条件都加进来,算出来的解才是有意义的。

22

"万物皆有裂隙,但那是光照进来的地方。"

​ ——————\(Leonard\ Cohen\)

  • 学到自闭。首先看了下无向图连通性理论学习。然后发现有的定义都理解不了。于是再看进阶指南和入门经典,总算把无向图割点割边点边双连通分量及缩点、有向图强连通分量及缩点都过了一遍。以前看书都是掠过证明,但这次我决定精读,于是也动手证明了几个书上的遗留问题。感觉自己对于图论题目的证明还缺乏一种体系/意识,需要多做多看多学。

  • [x] \(P3388\) 割点模板

  • [x] \(P3469\ BLO\)

​ 题意:给定一张无向连通图,对每个节点求解若与该节点相连的边都被删掉图中会有多少个有序点对\((x,y)\),满足\(x\)\(y\)不连通。首先,若删去的点是非割点,那么只有它与其他\(n-1\)个点不连通;否则,假设割去该点后图上有\(t\)个连通块,那么答案就是这\(t\)个连通块两两相乘。在求割点时顺带计算一下就好惹。

  • [x] \(POJ3694\ Network\)

​ 题意:给定一张无向连通图,每次添加一条边,然后求解图上的“桥”的数量。由于只有添加操作,故处于同一\(eDCC\)中的边永远不会是“桥”,考虑边双联通分量缩点。缩完点后原图一定是一棵树,每次增加一条边,我们就可以在树上找边的两端的\(LCA\)然后将路径上的边标记全部减去。但这样复杂度会退化的很厉害。考虑到只有添加操作,所以一条已被标记的边肯定不会再用到了——于是可以用并查集维护树上节点关系。总复杂度做到\(\mathcal{O} (N+M+Q)\)惹。

  • [x] \(POJ1236\ Network\ of\ schools\)

​ 题意:给定一张有向图,求解:(1)最少选择几个节点,沿着点的路径一直走可以覆盖整张图;(2)至少添加几条边,可以使整张图强连通。对于问题(1),就是缩点后入度为0的节点个数;对于问题(2),有一个性质必须用到——

定理:该图必然包含一个环的充要条件为不存在入/出度为\(0\)的点;整张图强连通的充要条件为出、入度为\(0\)的点均不存在。

证明:一直沿着出边走,因为缩点后的图为\(DAG\),所以总能走到有入边的点。

所以问题(2)的答案就是\(Max(\)出度为\(0\)的点个数,入度为\(0\)的点个数\()\)

  • [x] $P3225\ $矿场搭建

​ 题意:给定一张无向图,可以将一些点涂黑,需要保证摧毁任何一个点后剩下的点都可以到达至少一个黑点,求最少的黑点数量。首先一个点连通分量一定是一荣俱荣一损俱损的;进一步发现:若给割点染黑,割点所连接的点双连通分量必须还是要涂黑一个,所以割点不如不涂;如果该点双连通分量没有一个割点,那么这个分量一定需要\(2\)个黑点。那么如果有割点怎么办呢?这个时候不要退缩,要敢于从最简单的推起!如果只有一个割点,那么内部还需要一个黑点防止割点被爆破;而如果有多个割点的话,就不怕爆破了。于是就很显然了。

  • 总结一下:图论题一定要大胆分类讨论。从最简单的推起,慢慢去推。自己平时做题还是没有这种意识,或者说没有掌握这种方法。要引起重视。另外,做题目要充分挖掘性质,既做到充分,而又不过头——这就需要敏锐的观察和严谨的证明了。
23
  • 今天是真的学知识学吐了。我太南了。
  • 考虑到连通性方面仅有有向图的必经点不会求了,抱着尝试的心态去看了下灭绝树和支配树。然后一晚上没了\(Orz\),并且还有一些问题没有完全弄清楚。明天问完各路大神再总结。
支配树
  • [ ] 基本用途:求解有向图上必经点。
  • [ ] 核心思路:

​ 先求一遍各点的\(dfs\)序。考虑图的搜索树\(G\)。定义\(semi(x)=min\{u|\exists u=v_0,v_1,...v_k,x(\)对于\(\forall i\in [1,k])\)均满足\(dfn[i]>dfn[x]\}\)(此处的\(min\)\(dfn\)最小)。感性理解,就是在\(G\)上x的祖先中,找到一点\(u\),满足在原图上\(u\)能经过一条路径,路径上的各点(除了\(u\)\(x\))的\(dfn\)均大于\(x\),所有的\(u\)中,\(dfn\)最小的就是\(x\)\(semi\)。再定义\(idom(i)\)为能支配\(x\)的点中深度最大的点。

定理\(1\)\(semi(x)\)一定是\(x\)\(G\)上的祖先节点。

定理\(2\)\(idom(x)\)一定是\(semi(x)\)\(G\)上的祖先节点。

定理\(3\):删去图中的非树边,连边\((semi(x),x)\),不改变原图的支配关系,且原图变成了一个\(DAG\)

\(semi(x)\)求解方法:对于\(\forall(u,x)\in E\),(1)如果\(u,那么\(semi(x)\leq u\);(2)如果\(u>x\),那么考虑G上\(dfn(v)>dfn(x)\)\(u\)的祖先\(v\),必然有一条路径\(semi(v)\to v \to u \to x\),且\(semi(v)\to v\)的路径上的各点的\(dfn\)大于\(v\),也就必然大于\(x\)。故\(semi(x)\leq min(dfn[v])\)。综上,\(semi(x)\to x\)的最后一条边所有情况已被全部考虑。

  • 做了两道模板题。第一道保证图是\(DAG\),所以直接灭绝树;第二道是普通有向图。

  • [x] \(P2597\) 灾难

  • [x] \(P5810\) 支配树模板

  • 然后今天白天学习了\(2-SAT\)问题。做了一道二分图染色题和简单缩点题。

  • [x] \(P2860\) 冗余路径

​ 题意:给定一张无向图,求解最少加几条边可以使图上无“桥”。显然用边连通分量缩点来做,缩完点成了一棵树。然后连接两个\(LCA\)深度尽可能小的叶子节点,每次删去两个桥;若剩到最后仅一个叶子节点,那么还需要再加一条边。所以结论就是\(ceil(\)叶子数\(/2)\)

  • [x] \(POJ2942\) 圆桌骑士

​ 题意:给定一些点,再给定一些点之间的仇恨关系,相仇恨的两点不能坐在相邻的位置上。每次召集一些点坐在圆桌上,要求点数必须为奇数个。求哪些点永远用不上。由于两个点相互仇恨就不能坐在一起这个条件不好表示出来。所以我们转化一下,如果亮点不相互仇恨,就给这两点连边表示可以坐在一起。由于是圆桌,所以\(n\)个人我们就需要\(n\)条边,也就是一个简单环。于是问题转化为:求哪些点不被任何一个奇环包含。然后——

定理:若一个\(vDCC\)中包含了一个奇环,则整个\(vDCC\)中的点都至少包含在一个奇环中。

证明:书上有。

于是问题转化为\(vDCC\)缩点,并且判奇环。一个图有奇环等价于这个图不是二分图。于是做法显然了。

注意一点:求\(vDCC\)时不能拎出\(cut\)\(DFS\),必须用栈。错误求法的\(Hack\)数据如图(想了我好久\(qnq\)):

割点为\(0、3、4\),然后拎出来的话就会少计算中间\(0、3、4\)组成的\(vDCC\)

  • [ ] \(P4782\ 2-SAT\)模板

​ 模板题了。\(2-SAT\)问题与上题有些许相似,也是将合法的状态合并在一起(还有点像并查集??),然后再跑一遍缩点就可以了。

24
二分图
  • [ ] 概念:如果一张无向图上的\(N\)个节点可以分为互斥的两个非空点集,满足同一集合中的点都没有边相连,则称这张图为二分图。
  • [ ] 判定:一张无向图是二分图,当且仅当图中无奇环。
  • [ ] 二分图最大匹配:“任意两条边都没有公共端点”的边集被称为图的一组匹配,容量最大的匹配称为最大匹配。可以用增广路算法来求。增广路算法建立在贪心上:

定理:若一个点成为匹配点,则绝不会再变回非匹配点。

证明:假设点\(A\)为匹配点,且与它匹配的是点\(B\)(注意!!这时候不要总是考虑点\(A\)有多少条出边,无论有多少边,它也只能与一个点相匹配!!),那么如果不选点\(A\),另一个点集中未被匹配的至多多一个点\(B\),至多在匹配一个点,所以答案只会更差或不变。

​ 由于算法建立在贪心上,所以对于点的枚举顺序是没有要求的,无论怎么排都可以求出最大匹配数。当题目对点序有要求时可以考虑该算法。

  • [ ] 二分图带权匹配:二分图中的每条边带个权值。求出在二分图最大匹配的基础上最大的匹配边的权值总和。可以用\(KM\)算法求解。算法给每个点加了个顶标值\(val(i)\),满足 \(val(u)+val(v)>=w[u][v](\forall(u,v)\in E)\) 。这里引入一个概念:相等子图,也就是二分图中所有节点和满足\(w[u][v]=val(u)+val(v)(\forall(u,v)\in E)\)的边构成的子图。设顶标值有个好处:

定理:原图中的相等子图\(G'\)中若存在完备匹配,该完备匹配就是二分图带权最大匹配。

证明:相等子图中:完备匹配的边权之和为所有顶标之和。又根据顶标的定义,故不存在一组匹配边权之和大于所有顶标之和。得证。

​ 于是我们可以先随意赋顶标值,然后不断扩大相等子图规模,直至相等子图存在完备匹配。假如每次从左部起点开始匹配,那么如果点\(K\)匹配失败,我们就把访问过的左部的节点顶标值\(-\delta\),访问的右部节点顶标值\(+\delta\)。这样已匹配边的情况显然不受影响,而\(K\)由于顶标和不与边权相等而访问不了的右部节点有可能就可以访问到了。于是就可以增广了。最后,为了保证顶标符合定义及每次至少多访问一个右部节点,\(\delta=min(val(K)+val(u)-w(K,u))(u\)为右部节点且当前不能被节点\(K\)访问到\()\)当然是坠好的。

  • [ ] 二分图的最小点覆盖:求出二分图中的一个最小的点集\(S\),满足图中任意一条边都有至少一个顶点属于\(S\)

定理:二分图最小点覆盖包含的点数等于二分图最大匹配包含的边数。

证明:首先,因为最大匹配是原二分图边集的一个子集,且所有边都不相交,所以至少需要从每条匹配边中选出一个端点。即最小点覆盖的点数必须大于等于最大匹配包含的边数。于是只需构造一组点覆盖使其满足最大匹配包含的边数即可。构造方法:求出二分图最大匹配,从左部每个非匹配点出发,执行一次寻找增广路的过程,标记访问过的点,取左部未被访问的点,右部被访问的点,即可。构造的正确性证明可以从数量关系(与最大匹配包含的边数相等)和覆盖所有边两个方向去证明。

  • [ ] 二分图的最大独立集:求出二分图中最大的点集\(S\),满足\(S\)中任意两点之间都没有边相连。

定理:二分图的最大独立集大小等于总点数减去最大匹配数。

证明:选出最多的点构成独立集,等价于在图上去掉最少的点,使剩下的点之间没有边,等价于用最少的点覆盖所有的边,等价于用总点数减去二分图的最小点覆盖。

  • [ ] 有向无环图的最小路径点覆盖:给定一张DAG,要求用尽量少的不相交的边,覆盖有向无环图的所有顶点。我们将原图的任意一个点拆成两个点,一个入点,一个出点。连向该点的边连向入点,该点连出的边连向目的地的出点。这样,得到了一个拆点二分图。!!注意,路径可以是一条边,也可以是几条连续的边!!

定理:有向无环图的最小路径点覆盖包含的边数等于总点数减去拆点二分图的最大匹配数。

证明: 最小路径覆盖中的所有边,在拆点二分图中构成一组匹配。所有的终点均为左部匹配失败点。由于要让路径最少,等价于要求终点数最少,也就等价于要让匹配失败点最少。故求解最大匹配数。

  • 今天大概过了一遍理论知识,处理后面的最小路径点覆盖的两个问题以外,差不多都可以独立证明结论了。我还是希望我能培养自己的理论证明能力,这样有想法时不至于畏手畏脚的。
  • [x] \(Acw372\) 棋盘覆盖

​ 题意:给定一个棋盘,有些格子上面禁止放置。求最多能往棋盘上放多少块长度为\(2\),宽度为\(1\)的不重叠的骨牌。由于骨牌不能重叠,所以每个节点只能被一张骨牌覆盖;又由于是\(1×2\)的骨牌,所以将棋盘黑白染色后,相同颜色的格子之间必然没有连边。所以就转化为了二分图求最大匹配的问题。

  • [x] \(Acw373\) 車的放置

​ 题意:给定一个棋牌,有些格子上面禁止放置。求最多能放多少个車满足每一行每一列都至多只有一个。每一行每一列至多只有一个;相同行和相同列之间没有连边;所以可以以行为左部点,列为右部点建二分图求最大匹配。

  • [x] \(Acw374\) 导弹防御塔

​ 多重匹配拆点。

  • [x] \(POJ2226\ Muddy\ Fields\)

​ 题意:有一块草地,草地上有一些泥地。要求用宽度为1,长度不限的木板覆盖所有泥地而又不覆盖到干净草地。问木板的最小数量。由于长度不限,所以将同是泥地的同一列/行若干个连续的泥地看成一块,然后对于每块泥地,在它所属的行泥泞块和列泥泞块之间连边。转化为最小点覆盖问题。

  • [x] \(POJ3565\ Ants\)

​ 题意:给定\(N\)个黑点,\(N\)个白点,黑点白点间连线且每个点只能连一根线。求一种方案,使得最后所有线段不相交。让所有线段不相交,等价于让所有线段的长度之和最小。转化为最大带权匹配问题。

  • 二分图的题目中如何建立模型太重要了。明后两天重点总结建模方法。
25
  • 今天总结了一下昨天的题目的建模方法。然后加深了对于有向无环图的最小路径点覆盖的理解。然后又做了几道题目练手。

  • [x] \(P2857\) 稳定奶牛分配

​ 题意:求二分图最大匹配,满足最大边权与最小边权差值最小。二分最小差值,枚举合法边权区间起点,看能否最大匹配即可。最开始的想法是让每个点枚举出边的顺序按边权升序排序,然后只枚举起点,类似贪心跑一遍。但这样有个问题就是某个点增广时会导致许多点的边改变。也许本来这个点连另一条边也可匹配,但由于先走了这条边,导致其匈牙利树上的一个点的匹配边边权增大——然而可能这个边权猛增$ INF$(笑),然后就凉凉了。所以,匈牙利算法不能在增广过程中对边有限制,只能对点有所限制(本质上就是因为匈牙利算法首先是要保证点的最大匹配的)!!​

  • [x] \(POJ1422\ Air\ Raid\) & \(Acw379\) 捉迷藏

​ 第二题题意:给定一张\(DAG\),在上面选出一个最大的点集,点集内的点互不可达。因为有向图的最小路径点覆盖(不可重复)覆盖了所有的点,而每条路径上面至多选择一个点,所以点集内的点数必然小于等于路径条数。直接给结论吧:就是等于。故两道题目分别是\(DAG\)最小路径点覆盖(不可重复/可重复)。第二题给我的启发:当两点只要连通就有影响(比如禁止任意两点连通)且不能删点时,可以先用传递闭包处理出新图,新图上每个点都与自己原图上能到达的点连边了。

  • [ ] \(POJ1112\) \(Team\ Them\ Up!\)

​ 题意:有一群人及他们的认识情况,要求将这群人分成两组,满足同一组内任意两个人相互认识。求解两组人数差最小的时候的方案。任意两个人相互认识的条件并不好用,首先不好确定组中有哪些人(可能先前选的人并不合适),其次每次新增元素时需要每个点都比对(当然复杂度在这题应该不算问题)。考虑补图转化,当两个人并不互相认识时连一条边,这时,与某个节点相连的节点的染色必须不同,问题就转化为二分图判定了。要求差值最小显然\(DP\)。但要求方案太恶心,我就没写了。

  • 今天上午大概就过完了进阶指南和训练指南里所有与二分图有关的题目,当然只选了几道做,其他题目只是把思想搞清楚了。训练指南上还有一些好题目没敲,争取明天总结好。

  • 晚上尝试看国集论文,看懂了一道非常非常优秀的\(KM\)建模题。(//▽//)

  • [x] \(SGU\ 206\)

​ 题意:给定一个\(DAG\),再给定一个边集\(T\),要求用最小的代价使得原图的最小生成树为\(T\),代价的计算方法为\(\sum_{i=1}^m{w'[i]-w[i]}(w[i]\)为原边权,\(w'[i]\)为改后边权\()\)。 首先,若一条边为树边,那么它的边权只能变小不可能变大;非树边则只可能变大(绝对值问题✔)。 对于一条非树边\(E_i\),它能影响到的树边为\(E_i\)的两个端点在\(T\)上的链,假设其中某条为\(E_j\)。那么必然有\(w'[i]>=w'[j]\)。设边$ E_i\(的增量为\)\delta_i\(,边\)E_j\(的增量为\)\delta_j\(,那么必然有关系\)w[i]+\delta_i>=w[j]-\delta_j\(,**变形为\)\delta_i+\delta_j>=w[i]-w[j]\(**。注意到右边是定值!即问题转化为:给每个定点赋一个\)\delta\(,满足\)w[u]-w[v]\leq\delta_u+\delta_j(u\in T,v \not\in T)\(,最小化\)S=\sum_{i=1}^m{w'[i]-w[i]}=\sum_{i=1}^m{\delta_i}\(。而**在\)KM$算法求完后,每个节点的顶标值总和恰好为满足定义的最小值**。于是做法就显然了。实现也有很多细节,最为重要的是,当数据较小时,尽量用邻接矩阵存,真的方便~

  • 上面那题实在给我极大的震撼。二分图的模型太灵活了。做题的时候首先要善于抓住一些“常识”(比如上题的绝对值问题),然后要敢于利用最基本、最普通的性质去列式子,去设数,去转化。
26
  • 哎。之前做一些比较简单的题目,感觉还不错。一遇到难题,真的就\(Orz\)了。一直是这样,什么支配树啊,什么带花树啊,学的都很吃力。 不知道是思维的问题还是学习方法的锅。
  • [x] \(P3386\ HM\)算法

​ 对于求二分图最大匹配的一个优化算法。可以将时间复杂度优化到\(\mathcal{O} (m\sqrt{n} )\)。每轮匹配时先\(BFS\)一次,计算出若干条互不相交的极大增广路集,然后在\(DFS\)中只走\(BFS\)到的极大增广路集。实现的话可以通过\(BFS\)对到达的节点分层,每次\(DFS\)只往下一层的节点扩展。

  • [x] \(UVALive3989\) 稳定婚姻

​ 稳定婚姻问题模板。

  • [x] \(UOJ79\) 一般图最大匹配

​ 带花树模板。

带花树
  • [ ] 基础用法:求解一般图最大匹配。
  • [ ] 核心思路:一般图与二分图的唯一区别就是奇环。找到奇环时,因为无论外面如何匹配奇环(节点为\(N\))内部总能整出一条\(N/2\)的路径(由奇偶性易得嘛),所以我们把奇环缩成一个点。那么,具体应该怎么开花呢?
  • [ ] 核心算法:开花!

​ 永远记住一点:\(pre\)数组有两个作用:保存搜索树上的父亲节点;用来更新匹配。奇环因为已经缩点了,所以奇环内的点我们仅需要其用于更新匹配的作用。

​ 为什么\(F(u)!=d\) ?因为两点\(LCA\)\(pre\)必须要连出去。

​ 为什么\(pre[u]=v\) 最后又\(u=pre[v]\)实现\(pre\)互指?因为之前说过奇环恒要整出一条满足条件的路径,当找到某个点时,必须要能从这个点回到奇环缩完后的点(即之前的\(LCA\))。

​ 为什么把点\(v\)颜色改变?因为奇环上的每个点都可能更新答案。

void B(int u,int v,int d){
	while(F(u)!=d){
		pre[u]=v,v=Mat[u];
		if(col[v]**1) col[v]=0,q.push(v);
		f[u]=f[v]=d;u=pre[v];
	}	
  • “找准方向,明确目的。兵来将挡,水来土掩。”明确到底是哪里卡住了我无法深究这些高级算法,才能对症下药。希望自己能就以带花树为契机,一定要吃透它。
  • \(27\)号 搞懂了带花树。鸣谢:\(Imakf\)、小李\(lsq\)
27
  • 今天又开始考试咯。加油加油加油加油!!!
  • [x] \(T1\ cow\)
  • [x] \(T2\ shopping\)

​ 题意:给定一张无向图,求经过\(S(S\leq 15)\)个指定点,从\(0\)号结点出发,最后回到\(0\)号节点的最小环。开始想到用\(Floyd\)跑全源,再状压\(DP\)。然后意识到\(Floyd\)不可做,直接\(S\)\(Dijkstra\)也算想出来正解吧 结果忘记考虑环的起终点都必须为\(0\)号节点了。跪了。做法就是设\(f(x,S)\)表示走完集合\(S\),走到\(x\)节点时的最短路。注意每个点可以经过多次,内层毋需判是否在集合内。

  • [x] \(T3\ cycling\)

​ 题意:给定一个图。每个点上有权值\(h\),求一条\(1\)\(n\)使得路径上高度极差最小,并在极差最小的基础上最小化路径长度。看到极差最小,我就想到了二分+枚举起点+跑\(Dijkstra\),然后会超时。然后我就不会了。正解外层是尺取法。要求极差最小的题目是可以用尺取法枚举左右端点的!! 并且,我每次有一个新区间就跑一遍\(Dijkstra\),相当于是把求可行性与最优化两个问题一起考虑了。其实没必要,当问题可行性的求解效率较高时(一般都要更快)可以将求可行性和最优化两个问题分开求解。比如这个题,每次跑\(BFS\)判可行性。效率高多了。

  • [ ] \(T4\ well\)

​ 题意:给定一张\(N\)个点的图以及\(M\)个特殊点,选择一些边使所有特殊节点与给定节点相连通。要求边权和最小。正解:不会。

  • 今天终于是问会了带花树。大概就是窝对于\(pre\)数组的理解不深,对于沿\(pre\)更新匹配有点想当然(以为会死循环什么的)。当沉下心来仔细琢磨时,心中总算有了点带花树的感觉。以后学习新算法,把握好定义。一个数组/变量可能对于不同对象有不同含义,并且写题解的人可能自己都没注意。这时候就需要自己去理解了。
  • 加油。爱生活 爱\(OI\)
28
  • 今天考试有几道重题。只总结新鲜的\(idea\)

  • [x] \(T4\ road\)

​ 题意:给定一张无向图,每次给两个数\(a,b\),询问\(a\rightarrow b\)路径上的关键边个数。首先,每个关键边它必须得是割边,且割边一定是关键边。于是问题转化为维护一条路径上的割边数目。生成一棵\(DFS\)树,割边只有可能是树边,故就割边数目而言,两点原图上路径与树上的路径等价。于是\(LCA\)维护就可以啦。

  • [x] \(T7\ gcd\)

​ 题意:在一个可重集合中选择一个最大的子集,满足任意两个集合中的数(a[i],a[j])有\(gcd(a[i],a[j])gcd(a[i]+1,a[j]+1)\not=1\)。做法:发现任意两个,立马想到建补图(快夸我(//▽//))。于是问题就很显然的成了二分图跑最大独立集。但我最开始犯了个低级错误——类似于建了两个序列,然后跑二分图(可能是受了拆点的影响吧),但这样显然是不行的,因为序列二的二号元素被匹配后,序列一的二号元素也就不能再匹配了,二分图的左右两个部分是完全独立,互不影响的。最后我就发现了“奇数和奇数,偶数和偶数之间肯定没有边”这么一条性质,再根据奇偶性分两个部分跑二分图。

  • [x] \(T9\ Island\)

​ 题意:向\(N\)个居民询问了\(M\)个问题(可重复),每个居民回答两个,答案必定一真一假。问所有合法的问题答案方案数。这个问题比起\(2-SAT\)变了\(2\)点。第一点:由于是必定一真一假,所以两句话的真假性可以互相推出,所以连双向边。第二点:由求合法性变为求方案数。显然,每一个弱连通分量一定有一个对应的弱连通分量,满足其中的节点一一对应(即\(1\)对应\(n+1\),\(n+2\)对应\(2\)),而在所有互相对应的弱连通分量中中任选一个,一定能构成全集,故方案数就是\(2^{弱连通分量数/2}\)

  • 考试最大的收货是什么呢?上述三个题目都不是简单地考模板,但我有史以来第一次学会了问题转化,并且成功\(A\)题,还一次\(3\)道,简直不要太高兴!!希望自己能保持这种趋势吧。
  • [ ] 然后今天看一晚上看完了老师发的图论杂题选讲。但只是搞懂了思想,并没有上代码。总共\(15\)题,题目重思维,对我的思路有许多启发意义。明天再总结几道经典的。
  • [ ] 每天还是总结下常规情况吧。
  • [ ] 语文:史记打卡;《马嵬》练习。
  • [ ] 数学:无。
  • [ ] 英语:阅读完\(Flipped\ Chapter1\),并听完了\(2\)个讲评。
29
  • 今日学习计划:

  • [ ] 竞赛:完成考试\(T6\);将昨日图论杂讲里的题目用代码实现;自学cdq分治。

  • [ ] 语文:史记打卡;背诵《马嵬》。

  • [ ] 数学:看完剩下的视频,完成第二章所有练习题。

  • [ ] 英文:看完内容篇的视频;阅读\(Flipped\) 四到五页;复习昨日笔记。

  • 除网络流以外的图论结束了。收获颇多。

  • [x] \(T6\ planar\)

​ 题意: 给定一张图,判定是否为平面图(保证图中存在一个哈密顿环)。平面图定义:若能将无向图 \(G=(V,E)\) 画在平面上使得任意两条无重合顶点的边不相交,则称图\(G\)为平面图。首先平面图有个重要的性质:在平面图中,\(m\leq 3*n-6\),于是\(m\)就与\(n\)同阶了。而判定两条边是否相交可以依靠哈密顿环,在环上给每个节点赋个编号即可。注意!!并查集合并两点时,如果不\(Find\)一下而直接连边,极限情况下是可以卡爆递归栈的!!切记!!

  • [x] \(P1073\) 最优贸易

​ 题意:给定一张有向图,每个节点有个权值,可以在任意节点以其结点权值为价格买入商品,再在之后以到达节点的权值为价格出售。只能交易一次。求从\(1\)\(n\)最多赚多少。很显然了,正反跑一次\(SPFA\)。但我没有\(1A\),跪在了:我\(SPFA\)最开始把每个点都加入到队列中,\(Max/Min\)赋值为节点权值。但!!有的节点可能并不能到达终点,所以它们的答案是不能算进来的!!\(SPFA\)的入队节点一定要考虑清楚,起点能到达,终点可去到的节点才能入队。

  • [x] \(CF437C\)

​ 题意:\(n\) 个带权点,\(m\) 条边的无向图,删除一个点的代价是与这个点相邻的,且没有被删除的点权和。思维题。因为每条边都会被删去,所以可以看成是每次删除由边来贡献,\(ans=\sum_{i\in E} e[i].v\),而显然\(e[i].v=min(w[e[i].from],w[e[i].to])\),于是每次删除权值最小的点,边的贡献就是边连接的两个点中权值小的那个点惹。

  • [x] \(CF623A\)

​ 题意:\(n\) 个结点的无向图,每个结点标号"\(abc\)" 三个字母其中一个。将标号为相同字母的结点连边,将所有标号为 \(b\) 的结点与其它标号的结点连边。给出图的 \(m\) 个连边,求一种合法的标号方案,不存在输出"\(NO\)"。题目看似很简单:标出能到达其他所有点的点为\(b\)点,然后反向建图,二分染色,求出染色为\(a\)\(c\)的点。但下图是个反例。为什么呢?这样做只保证了未连上的边不合法,并不能保证连上的边合法!!也就是所谓只有必要性而无充分性。故在染完色后还要再跑一遍检验图是否合法。

  • [x] \(CF449B\)

​ 题意:\(n\) 个点,\(m\) 条带权边的无向图,另外还有\(k\)条特殊边,每条边连接\(1\)\(i\)。求可以删除这\(k\)条边中的多少条,使得每个点到\(1\)的最短距离不变。由于最短距离的性质,所以一条特殊边要么一定不能删,要么可以删到只剩一条。由于特殊边都是从\(1\)\(s\),那么就有个很显然的思路:跑一遍最短路,枚举每条特殊边尝试删除。但这样复杂度会达到\(\mathcal{O} (KM)\)。有一种另外的做法,先把所有与\(1\)用特殊边相连的点放入队列中并标记,然后跑\(SPFA\),若可以松弛某个节点,则将其标记清空。巧妙啊!! 这题卡SPFA 差评qnq

  • [x] \(CF545E\)

​ 题意:给定一个\(n\)个点,\(m\)条边的无向图和一个点\(u\),找出若干条边组成一个子图,要求这个子图中\(u\)到其他点的最短距离与在原图中的相等,并且要求子图所有边的权重和最小,求出最小值。最小路径生成树。由于要让子图的权重和最小,所以某个节点的最短路一定是通过越多的边越好,即松弛操作改为\(>=\)。还算好做吧。

  • 怎么说呢,还是很开心吧,第一次\(AK\)一场比赛。鉴于老师发的\(PPT\)上的题目已经搞懂,我又找\(yxt\)问了几道图论好题。刚好明天放假可以做。我希望老师可以宽限一天写总结,等我明天做几道高水平图论题再一起总结。

  • 今日常规:

  • [ ] 语文:史记打卡。

  • [ ] 数学:完成了之前的所有作业。鉴于作业太简单,以后可能只听课不做作业了。

  • [ ] 英语:网课;复习笔记。

  • 四年一见的日子。我说出来了呢。不知是福是祸呢。坚定自身,努力朝着自己想去的地方前进吧,当自己强大的时候,自然没人能支配你。

Mar.

1
  • 今日常规计划:

  • [ ] 语文:史记打卡。复习笔记;背古诗文。

  • [ ] 数学:听\(3\)节课。

  • [ ] 英文:阅读\(Flipped\)一章。

  • 先把老师\(PPT\)上没做但挺优秀的题目总结一下。

  • [ ] 链型网络 (来源未知)

​ 题意:给定一张无重边、自环的无向图.每次可以加边,或者询问有多少个点满足将该点删除后,原图的每个连通块都为一条链。看到这题时只想到链是\(n\)个点\(n-1\)条边,然后发现树也是这样,就\(Orz\)了。然后其实有个更强的性质,就是链形图$\Longleftrightarrow $每个点度数均小于等于\(2\)且无环。这样做就比较简单了。(1)如果有度数大于等于\(3\)的点,那么就只能删去该点及其多个相邻点,再在新图上判定是否满足条件。怎么判定呢?如果新图上某个节点的度数大于等于\(3\),或者存在环,直接\(GG\)掉;否则就可以。(2)如果图中还未出现度数为\(3\)的点,那么如果原图为若干条链,答案就是\(n\);存在一个环,答案就是环大小;存在多个环,答案就是\(0\)

​ 注意不能直接把存在多个度数大于等于3的点的图直接\(GG\)掉!!也不能直接把存在度数大于\(3\)的点的图\(GG\)掉!!反例(两个画一起了):

  • [ ] \(CF715B\)

​ 题意:给一张\(n\)个点,\(m\)条边的无向图,要求设定一些边的边权使得所有边权都是正整数,最终\(S\)\(T\)的最短路为 \(L\)。最开始的想法把特殊边设为\(0\),再跑一遍最短路,然后再视\(S\)\(T\)的最短路长度及经过特殊边数量来处理。但由于存在多条最短路,且有可能存在次短路小于\(L\)而我们没修改到,所以不可做。正解是\(DP\)\(f(i,j)\)表示经过\(j\)条无边权边到达节点\(i\)的最短路。太巧妙了!!最后找到最小的\(j(j>=1)\)满足\(f(T,j)+j\leq L\)即可。当然,若\(j\)\(0\)且满足该不等式,还是需要讨论的。

  • [ ] 冷战

​ 题意:给定一张图,要求支持两种在线操作:加边;询问两点最早什么时候连通。并查集按秩合并形成了一棵连通树,且树高严格\(logn\),将树上的边权赋值为该边两个端点连通的最早时间。于是就找树上路径的最大值就行惹。

  • 然后做了一点\(yxt\)给的图论题。思路都挺新颖,很有启发意义。
  • [x] \(ARC092D\)

​ 题意:给定一张\(N(N\leq 10^3)\)个点\(M(M\leq 2×10^5)\)条边的有向图。保证图中不存在重边和自环。试判断将每条边反向,其他边不变的情况下,图中强连通分量的数量是否改变。首先探究什么情况下强连通分量数量改变(可增可减)。对于一条边\(u\rightarrow v\),若满足且仅满足:(1)存在路径\(v\rightarrow u\) (2)存在路径\(u\rightarrow v\)不经过该边 这两条中的一条,那么修改就会改变数量。条件(1)可以直接\(\mathcal{O} (NM)\)暴力。那么问题转化为:如何判定有向图中一条边是不是必经边。有向图必经边问题显然可以用支配树来做,但对于此题有些大材小用。这时有两个做法:枚举每条边,锁住,再判连通,复杂度\(\mathcal{O} (M×(N+M))\),另一种方法是重点。考虑对于一个点\(x\),我们顺着出边\(DFS\)一遍,对每个节点打上一个标记,表明哪个出边可以首先到达它。然后再把出边顺序反过来\(DFS\),如果扫到的点\(y\)标记与之前不一样,就表明\(x\rightarrow y\)(可能不存在)不是必经边。注意这种方法不能判路径\(x\rightarrow y\)上的必经边。时空复杂度均为\(\mathcal{O} (N^2)\)

  • [x] \(ARC103D\)

​ 题意:给出\(N(N\leq 10^5)\)个互不相同的数\(Di\),表示树上某个点到其他所有点的距离和。请判断是否存在这样一棵树,其中每条边的长度均为\(1\)。若存在请输出一种方案,否则输出 \(-1\)。第一次(第二次?做构造题了。这道构造题做的时候没有任何想法。构造题可以通过先分析性质得出某一部分特殊的构造,再递推出其余的构造的方法来做。比如这道题。到其余所有点的距离和最小的显然是重心,最大的显然是叶子节点。思考节点之间如何递推。可以发现,如果\(u\)\(v\)的父亲,那么有\(D[u]=D[v]+size[v]-(n-size[v])\)。而叶子节点的\(size\)\(1\),这样就可以推出第二层节点。如此往复。但这样并不一定满足条件,因为其本质是利用\(n-1\)个方程去解\(n\)个未知数,这样只能得到两个节点之间的关系,我们需要验证。这样做必然到最后剩下一个最小的为根节点(原树的重心),而这个根节点到所有节点的\(D\)必然为所有(除自己)的\(size\)相加。以此验证最简便。

​ 有一个可能不是很正确的提醒:做构造题,若用递推,那么可能要考虑用构造完成后的常量检验最终答案是否存在。

  • [x] \(CF547D\)

​ 题意:给定\(N(N\leq 2×10^5)\)个整点。你要给每个点染成红色或蓝色。要求同一水平线或垂直线上两种颜色的数量最多相差\(1\)。刚开始看到这题时完全没有想法。做法:将每条横边/纵边看作是一个点,有一个点就横纵连线。问题转化为给每条边定向,使得每个点出入度之差不超过1。由于度数为奇数的点一定有偶数个,所以可以连一个虚点。这样每条边均有偶数个度数,跑欧拉回路定向即可。

图论方法大总结
  • [ ] 总括:补图转化、坐标图/网格图横纵连边、顶点度数限制、递推构造、大力分类讨论 等。

  • [ ] 最小生成树:倍增维护树上两点间路径的最小/次小/最大/次大最大值,建树过程中的并查集的改进。

  • [ ] 最短路:各种贪心性质,如最短路的子路径必为最短路、两条最短路重合部分必定连续等。最小环问题转化为最短路。

  • [ ] 无向图缩点:缩完割边是棵树。对图上节点情况大力讨论。

  • [ ] 有向图缩点:缩完点后是\(DAG\),可以跑\(DP\)。可以处理特殊的\(2-SAT\)问题。

  • [ ] 二分图:左右部分独立;与没有奇环相等价;二分染色;横纵连边;补图转化;建立不等式组转化为\(KM\)问题。

  • 大概到这里吧。明天网络流,加油。

  • 今日常规:

  • [ ] 语文:练习卷一张。

  • [ ] 英语:《Flipped》完成第二章。

  • [ ] 数学:预习进度推进了一小节,并完成了习题。

2
  • 今日常规计划:

  • [ ] 语文:背诵。

  • [ ] 数学:完成回归方程学习。

  • [ ] 英语:继续阅读《Flipped》。

  • [ ] 物理:上网课。

  • 开始进入网络流了。今天主要是把进阶指南上的讲解和例题过了一遍。说实话,还有一个困扰我的疑问存在就是为什么\(dinic\)中加分层可以比\(EK\)快。实在是想不通。

  • [x] \(P3376\ Dinic \& EK\)模板

  • [x] \(Acw380\) 舞动的夜晚

​ 二分图最大匹配可行边/必经边模板题。对于完备匹配,我们可以将匹配边从左至右连有向边,将非匹配边从右至左连边。设新图为\(G\),若原图一条边连接的点处于同一个强连通分量中,则将整个连通分量取反,总匹配数不变。故判断可行边:\(x\rightarrow y\) 是匹配边,或者\(G\)\(x\)\(y\)属于同一个强连通分量;判断必经边:\(x\rightarrow y\)是匹配边,并且G中\(x\)\(y\)不属于同意强连通分量中。很遗憾的是这道题并不满足最大匹配,这样就会出问题。比如\(x\rightarrow y\)是非匹配边,\(x\rightarrow u\)\(y\rightarrow v\)是匹配边,连边\(x\rightarrow y\),可能\(u\)可以找到\(u\rightarrow z\)匹配。故我们需要一个点辅助连通。考虑网络流做法。在残量网络中,若\(z\)是非匹配点,则\(z\rightarrow T\)\(1\);而\(T\rightarrow v\)\(1\),所以存在路径\(z\rightarrow v\);此时也必然存在边\(u\rightarrow z\)(未匹配),则\(u、z、v\)利用汇点成为了强连通分量。

  • [x] \(P3381\) 最小费用最大流模板
  • [x] \(POJ1966\ Cable\ TV\ Network\)

​ 题意:给定一张\(N(N\leq 50)\)个点无向图,问最少删去多少个点可以实现图不连通。图不连通指存在两点不能互达。如果我们枚举源点和汇点,那么问题转化为类似于网络流中的最小割问题了。但网络流中是删边,此处是删点。于是就需要点边转化技巧了。图的节点可以拆为入点和出点,把点的属性体现在“入点”和“出点”的边上。在本题中,体现在边的容量为\(1\)。其次,我们不能让原来有的边被割掉了,于是我们设定原有边的容量为\(INF\),在最小割中就等价于防止割边。

  • 今日常规:

  • [ ] 语文:无。

  • [ ] 数学:无。

  • [ ] 英语:整理《Flipped》笔记。

  • [ ] 物理:听课,并完成习题,可惜有许多问题,与同学讨论占用了大量时间。

  • 今天莫名发现时间利用率超低。下午常规几乎没做什么,都放在物理上面了。哎,物理上网课真是个糟糕的主意。

  • 或许也和今天\(typora\)屡下屡失败的糟糕心情有关吧。难受。

3
  • 今日常规计划:
  • [ ] 语文:完成练习卷。
  • [ ] 数学:学习回归方程。
  • [ ] 英语:读完《Flipped》第三章。
  • [ ] 物理:听课;做作业。
4
  • 网络流 网络瘤。

  • 为什么我昨天没写总结呢?板子不背好,\(debug\)两行泪。哎,真的好难受啊。

  • 还好,今天状态在线了一点点。学会了带上下界有无源汇的最小最大可行流的求法。虽然可能效率还是不够高吧。哎。

  • 总结一下昨天的三题。

  • [ ] \(POJ\ 3422\) \(k\)取方格数。

​ 题意:给定一个矩形,每个方格中有一个数字,要求从左上角取\(k\)次数到右下角,每次只能向右或向下取。每个数只有第一次取算权值。要求\(k\)次权值最大。网络流貌似只能使流量最大,那么问题主要有两个:如何限制只取\(k\)次?如何只使得第一次取数有权值?对于问题一,通过构造,可以使网络跑最大流时某些东西恰成为给定值(重点是利用好”最大“)。将每个方格拆成入点和出点,中间连一条上界为\(k\)的边,可到达的两个格子中连一条上界为\(INF\)的边。这样跑最大流每个点(此时已成为入点和出点中的边)显然一定经过\(k\)次。对于权值只算一次的限制,我们可以将入点和出点中的边拆成两条,一条流量为\(1\),费用为点权,另一条流量为\(k-1\),费用为\(0\)对于“允许多次选取,但只有前\(m\)次有权值,求最值”的题目都可以转化为费用流来做

  • [ ] \(UVA\ 11248\)

​ 题意:给定一个网络,问是否存在点\(1\)到点\(N\)流量为\(C\)的流。若不存在,则求能否通过改变一条边的上界使之存在。需要修改的弧一定是最小割里的弧。因为如果不改割里的弧,那这条弧在路径中依然是类似于瓶颈的存在。然后枚举最小割集里的每条割暴力判断即可。需要优化:(1)可以在残量网络基础上修改判断;(2)出现流量为\(C\)的流时立即返回。

  • [ ] \(P2740\ Drainage\ Ditches\)

​ 最大流板子题。

上下界网络流
  • [ ] 无源汇有上下界可行流

​ 核心思路:如果存在一个可行流,那么该流一定满足流路径上的所有下界。因此我们可以先让所有边等于下界值,得到初始流。这个初始流不一定满足流量守恒,因此最终的可行流一定是在这个初始流的基础上增大了一些边的流量使得所有点满足流量守恒。因此我们考虑在残量网络(每条边的上界修改为上界减下界,下界修改为\(0\))上求出一个另不满足流量守恒的附加流,使得这个附加流和我们的初始流合并之后满足流量守恒。流量守恒就是要让\(in_i=out_i(i\in V)\),所以令\(a[i]=in_i-out_i\),即\(i\)点存储的流量。若\(a[i]>0\),意味着该点存储了流量,在附加流中它就需要流出流量,那这个流出去的流量我们就需要给它,故建边\((S,i,a[i])\),反之建边\((i,T,-a[i])\)其实说这么多,就是建一个源点一个汇点,将原来下界以下的流量单独提出来连边,然后要求它满足。 然后跑最大流,如果与\(S\)相连的边全部满载就可以了。这个板子最重要的思想是什么呢?我认为有两个。首先是下界问题的转化。由于下界是必经的,流量是独立的,所以我们可以将必须的流量提出来考虑。第二个是通过构造把可行性问题转化为最值问题。即,如果要求符合某条件的流是否存在,那么可以通过构造,使得当存在时,网络最大流必然满足某些其余的限制(譬如源点的入边必须满载)。

  • [ ] 有源汇有上下界可行流

​ 核心思路:无源汇与有源汇最大的区别在于有源汇的图源汇两点不满足流量守恒 。解决方案是从汇点到源点连一条上界为\(INF\)的边。于是就同上了。

  • [ ] 有源汇有上下界最大流/最小流

​ 核心思路:(1)最大流:注意到,当求解完可行流后,原图已经满足所有下界条件了,即残量网络中任意的流量都是合法的了。那么我们只需要在残量网络中在原本的源汇两点间跑最大流即可。(2)最小流:此处需要加深对于\(dinic\)反向边的理解。正向边的流量增加等价于反向边的流量减少,反向边的增加减少等价于正向边的流量减少(注意:等价于!!)故跑一遍\(t\)\(s\)的最大流就可以了。

  • [ ] 几道例题。

  • [x] \(ZOJ\ 2314\) 无源汇有上下界可行流

  • [x] \(ZOJ\ 3229\) 有源汇有上下界最大流 (建图有技巧,但不难)

  • [ ] \(BZOJ\ 2502\) 清理雪道 有源汇有下界最小流 (要求输出方案)

  • 然后这两天一直在看《训练指南》,课后习题敲的少,但在一道一道过模型吧。

  • [x] \(uvalive2531\) 足球联赛

​ 题意:有\(n\)个队伍进行比赛,每支队伍需要打的比赛相同,每场比赛恰好一胜一败。给出每个队伍的胜败场数及每两个队伍还剩下的比赛场数,判断有几个队可能可以得冠军(胜场最多者得冠军,允许并列)。注意到是可行性问题。这个问题模型的建立也是非常巧妙的。当然先枚举每个队伍,计算该队最大胜利场数\(tot\)。首先,将每个队伍视为节点向汇点连边,容量为\(tot-\)该队已经胜利的场数,这个很好想到。现在的问题是,什么东西可以向代表队伍的节点连边呢?考虑这样连边的意义——一定是这个东西可以给队伍带来流量——也就是胜利场数。故确定为比赛。于是有源点向每个比赛代表的节点连上界为比赛场数的边,每个比赛向比赛的两支队伍连上界为INF的边(因为可以自由组合胜负情况,并且此处的流量已由源点连来的边限制),然后跑最大流,判断与源点相连的边是否满载即可。做网络流的题目,\(1\)单位流量一定有个意义。一定要时刻把握住这个意义,根据意义去推选取什么连边

  • [x] \(uva\ 11082\) 矩阵解码

​ 题意:给定一个矩阵,定义\(a(i)\)代表前\(i\)行的和,\(b(i)\)代表前\(i\)列的和。给定\(a,b\),求符合条件的矩阵。矩阵中的每个数都是正整数且小于等于\(20\)。思路很新颖的一道题。利用矩阵中某个点的权值来做流量,在\(a,b\)中间连边。还是运用的横纵连边的技巧,将每一行的和与每一列的和看成是一个点,然后在横纵之间连边,容量设为\(19\);建立超级源点与每一行代表的节点连边,容量为该边的和,建立超级汇点与每一列连边,容量为该列的和。跑一遍最大流,若所有由源点连出的边都满载,则满足条件。横纵连的边上的流量\(+1\)即为该行列的点值。当题目给定的条件只有横纵上的限制时,多半是将横纵转化为点,将横纵坐标对应的点转化为一条边。并且,用流量来代表某一权值也是很常用的方法。这里单位流量的意义就是点权。

  • 希望明天能抽时间把自己搞懂思路的题目都总结一下。
  • 靠着意志力再撑几天吧。相信光明即将到来。
5
  • 今日常规计划:

  • [ ] 语文:史记打卡;背书。

  • [ ] 英语:《Flipped》;语法课。

  • [ ] 数学:听课。

  • [ ] 物理:争取一版必刷题吧。

  • 今天把进阶指南上的题目基本过了一遍。但真的没时间打了。随便一道就是\(3h\)

  • [ ] \(uvalive2957\) 运送超级计算机

​ 题意:有\(n\)个点,要求把\(k\)个计算机从\(s\)运送到\(t\),每个计算机需要一艘飞船运输,有\(m\)条双向边,每条边一次只能允许一艘飞船通过,且通过的时间均为\(1\)天,求最短时间以及每天的运输情况。其实这个题难的就是如何对待每过一段时间每条边就可以又传递一艘飞船。把节点根据时间拆开就好啦。每次建边\(a_i\rightarrow b_{i+1},b_{i}\rightarrow a_{i+1}\),表示从第\(i\)天的\(a\)点可以到达第\(i+1\)天的\(b\)点。动态流。

  • [ ] \(uva10779\) 收集者的难题

​ 题意:\(Bob\)有一些贴纸,他可以和别人交换,他可以把自己独有的贴纸拿出去,也可以把重复的贴纸拿出去(有时候把独有的贴纸而不是重复的贴纸拿出去能换到更多贴纸)。\(Bob\)的朋友也有一些贴纸,但是他们只会拿自己重复的贴纸和\(Bob\)换,而且换的是自己没有的贴纸。求\(Bob\)最后最多能有多少种贴纸。把每个单位流量的意义定义为换一次贴纸。那么建模方法也算显然了。建立源点向每个贴纸连边,上界为\(Bob\)拥有的数量。每个贴纸向朋友连边,若该朋友无此贴纸,则自贴纸连向朋友,上界为\(1\);否则自朋友连向贴纸,上界为朋友拥有的数量\(-1\)。最后将每个贴纸向汇点连边,统计答案。启发是要求种类数最大时,可以将每个物品向汇点连一条容量为\(1\)的边统计答案。

  • [ ] \(uva11613\) 生产销售规划

​ 比较显然的费用流板子。注意连续存储(边间接相连)对答案合法性的影响——解决方法是拆点。

  • [ ] \(uva10906\) 最短往返路

​ 题意:给定一个带权无向图,要求找一条\(S\)\(T\)的往返路,每条边只经过一次,总权值最小。显然拆点,出入点间的上界为\(2\),权值为\(0\),原图上的边上界为\(1\),权值不变。加个超级源点只引入\(2\)单位流量就可了。

  • [ ] \(uvalive3268\) 号码簿分组

​ 题意:给出\(n\)个人和\(m\)个分组,每个人可以属于很多组,现在要求给出一组分组方案,使得分组后的结果中最大组尽量小,输出最后最大组中的人数。最大值最小显然二分。定义单位流量为增加\(1\)个人数。建立超级源点向每个人连上界为\(1\)的边,再把每个人向每个组连一条上界为\(1\)边,每个组向超级汇点连一条上界为二分值的边。若最大流不等于总人数显然就是不可的了。

  • [ ] \(uvalive3487\) 寡头的竞争

​ 题意:有两家公司都想向政府申请某些资源的使用权,并且他们都提供了一些申请列表,列表中含有申请费用和资源种类,同一家公司的申请列表之间不含有重复的资源。政府只可以完整地接受和拒绝谋一份申请列表,问政府的最大收益是多少。刚开始看到这道题的时候想着将某个申请列表向包含资源连边,每个资源向汇点连上界为\(1\)的边。申请列表满载就加入权值。但实在是想不通怎么保证使得可以完整的申请列表完整(因为一个列表权值再大,不能能满载也是空谈;权值小的可以满载反而更好)。题解运用了补图转化的思想。将互相冲突的申请连容量连上界为\(INF\)(保证不被删去)的边,超级源点向\(A\)公司连上界为权值的边,\(B\)公司向超级汇点连上界为权值的边。问题转化为最小割问题。去掉最小割后,源汇不可达,可以利用此使得两个点集(或者更多东西)不可达,即原图最小割一定使两个申请列表点集之间不可达。——太巧妙了!!其实最小割与“网络”,“流量”无关系,它本质只是让源汇不可达的前提下最小化选取的边的边权。而借助这个“源汇不可达”和“边权最小化”,我们可以通过加\(INF\)的边来转化纷繁复杂的其他问题。

  • [x] \(CF498C\)

​ 题意:给定一个长为 \(n\) 的数组,以及 \(m\) 对下标$ (a, b)$ 且满足 \(a+b\) 为奇数,每次操作可以将同一组的两个数同时除以一个公约数。求最多能进行多少次操作。为了让次数最多肯定是每次只除一个公共质因数。由于满足 \(a+b\) 为奇数(即一奇一偶),故原图可以转化成二分图,建立源点向所有下标为奇数的点的所有质因子连边,上界为个数;汇点与下标为偶数的点的所有质因子连边。对于给定的一组,将两个点拆成质因子然后在连边就可了。最后跑最大流即可。将原节点拆成若干个点真的是屡试不爽的好方法。

  • [ ] 移动干草

​ 题意:一个牧场由 \(r×c(r,c\leq 200)\) 个格子组成,牧场内有 \(n\) 条干草运输通道,连接任意两个水平或垂直相邻的方格,最大运输量为 \(Li\)。求\((1,1)\)的干草运输到\((r,c)\)的最大流量。若直接网络流,点数\(4×10^4\),边数\(8×10^4\)显然过不了。考虑优化。怎么优化呢?首先这是个平面图。即存在一种画图方法使得任意两条边不相交。那这个有什么好处呢?请看下图:

​ 在这张图中我们把一个\(3×3\)的矩阵染色成了\(4\)块。白色顶点为原图顶点。

​ 由于是平面图,所以必然可以将原图分成若干个顶点是原图顶点的块。那么这个图有什么性质呢?

​ 我们可以像上图那样把每一块看成一个点。这时有一个很重要的性质:点A到点B在新图上的任意一条路径即为原图的一条割。所以我们求s到t的最大流转化为求A到B的最短路

​ 上面把块看成点后的图叫做对偶图。将最大流转化为平面图转对偶图的最短路问题 Get √

  • 然后开始进入\(abs\)的图论刷题大全了。先做\(Easy\)的。我知道我肯定落下了很多进度。才到第五道。

  • [x] \(POJ1149\ Pigs\)

​ 题意:有 \(M(M\leq 1000)\) 个猪圈,每个猪圈里初始时有若干头猪。一开始所有猪圈都是关闭的。依次来了 \(N(N\leq 100)\) 个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪。每个顾客分别都有他能够买的数量的上限。打开的那些猪圈中的猪,都可以被任意地调换到其它开着的猪圈里,然后所有猪圈重新关上。问总共最多能卖出多少头猪。 看到这道题时有一个思路:源点向每人连上界为顾客上限的边,顾客向当前可到达的猪圈,及这些点曾经可到达的猪圈连上限为INF的边,最后每个猪圈向汇点连上界为初始猪的数量的边。思路算显然吧。可惜这样跑,每次判断“曾经可到达”需要\(M^2\)\(T\)到飞起。怎么办怎么办怎么办??注意到如果这样的思路(模拟每个人每次买猪),这个判断可以转化为另一种实现方式,即在模拟每一轮买猪时新增一层\(M\)个节点代表本次买猪的猪圈,然后无脑上下连边。这样看似无用,但实际上将需要的判断全部在图上展现,增加了优化的可能性。然后将(1)流量来源或去向完全相同的点;(2)两点间只有一条上限为INF的边且到达的那个点再无边连入 两种情况的点合并,最后重新分析建图规则,在寻求内在逻辑联系即可。

  • [x] \(POJ1637\ Sightseeing\ tour\)

​ 题意:给定一张混合图,要求给无向边定向使得原图存在欧拉回路。先任意定边,每个点多/少出来的度就必须与汇/源点连边。然后最大流。

  • [x] \(POJ3287\ Dining\)

​ 题意:有 \(F(F\leq 100)\) 种食物和 \(D(D\leq 100)\) 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料。现在有 \(N(N\leq 100)\) 头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和饮料。如果只有食物/饮料,那就是简单最大流了。增加成了两个物品怎么办呢?考虑到最大流的合法性依赖于从\(S\)\(T\)的任意一条流都代表了一个可行方案,故我们的目的就是构造使得原图的流代表可行方案。源点与饮料连,食物与汇点连,中间与牛连边就好啦。

​ 类似的还有一道题(\(SPOJ962\)):在一个无向图中,一个人要从 \(A\) 点赶往 \(B\) 点,之后再赶往 \(C\) 点,且要求中途不能多次经过同一个点。问是否存在这样的路线。如果以A为起点看,那么就必须又经过B又经过C——相当于两个汇。对于这种两个汇的问题,可以把中间的汇点\((B)\)提出来,这样就相当于只有一个源点而需要扩展两次了。 太巧妙了!!

  • 今日常规:
  • [ ] 语文:练习卷。
  • [ ] 数学:无。
  • [ ] 英语:无。
  • [ ] 物理:上网课;做练习。
  • [ ] 政治:自学第一框;做练习。
  • 常规任务的与日俱增变本加厉与竞赛任务调试及思维难度猛然骤增是当前我的主要矛盾。根本兼顾不了。痛苦。每天总有那么一段时间。桌子上摆着泛黄的笔记本,电脑闪着代码的白光,瞟一眼右上角的时间却发现已到7/8点,然后就发呆自己有一天没有完成常规任务。可能还是效率不够高吧。
6
  • 今日常规计划:

  • [ ] 语文:完成练习卷。

  • [ ] 英语:听网课;完成《Flipped》第三章。

  • [ ] 数学:做张练习卷巩固一下。

  • [ ] 物理:听课做题。

  • [ ] 政治:回过头听下网课

  • 今天主要把\(EASY\)里的题目过完了,下一步就是过中等题。

  • [x] \(ZOJ2760\ How\ Many\ Shortest\ Paths\)

​ 给定一个带权有向图 \(G=(V, E)\) 和源点 \(s\)、汇点 \(t\),问 \(s-t\) 边不相交最短路最多有几条。这道题最大的启发就是最小路图。这个图上的任意路径都是原图上两点间的最短路径。非常好的结构。

  • [x] \(SGU438\ Glorious\ Karlutka\ River\)

​ 动态流的模板题。建图恶心,有点技巧:(1)根据时间序给点分组;(2)每次新建汇点。

  • [x] \(HOJ2634\ How\ To \ Earn \ More\)

​ 题意:有 \(M\) 个项目和 \(N\) 个员工。做项目 \(i\) 可以获得 \(Ai\) 元,但是必须雇用若干个指定的员工。雇用员工 \(j\) 需要花费 \(Bj\) 元,且一旦雇用,员工 \(j\) 可以参加多个项目的开发。问经过合理的项目取舍,最多能挣多少钱。 总结一下:对于每一个项目,我们的最大获利一定是 \(A-min(A,|B|)(|B|\)表示员工支出\()\)。注意这个式子!我们要么不选择\(i\),要么就为了最优把只与\(i\)有联系的\(j\)删去。最小割模型到这就只能意会了。典型的蕴含式最大获利问题。

  • [x] \(SPOJ1693\ Coconuts\)

​ 题意:\(N(N\leq 300)\)个人投票\(0\)\(1\),每个人心中已有欲投项。给出一些朋友关系,要求设计一种投票方案,使得违背自己意愿的票数与持不同意见的朋友对数的总和最小。不要求方案。怎么看这个模型呢?要么自己换票,要么与自己意见相左的人换票——才会为答案做出贡献。也就是两个点集,要么割左边一个,要么割右边所有与之有关的点——并且已经割过的点不再割;右边同理。这就是最小割很显然的模型了。而对于这个左右源汇点的定义,由于是割左/右边一个点会造成贡献答案,故将左右源汇点定义为票的类型。那么题目就很显然了。"二选一式"经典问题。

  • 出题的话,思路还没定好。毕竟最近看的都是\(EASY\),等看几道\(HARD\)再出吧。

  • 抓紧复习生物吧。一如既往地绝望。悲伤。

7

流浪的人啊,流浪的人啊,

走遍天涯海角何以为家?

​ —— 澳大利亚民歌

  • 今日常规计划

  • [ ] 语文:背诵古诗词;完成练习卷。

  • [ ] 数学:进入概率章节。

  • [ ] 英语:完成《Flipped》;听网课。

  • [ ] 物理:听网课;做作业。

  • [ ] 生物:完成有丝分裂必刷题。

  • 挑战省选题!!

  • [x] \(P3163\) 危桥

​ 题意:给定一张图,有些特殊边只能经过\(2\)次。\(A\)要从\(A_s\)\(A_t\)往返\(A_n\)次,\(B\)要从\(B_s\)\(B_t\)往返\(B_n\)次。问能不能同时满足。将往返看成是顺着走两次 是个很常用的技巧了。然后因为没限制一次往返时边不能重复经过,所以可以把顺着走的次数和特殊边经过次数都除以\(2\)。于是这个题看上去就显然了,可以从源点向\(A_s\)连容量为\(A_n\)的边,向\(B_s\)连容量\(B_n\)的边,汇点同理;然后特殊边连容量为\(1\)的边,其余\(INF\),边都是双向边;最后判断下最大流。但这样是不行的!!有两个问题:(1)因为\(A_s\)中的流量流到了\(B_t\)中,\(B_s\)中的流量流到了\(A_t\)中时,有可能也满足条件。当全图存在多个流量流入点多个流量流出点,且答案为用最大流判存在性时要注意流量交叉的情况。(2)特殊边只能走一次,而正反各经过一次就\(GG\)了。怎么解决呢?交换\(B_s\)\(B_t\)再跑一遍,如果两次都满流,就是可行的。why?假设交叉的流量为\(x\),那么\(A_s\)\(A_t\)存在\(A_n-x\)的流量,\(B_s\)\(B_t\)存在\(B_n-x\)的流量。如果交换以后依旧满流,\(A_s\)\(A_t\)的流量可以不变,那么\(A_s\)\(B_s\)也存在\(x\)的流量。既然\(A_s\)\(B_t\)存在\(x\)流量,\(A_s\)\(B_s\)也存在x流量,那么经过\(A_s\)\(B_s\)\(B_t\)就也有了\(x\)流量(无向图流量可逆)。再加上之前的\(B_n-x\),也就满足条件了。\(A\)同理,故问题(1)得解。至于问题(2),如果之前经过是一正一反,那么反着跑就都是一个方向,会受到限制了。当图为无向图且某条边至多经过一次时,可能会正反经过两次。这时可以反着跑一遍。

  • [x] \(P4043\) 支线剧情

​ 有源无汇带上下界最小费用可行流。原来省选也考板子题。名字十几个字的板子

  • [x] \(P4313\) 文理分科

​ 题意:一个班级的座位表可以用一个\(N×M\)的矩阵表示。如果第\(i\)行第\(j\)列的学生选文,则满足感增加\(A(i,j)\),否则增加\(B(i,j)\);如果选文的同学身边的人选文,则满足感再增加\(C(i,j)\);选理的如此则增加\(D(i,j)\)。应该算是“蕴含式”和“二选一式”的综合吧。一方面自己选文/理,必割一个——二选一式;另一方面,将都选文/理单独提出来做个节点,与所有相关节点连边——蕴含式。本质还是要分析每种情况下,这个情况流必须要满足哪些情况割(注意用的是情况!并一定是一个节点!) 想题目想清楚——一定想清楚再下手。

  • 题目出完了。直接搬了一道原题。数据难出,主要是由于是可行性问题,限制的多了就全是“NO”,少了就全是“YES”,要一步一步逼近那个既有“No”也有“Yes”的数值。 \(url\rightarrow\) Danger 。
  • 常规...没动一点,只上了网课。
8

苟活者在淡红的血色中,会依稀看见微茫的希望;真的猛士,将更奋然而前行。

​ ——鲁迅

没有梦,没有感觉,人生最原始的睡,同时也是死的样品。

​ ——钱钟书

  • 今天学习了许多新知识。非常灵活知识。要多加揣摩。
  • 虽然题目不多,但收获还是挺大的。首先是一道以网格为基础的题目。
  • [x] \(P5038\) 奇怪的游戏

​ 题意:给定一个\(N×M\)的棋盘中,每个格子上面有个数。每次可以选相邻的两个数,将它们全部\(+1\)。问能否实现格子上的所有数字变成相同的数。并且最小化添加次数。看到这个题的时候没有任何思路。后来看了题解里的这样一段话:选择两个相邻的格子应该发散到二分染色 。本题就是这样。先二分染色,记黑框中数的总和为\(B\),个数为\(B_n\),白框中数的总和为\(W\),个数为\(W_n\)。那么假设最后的最大值为\(x\),则有\(x×B_n-B==x×W_n-W\)(操作次数守恒(雾 于是好像可以把\(x\)解出来?且慢!当\(B_n==W_n,B==W\)时,\(x\)是解不出来的。但这时候\(N、M\)必有一偶,故若\(x\)可以,则\(x+1\)肯定也可以——具有单调性了!!整理一下思路,大致就是这样:

​ (1)\(N×M\)为奇数时,直接用式子算出\(x\),再用最大流验证。

​ (2)否则,二分答案\(x\),再用最大流验证。

​ (3)最大流验证方法:定义一单位流量表示一次操作。源点向每个奇点连上界为\(x-v[i][j]\)的边,奇点向周围白点连上界为INF的边,偶点在向汇点连边。即可。

​ 本题最大的启示就是收获了许多格子中有数字的问题的技巧。比如:可以分成总格点数为奇/偶数两种情况分类讨论;要善于利用代数关系列式子;判断答案是否具有单调性 等等。

  • 做了两道用网络流跑最短点路径覆盖的变式问题。一开始不知道这个板子,两个题都想了很久。但也正是因为想了很久,之后接受这个板子的时候对症下药,理解的更加深入了。

  • [x] \(P2469\) 星际竞速

​ 题意:\(N\)个星球\(M\)条带权边,每条边只能从编号小的到大的。要求经过所有点一次。同时可以瞬移,从任意点瞬移到第\(i\)点代价为\(A_i\)。求花费比赛的最少时间。最开始我的想法是从源点向每个点连一条上界为\(INF\)费用为\(A_i\)的边,然后节点之间连边,最后节点再想汇点连一条上界为\(INF\)费用为\(0\)的边。但这样做有个致命缺陷:当一个流从源点流向节点\(1\)时,其完全可以继续流向\(2\),而不能直接流向汇点,再引一条流流向\(2\)。然后这个想法就宣告流产了。标准做法是最小路径覆盖,将每个点拆为入点和出点,源点向出点连上界为\(1\)费用为\(A_i\)的边,向入点连上界为\(1\)费用为\(0\)的边出点向汇点连上界为\(1\)费用为\(0\)的边,原图上的每条边由入点向出点连上界为\(1\)费用为边权的边。巧妙之处在于出入点分开,标准做法中允许每个点都从起始费用为\(0\)的条件下出发去到达其他点,本质上是把“经过”这个点与”最终到达“这个点两种情况分开考虑了 如果只是经过这个点,那么其实到达它的费用我们之前已经算过了,故可以为\(0\)。而由于每个点只可”经过“一次,故源点向入点连的边上界为\(1\)。不得不说这种思路实在是太巧妙了!!

  • [x] \(P4542\) 营救皮卡丘

​ 题意:\(N\)个点,\(M\)条边,一共有\(K\)个人。每个人可以在边上移动,可分头行动。要想摧毁第\(i\)号点,必须先摧毁前\(i-1\)个点。人经过点就能瞬间摧毁点,并且可以经过被摧毁的点。在摧毁\(i-1\)点以前,\(i\)点无法经过。求摧毁所有点,所有人走的总路径长度最小值。Floyd判可行的最短路。然后就如上题了。

  • 今天重点搞了下常规吧。把这周的英语/物理/数学网课给听完了。还欠《Flipped》大约\(10\)章,语文网课\(4、5\)节,政治网课\(1\)节。下周开始自学生物化学了。明天开始要制定计划了——相当于老师的教案吧。不然第一次月考真的可能考的都不会了。
  • 之前出的题目锅了。已修正。感谢\(yxt\)为我验题。
9

当我沉默着的时候,我觉得充实;我将开口,同时感到空虚。
——鲁迅

  • 今天又有大进步吧。虽然是以晚上本应做常规而去搞竞赛为代价的。
  • [x] \(P2053\) 修车

​ 题意:\(N\)个人送来\(N(N\leq 60)\)辆车,修理厂有\(M(M\leq 9)\)个工人,每个工人修每辆车都有不同的时间,要求合理安排修车顺序,使得所有人的等待时间总和最小。转化问题:实际上就是给先修的车增加了权重,某个工人\(i\)倒数第\(x\)个修的车是\(j\)就会增加\(x*w[i][j]\)的贡献。所以把每个工人拆成\(N\)个点,依次向所有车连边,容量为\(1\),费用为\(x*w[i][j]\),即可。

  • [x] \(P2050\) 美食节

​ 题意:与上题一致,但数据范围\(N\leq 800\)\(M\leq 100\),向上题那样暴力连边必然\(MLE+TLE\)。观察可以发现,当某个人目前还没有修倒数第\(x\)个车的时候,倒数第\(x+1\)个车是不必加进来的,因为既然是最小费用就肯定会选择倒数倒数\(x\)个车。所以记录下每个节点代表的是第几个人修到了第几个车,动态加边就好啦。

  • [x] \(P4177\ order\)

​ 题意:有 \(N(N\leq 1200)\) 个工作,\(M(M\leq 1200)\) 种机器,每种机器可以或者买。每个工作包括若干道工序及一些收益,每道工序需要某种机器来完成。租的机器只能服务于当前工作。你需要最大化利益。看完题目就想到了蕴含式最小割。但这里多了个。我考虑这个题目是倒着想的——如果我买了这个机器,就一定不需要租它。即如果代表买的边被我割了,那么代表租的边一定没被我割掉。然后就想到把原来工作向机器连的容量为\(INF\)的边改为租的价格。然后就\(A\)了。

  • [x] \(UOJ77\ A+B\ Problem\)

​ 题意:从前有个 \(N(N\leq 5000)\) 个方格排成一行。给这些方格染色。每个方格上有 \(6\) 个属性:\(a_i\ ,\ b_i\ ,\ w_i\ ,\ l_i\ ,\ r_i\ ,\ p_i\)。如果方格 \(i\) 染成黑色就会获得 \(b_i\) 的好看度。如果方格 \(i\) 染成白色就会获得 \(w_i\) 的好看度。但是如果方格 \(i\) 是黑色,并且存在一个 \(j\) 使得\(1\leq j\(l_i\leq a_j\leq r_i\) 且方格 \(j\) 为白色,那么好看度就会减去 \(p_i\)。我看完题目想到了拿到文理分科的题目。因为减去\(p_i\)的条件与\(w_i,b_i\)无关(注意:这是我之前的思路),于是我就对每个点新建节点 \(i'\),连边\(i'\rightarrow_{p_i} t\)\(j\rightarrow_{INF} i'\)\(t\)表示黑色点)。想出思路后我并没有立即码,而是造了一组数据,然后就发现了自己思路的问题:当\(i\rightarrow t\)被割掉时,\(i'\rightarrow t\)事实上也已经没了。发现可以通过将 \(i'\rightarrow_{p_i} t\) 改连为\(i'\rightarrow_{p_i} i\)来解决这个问题——当该边被断时,不会影响到\(i\)点,而当\(i\)\(t\)的边被割时,这条边势必也到达不了\(t\)点。我就顺利想出了正解。写完提交,60\(pts\)!!why?此题边数极限\(N^2\),暴力连边必然\(MLE+TLE\)。只能数据结构优化建边,考虑到对\(i\)有影响的\(j\)满足的实际上是一个类似二维偏序的东西。于是将\(a、l、r\)离散化后,因为是权值上的大小关系,建立一棵权值线段树。又因为强制只能向编号小的点连边,并且整棵线段树要在最后面统一用,所以不能让前面加进来的点底下连的权值区间内还含有后面加进来的点,故套上可持久化。线段树优化的思想的确是第一次接触。其实线段树优化建图的本质就是建立一些虚拟节点(整棵线段树),连上某个虚拟节点所代表的一个区间,就代表连上了这个区间里的所有的节点。 故修改时父亲节点向子节点连边,叶子节点向当前节点连边;查询时该点向区间的代表点连边。貌似这样优化建图是有一定局限性的,但暂时还没有彻底弄懂。明天再深入研究一下。

  • 为什么我觉得今天收获大呢?首先自然是初步学会了数据结构优化建图。并且,今天做的两道最小割的题目我都是自己推导,反复修正,未看题解得出建图方法的。这种感觉太好了。以后更要多做难题,只有做难题才能真正拓展人的思维!!!
  • 常规方面的话,听了\(3\)节数学课,\(1\)节物理,\(1\)节英语。效率还不够高吧,毕竟生物化学......哎,不想搞。
10

既然无处可逃,不如喜悦。既然没有净土,不如静心。既然没有如愿,不如释然。

​ ——丰子恺

  • 总结一下,今天常规学习出现了诸多问题。首先听生物课一定要直接把笔记做到笔记本上,不然根本抄不赢;问题的时候直接打电话给任课老师,不要犹豫,在QQ上问题就是浪费时间。
  • \(20\)点开始搞竞赛。开始刷网络流\(24\)题了。做了\(3\)道比较基础的题目。\(3\)道题目都独立一遍\(A\)了。
  • [x] \(P3254\) 圆桌问题
  • [x] \(P2763\) 试题库问题
  • [x] \(P2764\) 最小路径覆盖问题
16

多少长夜寻着光,披星戴月也无憾。为了心中理想怀揣期盼。

无论世界变化或快或慢,人总要勇敢。过几番寒暑不愿留遗憾。

更有,劈山涉水,壮志慨慷,谁舞长龙赢得鼓掌。

神州浩荡,江河泱泱。我辈少年,意气方刚。

​ —— 共青团中央

  • 做了一道考试题。推了大概\(10min\)吧。

  • [x] \(T125181\) 小行星\((ast)\)

​ 题意:给定\(N(N\leq 10^4)\)个点,每个点有\(\)三个关键字。每次可以选定任一关键字,并选择一个值,将关键字为该值的点全部删去。问最少删几次。二维的很好想,横纵连\(INF\)边,源点向所有横边
连容量为\(1\)的边,所有纵边向汇点连容量为\(1\)的边。然后跑最小割。三维的怎么搞呢?考虑到二维做法的本质:每割一次就相当于把某关键字为该值的点全部删去。所以我们需要什么呢?我们需要当割掉一条边后,所有与该点有关的边都不会被再割。那么我们可以对第三维开两个点,两个点之间只连一条容量为\(1\)的边。

17

I had to fall.To lose it all.But one thing I don't know why.It doesn't even matter how hard you try.

​ ——Linkin Park

  • 今天数学课没跟上。化学课也有很多问题。花了很多时间问人,但最后是一些化学竞赛知识。网课学习学的不够深入,导致整个人学习完后像仅仅在冰上划过对冰下世界一无所知一样难受。虽然可以完成作业,但不知道为什么总感觉学得很难受,没有完全掌握的那种难受。完成作业的时间也偏长。数学刚学三角函数,还是多巩固吧。不然懵。
18
  • 今天难得比较快的完成了常规。
  • 数学实在是受不了跟不上的感觉了,于是刷了几版必刷题。刷完题目感觉好多了,诱导公式不是死记,而是数形结合用的。但今天又有新的烦恼。老师上课讲“这个是奇函数,那个是偶函数,所以它们......后是奇/偶函数”就像显然一样,而我实在是不能理解。得再专门地预习一下函数性质了。
  • 竞赛方面今天尝试做刘振西的题目。尝试了数个思路,但是都失败了,而且也不会改进。但由于题目本身看上去不难,所以还是决定自己再想想再问他。目前有一个比较复杂但应该正确的想法,但实现复杂,明天再码。晚上和文尔玉讨论了一下小行星那个题,发现正解思路是有漏洞的。中间是不能直接拆成两个点的,会导致本不应该连通的\(x\)\(z\)之间有流量。思考良久我们都没有想法了。也就是之前归纳的两点可以合并的条件是并不被满足的。
  • 或许是常说的一句话:“上帝给你关上了一扇门,也为你打开了一扇窗”吧。
  • 入坑《青物》。停止阴阳怪气。停止揣测他人。停止冷嘲热讽。这些都是受社会环境人际交往的羁绊吧,但真正强大的人又有几人受这个羁绊呢。弱者的借口罢了。曾经小学时人人笑着喊的那些口号,有几人知道份量呢,说辞是说辞,行为是行为,思维层次还不允许你联系起来。现在没人喊了,但某些东西真的已经嵌入到社会骨肉里了,认得清本质也知道份量,却丧失了那份小学时所自以为有的同情与善心。我恨我自己。我希望你能改变。我希望明年此时你再看你自己,你能真正清楚你说的每句话,没有话中话。这才是交换真心所必需的啊。
19
  • 今天大致\(22:00\)开始竞赛的吧。本打算写两个题,后来只做了一道,还一道会做但\(WA\)了。哎。
  • [x] \(T125177\ boom\)

​ 题意:农场主在农场设置了降雨警报,以提醒奶牛躲雨。农场有 \(F(F\leq 200)\) 块草地,这些草地之间有 \(P(P\leq 1500)\) 条路相连,这些路可以容纳任意头奶牛。有些草地上有避雨点,奶牛们可以在此避雨。避雨点的容量是有限的。计算警报至少需要提前多少时间拉响,以保证所有的奶牛都能到达一个避雨点。做法:最开始想往费用流上靠,遇到的最大的问题就是一条边的流量不好设置,按照题意是需要 \(INF\)\(0\) 费用边的,但这显然不可行——大概抽象出来就是:如何在网络流中体现出一个带权无向图每条边只有第一次经过需要费用的最小流。(貌似这样说出来可以将边权取反再跑诶 ——||) 最后还是跪倒在了二分大法下,先求出任意两点之间的最小值,利用此建二分图,再二分建图跑最大流就可以了。原来要求最值的问题,不一定要用费用流跑,也可以二分+最大流判定来做、

  • [x] \(T125387\ bri\)

​ 平面图转对偶图再跑最短路。

  • 具体的做题思路我明天做完一起总结。感觉大家选的题真的都很经典呢。
20
  • 今天突然就很想寒假结束。也不知道为什么控制不住情绪了。调整了一下也好了。
  • 这几天语数外的感觉都在回升,物化生可能是内容简单也感觉还可以。就怕是自己实际上掌握不够,还没发现问题所在。哎,没时间刷题的学习经验,也是一种体验吧。虽然知道搞竞赛就不能再像以前那样抱着一本《必刷题》不停做来巩固了,但......自己的学习方法在这个混乱的寒假还是没有实现大改呢。希望自己能尝试改变吧,争取不再靠刷题来巩固知识。
  • 今昨两天做的题目总结在上面了。
22
  • 今天还是有些难受吧。DP还是跟不上来啊。
  • [x] \(P1251\) 餐巾计划问题 & \(P2917\) \(ToysG\)

​ 题意:\(Bessi\)计划用 \(n(n\leq 10^5)\) 天来庆祝生日。第 \(i\) 天需要 \(t_i\) 个玩具。每天可以花费 \(C\) 元购买一个玩具,也可以将当天的玩具送去洗并再次使用。洗有两个方案:可以等待 \(N_1\) 天 花费\(C_1\)元; 也可以等待\(N_2\)天用\(C_2\)元。问满足 \(n\) 天的最小花费。首先当\(n\leq 2000\)时可以直接上拆点加网络流,比较简单,也是我最开始的想法。但是我网络流的连边不够巧妙,这里的网络流可以在拆后的点,同一类别的点顺序连边,代表将今天未洗的玩具留到明天洗。正解是三分+贪心。先设\(f(x)\)表示总共购买x个新玩具的,其余全部洗的最小费用。洗的花费设为g(x),则\(f(x)=g(x)+C*x\)\(ans\)为最优情况下的 \(x\) 值。由于玩具越少,我们就越需要快洗;而多的一部分的玩具可能就可以慢洗,所以当\(x\leq ans\)时存在\(g(x-1)-g(x)>=g(x)-g(x+1)\),所以\(f(x)-f(x-1)\leq f(x+1)-f(x)\)函数斜率单增。而当\(x>=ans\)时,表明买的玩具已经多了,越买越亏(口糊模式上线)。得出是个单峰函数,就可以考虑三分。当购买的玩具为定值时,若此时之前剩余未洗的玩具\(A\),如果可以用慢洗,肯定直接慢洗;否则快洗(这里假定慢洗费用低于快洗费用)。因为模式只有两种,不慢洗就必定快洗,而对当前玩具而言,目前的影响属性只有某次洗的起始时间一个,而快洗和慢洗并不改变之,所以直接拣费用更低的。当费用相同时,越远的玩具在之后越可能可以慢洗,所以优先选择时间近的。于是就做完了。这个题目实在是精彩。一方面,证明函数斜率单增来证明单峰以前没接触过;另一方面,通过确定某一特性,使问题简化后可以贪心处理以前也常局限于确定答案,俗称二分答案。当问题设定有多个选项时,可以从全局出发去设定某些特性,来达到约束选项的目的。

  • [x] \(P3065\ FirstG\)

​ 题意:给定\(N(N\leq 3×10^4)\)个字符串,可以任意设定字符之间的字典序关系,问哪些字符串可以通过设定,成为所有字符串中字典序最小的。一开始只考虑网络流,但发现关系太复杂,实在不会做。正解太巧妙了【掌声】。首先对所有字符串建立一株 \(Trie\) 树。\(x\)字典序最小就意味着沿着\(x\)一路往下走,每一层的字母中都是\(x\)最大。于是就很显然了,连边判环处理冲突即可。

  • [x] \(P2900\ Land\ Acquisition\ G\)

​ 题意:给定\(N(N\leq 5×10^4)\)个点。每个点有双权值\(\),要求给这 \(N\) 个点分组,最小化每个组的\(Maxw×Maxh\)的总和。做的时候没什么思路,只觉得可能可以先排序确定一维,然后逆推,类似二分+贪心的确定好每组的第二维。但终究还是不可行。\(DP\)我也想了,但觉得这个可以任意组合,状压也太暴力了吧,就放弃了。正解是\(DP\),所以想重点谈谈如何解决“任意组合”这个问题的。首先,若点\(x\)的二维均完全大于等于点\(y\),那么显然没有必要选点\(y\)。于是先把所有点按\(w_i\)为第一关键字从小往大排序,按\(h_i\)为第二关键字从小往大排序,再删去必须删的点。此时,\(w_i\)单调递增,\(h_i\)单调递减,剩余的小组必然都是连续的一段。太巧妙了!!重点是把两个单调性处理出来了。真的 \(Orz\)

  • 被《青猪》虐哭了。人终归还是一个人格啊。肉体覆灭固然可怕,肉体长存,人格覆灭才恐怖啊。我不知道科技会不会发展到操控人格的地步。但望着一个熟悉的声音却听着陌生的语调必然是一件可悲的事情吧。单元我不会活到那个时候。

小声:量子力学好厉害!!

24
  • 昨天19:00就睡着了。倒床就睡。
  • 这几天有点不想写总结了。剩下的题目都不是很会,问同学时间总不能凑在一起;跟wey讲好了他有时间教我,结果现在22:46他依然没时间;wyx回消息一般都到了凌晨两点;zmc回话也到了23:00了。讲真,常规我也感觉挺吃力的,搞完常规看到昨天的题目今天依然不会又非常厌恶自己效率的低下。可能我还是更适合一段时间内学习单一的东西吧,并且适合那种有教程的学习,这样无论是对心态抑或是效率都有提高。
  • 但目前不能改变啊。人们常说“当你不能改变环境时,就改变你自己”。我也曾满怀信心的这么想,但改变自己又岂是那么容易的呢。每天都会在看上去无止境的作业上消耗自己的身心,每次都身心俱疲的凌晨学习的话,又怎么能取得学习的主观性呢。为什么自己在学校里至少处理常规作业游刃有余但到了家里就有点失败了呢。现在我才明白,原来学校的生活是真正的高强度。在家里,我至少没有做到7:30吃完早饭到达教室开始早读,没有做到12:50准时午休;没有做到12点钟准时上床睡觉。老师发下来的课表,语文课/历史课/地理课40分钟,但我实际每次至少1个小时。我还是没有做到老师的要求,老师的效率。
  • 但我还是去想,去想刚开学时每天少1节晚自习的情况下自信地做常规;还是去想停课一周地情况下自信地做常规;还是去想连补30版化学必刷题的那个晚上;还是去想那个打出平衡树的凌晨;想到那个打出支配树的凌晨。期末前和同学说:”搞竞赛就感觉一直在挑战自己。先是停晚自习了;再是停课;大概就是看你的常规能坚持到什么强度“。本是一句玩笑话,现在却感到记忆犹新。是啊,我现在承受不了了吗?我做到最好了吗?我想并非如此吧。虽然有点中二,但我还是不愿放下刀枪剑马,还是不愿告诉自己这就是极限。既然有人能做到,既然你之前可以,你现在也一定可以。
  • 今天没有写题,连补了3节地理课。对不起。
25
  • 进入数学专题了。
  • [x] \(T126431\)\(Y\)的绝对战争

​ 题意:给定 \(N(N\leq 10^6)\) 个数,可以在任意两个不连通的点中间连边,费用为\(GCD(u,v)\)。点权\(\leq10^6\)。问最大费用的方案。最明显的作法是 \(N^2\) 连边然后最大生成树。然后我一直在想如何用堆/并查集等优化每次找最大值过程,但都没有在复杂度上取得本质突破。正解是对值域下手了。每次枚举最大权值,再翻倍,用并查集看看任意倍数之间是否连边。复杂度\(\mathcal{O} (VlnV)(V\)是值域大小\()\)

  • [x] \(P1072\ Hankson\) 的趣味题

​ 题意:给定 \(T(T\leq 2000)\) 组数据,每组形式为 \((A,B,C,D\leq 2×10^9)\) ,求有多少个 \(E\) 满足 \(GCD(E,A)=B,LCM(E,C)=D\)。大概就是把四个数都质因数拆分,对于同一个质因数 \(i\) ,也就是得满足\(Max(A_i,E_i)=B_i,Min(C_i,E_i)=D_i\) 。但这样复杂度大约是 \(\mathcal{O} (T\sqrt{V})\),可以先预处理出\(\sqrt{V}\)以内的素数,复杂度降至\(\mathcal{O} (T\sqrt{V}/ln\sqrt{V})\)。快了\(10\)级倍吧。

26

Now the day bleeds into nightfall And you're not here to get me through it all.
—— 《Someone you loved》

  • 三项纪律八大注意。个人做出路线上的调整都茫然,想必遵义会议时的红军更难吧。
  • 今天做了两道题,一道题放在昨天记录了。
  • [x] \(T126545\)\(Y\) 的智力游戏

​ 题意:给定一个整数 \(N(N\leq3×10^6)\)\([1,n]\)中任选一些数,满足乘积为完全平方数的前提下最大化乘积。最开始的想法是每个数质因数拆分,然后贪心从后往前凑。这样既不能证明贪心正确性,时间复杂度也过不去。正解是统计每个质因数的个数,个数为偶数再直接快速幂,奇数就减一再快速幂。一开始不能理解,后来稍一思索,偶数的时候自然把包含该质因数的所有数相乘,奇数时留一个等价于不乘这个数,这样一定不会对其余的质因数造成影响。且由于奇数个质因数我们必须得放弃一个,故此方案定为最优。太巧妙了啊啊啊啊啊啊。

  • 搭建博客的事情可能放在明天了吧。(说实话我现在挺怀念这本小日记的)
27
  • 终于迎来了一个任务没那么重的周末(笑
  • 今天做了七道题。都是数学题,有几题还是很有启发意义的。
  • [x] \(T126546\) 傻牛的递推数列

​ 题意:设 \({F_n}\) 表示斐波那契数列。给定 \(T(T\leq 2×10^3)\)\(x(x\leq 10^6)\),对于每个 \(x\) 问有多少个 \(i\) 满足 \(F_i|F_x\),求\(\sum i\)。(注:以下过程默认\(x>2\))首先斐波那契数列有个性质:\(F_x=F_nF_{x-n+1}+F_{n-1}F_{x-n}\)。证明的话可以通过递推式不断展开来得到式子。又\(GCD(F_n,F_n-1)=1\),所以满足 \(F_n|F_x\) 的充要条件是 \(F_{x-n}|F_n\),不断减下去则必然有 \(n|x\)。所以问题转化为给定 \(x\),求 \(\sum_{i=1}^{i|x} i\)。好了,可以通过枚举每一个数的每一个倍数来 \(\mathcal{O} (NlogN)\)预处理了。

  • [x] \(T126548\) 傻牛的数字游戏
  • [x] \(T126549\) 傻牛的约数研究

​ 题意:设 \(F_n\) 表示 \(n(n\leq 10^6)\) 的因数个数。求 \(\sum_{i=1}^{n}F_i\)。显然这些因数必然 \(\leq n\)。考虑换个角度思考,设\(G_i\)表示 \([1,n]\) 中因数中有 \(i\) 的数的个数,则原问题转化为\(\sum_{i=1}^{n}G_i=\sum_{i=1}^{n}{\lfloor \frac{n}{i} \rfloor}\)

  • [x] \(T126550\ Index1\)

​ 题意:给 $ N(N,M\leq 10^6) $ 个男生 \(M\) 个女生排队,第一个人必须是女生\(A\),最后一个人必须是男生,任意两个女生不能相邻,求方案数。经典的插板问题,注意乘\(N!\)\(Ans=C_{N-1}^{M-1}×N!×(M-1)!\)

  • [ ] \(T126551\ Index2\)

​ 题意:给定 \(A,B,C,D,E\),求最小的 \(t\) 满足\((B+C×t)\equiv (D+E×t) (mod\ A)\)。原题 \(A\leq 10^6\) 可以直接暴力枚举。正解是扩展欧几里得,然而我不会。所以先不打勾了

  • [x] \(T126564\) 余数求和

​ 题意:求\(\sum_{i=1}^{n}{k\%i}\)。将原式展开\(\sum_{i=1}^{n}{k-\lfloor \frac{k}{i} \rfloor×i}=n×k-\sum_{i=1}^{n}\lfloor \frac{k}{i} \rfloor×i\)。而\(\lfloor \frac{k}{i} \rfloor\)\(\sqrt{k}\)级别的,所以可以乘法结合律然后快乐求和了。第一次做的时候,尽管我没有推出来式子,但也找规律发现枚举\(\lfloor \frac{k}{i} \rfloor\)是最后的关键。然而如何求所有的\(\lfloor \frac{k}{i} \rfloor\)困扰了我好久,最后还是想出来了,是真的简单呜呜呜,不知道我为什么想那么久。小于等于\(\sqrt{k}\) 的数直接暴力求解,大于的其\(\lfloor \frac{k}{i} \rfloor\)则必然恰好覆盖 \([1,\sqrt{k}]\) ,所以就很显然了 【摊手】。但是把取模运算展开写再进行化简是很实用的一步,还是希望自己能记住

  • [x] \(T126570\) 年级排名

​ 题意:给定 \(N(N\leq 5×10^3)\) 个人,两个人的排名可重复,问排名方案数。若不可重复,方案数就是 \(N!\),但是可重复,问题就复杂了一点。最开始我想的是把一/二/三/.../N个人重复的方案分别算出来再累加,结果发现同样是四个人重复,可能这四个人重复的是不同的,然后就放弃了。正解是DP。将当前的情况拆分成已经有 \(i\) 个人互相重复的情况,剩下的人的方案则由之前的求解已推出。即\(F_n=\sum_{i=1}^{n}F[n-i]×C_{n}^{i}\)。看完题解我只感觉太巧妙了,但又有种虚的感觉,就是自己好像从没有这类的想法。加油啊!争取在这类用DP思路考虑数学问题的题目上有所突破。

  • 今天收获还是挺大的。
29
  • 今天继续数学专题。
  • [x] \(P2155\) 沙拉公主的困惑

​ 题意:求 \([1,n!]\) 中与 \(m!\) 互质的数的个数 \((m,n\leq 10^7)\)。数据共 \(T(T\leq 10^4)\) 组。看到这个题目时没有任何想法。正解很巧妙。先预处理出 \([1,m]\) 中的所有质数,那么也就是要求 \([1,n!]\) 中与这些数都互质的数的个数。因为这些数都是质数,所以 \([1,n!]\) 中与 \(p_i\) 不互质的数就有 \(\frac{n!}{p_i}\) 个,与 \(p_i\) 互质的数就有 \(n!×(1-\frac{1}{p_i})\) 个。依此类推,\(Ans=n!\prod_{i=1}^{k}{\frac{p_i-1}{p_i}}\) 。所以预处理阶乘和上下两个连乘就好了。困扰我的问题是为什么不用容斥。这个与它只用质数去筛是有联系的。假设 $GCD(a,b)=1 $,则 \(GCD(a,c)=1\)\(GCD(b,c)=1\) 是独立事件,所以可以直接相乘。

  • [x] \(T126557\) 我的疯狂被屠

​ 题意:设 \({F_n}\) 为斐波那契数列,求 \(\sum_{i=1}^{n} F_i^2 (n\leq 10^{15})\) 。矩阵乘法,同时记录 \(S_x=\sum_{i=1}^{x}F_i^2\ ,\ F_x^2\ ,\ F_{x-1}^2\ ,\ F_x×F_{x-1}\) 然后递推即可。具体的第四项可以用\(F_x×F_{x-1}=F_{x-1}^2+F_{x-1}×F_{x-2}\)递推。最重要的就是敢展开,式子没看出来方法时就逐项观察,大胆用递推/通项公式展开它!

  • [x] \(T126558\) 我的数字选取

​ 题意:给定 \(N,M,L,R(N\leq 15,L\(N\) 个数 \(a_1,a_2,...a_N\) ,求 \([L,R]\) 中可以被 \(M\) 整除且不能被任意 \(a_i\) 整除的数的个数。倍数个数——直接除然后向下取整即可。最后要做个容斥。

  • [x] \(T126569\) 最简分数

​ 欧拉函数模板题。

欧拉函数
  • [ ] 定义:欧拉函数 \(\phi(x)\) 表示小于等于 \(x\) 的与 \(x\) 互质的数的个数。 \(\phi(1)=1\)
  • [ ] 通项公式:\(\phi(x)=x×\prod_{i=1}^{k}({1-\frac{1}{p_i})}\)\(p_i\) 表示 \(x\) 的质因数。
  • [ ] 性质(一二可带入通项公式可证明):

​ (1)若 \(p\) 是质数, \(x=p^k\) ,则 \(\phi(x)=p^k-p^{k-1}\)

​ (2)积性函数:令 \(GCD(x,y)=1\) , 则 \(\phi(x×y)=\phi(x)×\phi(y)\)

​ (3)\(\sum_{i|n}\phi(i)=n\)

  • [ ] 求解方法:欧拉线性筛。
for(int i=2;i\leq n;++i){
	if(!ok[i]) pri[++num]=i,e[i]=i-1;
	for(int j=1;j\leq num&&i*pri[j]\leq n;++j){
		ok[i*pri[j]]=1;
		if(i%pri[j]) e[i*pri[j]]=e[i]*e[pri[j]];
		else{e[i*pri[j]]=e[i]*pri[j];break;}
	}
}
  • 总的来说还是很开心的吧。

Apr.

2
  • 导数、向量、置换、极坐标、生成函数、微积分......该来的总是会来的。加油。

  • 拿导数开刀了......感觉还不错,挺有意思的。

  • 做了联赛数学基础 \(3\) 道题。

  • [x] \(T126571\) 字母排序

  • [x] \(T126568\) 完全平方数

  • [x] \(P1445\) 樱花

​ 题意:已知\(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\) 。给定 \(n(n\leq 10^6)\) ,求有多少组正整数 \(\) 满足方程。正解是不断变形。首先由 \(\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\) 可知 \(xn!+yn!-xy=0\) ,故 \((n!)^2=(n!-x)(n!-y)\) 此时,每次找到两个 \(a,b\) 满足 \(a*b=(n!)^2\) 就等同于找到了一组解。问题转化为了 \((n!)^2\) 的因数个数,这就很方便了。

  • 记博客咯。打算把学的数学知识都用博客整理。首先是排列组合、卡特兰数、斯特林数及生成函数之类的。
3
  • [x] \(T126560\) 巨胖的技能组合
4
  • [x] \(T126561\) 巨胖的辗转相除
  • [x] $ T126563$ 巨胖的最大约数
  • [x] \(T127713\) 组合数学8题

​ 博客地址

  • [x] \(P3389\) 高斯消元法

​ 题意:高斯消元模板题。总是听高斯消元但觉得难一直没有去学,其实感觉还OK。大概就是每次找一行,把主元系数化为 \(1\) ,同时利用这一行消去其他行的所有当前主元,就可以了。贴下代码(貌似我直接学的就是高斯-约旦消元法)。小优化是拿系数最大的开刀,据说这样能优化精度。

void GJ(){
	for(int i=1;i\leq n;++i){ //枚举主元
		int Max=i;
		for(int j=i+1;j\leq n;++j)
			if(fabs(a[j][i])>fabs(a[Max][i])) Max=j;//每次拿系数最大的开刀-优化精度
		if(fabs(a[Max][i])
5

''\(Blood,sweat,tears,gonna\ make\ me\ a\ believer.\)''

  • 今天考试。又是认清现实的一天 【哭泣】。
  • [x] \(T1\ Lucky\ 7\)

​ 题意:给定 \(10\) 个数 \(A_0-A_9\)\(A_i\) 表示 \(i\) 能用几次。组合出来的数不能有前导零,求能组合出多少个数。

  • [ ] \(T2\ treature\)
  • [ ] \(T3\ card\)
  • 三道题都很难的说。T1有个生成函数的思路但不会FFT,T3没思路,T2没往动态规划的思路去想,以为是个贪心。Orz 。学海无涯,任重道远。感觉T3是个对计数问题非常好的题,有时间一定要消化。
10

"当没有人教你的时候,你就学会学习了。"

​ —— \(ysuperman\)

  • 今天考试,省选模拟赛。
  • [x] \(T1\ mob\)(原题 \(P5300\) 与或和)

​ 题意:给定一个 \(N*N(N\leq 10^3)\) 的矩阵,矩阵的每个格子里有一个数,记 \(S\) 为矩阵的子矩阵集,\(f(k)\) 表示矩阵 \(k\) 中的所有数的按位与和,\(g(k)\) 表示矩阵 \(k\) 中的所有数按位或和,求 \(\sum_{i\in S}f(i)\)\(\sum_{i\in S}g(i)\) 。考试的时候只想到了 \(N^4\) 的递推做法。标准做法是单调栈。考虑当矩阵为\(01\)矩阵时,问题转化为了如何求全\(0\)矩阵个数和全\(1\)矩阵——进而统一为含\(v\)的矩阵个数。当两个子矩阵的右下角不同时,子矩阵一定不同。枚举每一行作为下界,再枚举每一列,假设当前格子可以向上延伸连续的 \(d_i\) 格(\(d\)格中每格都是 \(v\) 值),目前栈内的所有格子(以及它们的高度)与当前格子(及它的高度)的区域总面积为 \(s\)比较当前栈顶元素的 \(d\) 值,若 \(d_i>d\) ,那么以当前格子为右下角就可以与 \(s\) 都组成全\(v\)子矩阵;否则,对于当前行来说,\(d\) 值一定无用了(因为后面的列与前面的列组成子矩阵的向上延伸最高为 \(d_i\))就可以退栈,并在 \(s\) 中减值。预处理一遍 \(d\) 值就可以 \(\mathcal{O} (N^2)\) 解决了。不是\(01\)矩阵的矩阵,我们可以枚举每个二进制位来做。问题的关键在于两点:第一,枚举二进制位将普通的数字转全部化为\(01\)来处理;第二,用单调栈来求解。此题中单调栈内的每个元素不是代表自己,而是代表一个区间。假如当前元素在原矩阵列中坐标为 \(i\) ,上一个元素坐标为 \(j\) ,那么 当前元素的值就代表了 \((i,j]\) 中所有元素的值。

  • [x] \(T2\ crusade\)

​ 题意:给定一张图,只准删去一条边,问删去哪条边可以使图没有奇环。正解:线段树分治+可撤销并查集。首先图是否有奇环可以接种类并查集来模拟染色过程进而判断。那么显然我们可以枚举哪条边不选+并查集来暴力做。但实际上从枚举 \(x\) 不选到枚举 \(y\) 不选完全不需要重新来一遍。于是我们可以用可撤销并查集来优化。但如果直接枚举边+可撤销并查集,当我们撤销时顺序就被打乱了,并查集复杂度就假了。于是用线段树做出一个顺序来,每次按照顺序撤销就好了。

  • [x] \(T3\ hanabi\)

​ 题意:给定 \(n(n\leq 10^5)\) 个数 \(a_i(a_i\leq 300)\)。有两种操作,第一种是将区间 \([l,r]\) 内的数全部乘上 \(x(x\leq 300)\) ;第二种是求 \(\phi(\prod_{i=l}^ra_i)\) 。考虑欧拉函数定义式\(\phi(x)=x×\prod_{i=1}^{k}({1-\frac{1}{p_i})}\),注意到其中的 \(p_i\) 与其个数是无关的,仅与其是否出现过有关。而数域只到了 \(300\) ,即质因数个数最多 \(62\) 个。故开两棵线段树,第一棵保存区间积,第二棵用状压保存 \([l,r]\) 中是否出现过某个质因数就可以了。

  • 然后做了一道联赛数学基础的题目
  • [x] \(T126555\) 大胖的神奇路径

​ 题意:给定一个 \(N(N\leq 10^6)\) 表示\(01\)数列长度。要求数列中总共有 \(K\)\(1\) ,且任意前缀满足 \(1\) 的个数多余 \(0\) 的个数。问总共有多少种数列的组成方案。首先,在坐标轴中,从点 \((a,b)\) 走到点 \((c,d)\) 的最短路径方案数为 \(C_{|a-c|+|b-d|}^{|a-c|}\) 。设 \(x\) 轴表示 \(1\) 的数量,\(y\) 轴表示 \(0\) 的数量,则假如没有前缀的限制,问题就可以转化为从 \((0,0)\) 走到 \((K,N-K)\) 的方案数。而如果对任意前缀有限制,可以把限制看成一条直线,任何路径都不能穿过该条直线——如在本题中可以把限制看成 \(y=x+1\)而从 \((0,0)\)\((x,y)(y 穿过 \(y=x+1\) 的方案,都恰好与从 \((-1,1)\)\((x,y)\) 的方案一一对应——只要将最后的与直线的交点前的路径对称过去就可以了。所以本题的公式就是 \(C_{N}^{K}-C^{K-1}_{N}\)。方法太妙了!

  • 还学习了最基础的线段树分治。按照时间戳建立线段树,就可以实现撤销操作——覆盖原来的操作。
  • [x] \(P4588\) 数学计数

​ 题意:给定一个数 \(x\) 和一个模数 \(p(p\leq 10^9)\),初始时 \(x=1\) 。要求支持两种操作:第一种是将区间是将 \(x\) 乘上 \(y\) ; 第二种是将 \(x\) 除以第 \(k\) 次操作时乘上的数字。每次操作后输出当前的数字。由于 \(p\) 不一定与 \(y\) 互质,所以不能用逆元去思考。既然不能用逆元思考,那最好的情况下就是我只在恰当的时机乘上这个数。所以对时间戳开一棵线段树,叶子点值表示当前操作后的 \(x\) 值,乘法就先保留,遇到除法时再在特定的区域内区间乘法即可。

11
  • 先总结考试题目。今天题目还算简单。
  • [x] \(T1\ decomposition\)

​ 题意:给定一棵 \(N(N\leq 10^5)\) 个节点根为 \(1\) 的树,要求支持 \(M(M\leq 5×10^5)\) 个两种类型的操作:第一种是将 \(x\) 变为特殊点,第二种是求 \(1\rightarrow x\) 中深度最大的特殊点。考试时直接祭出了树链剖分,\(TLE\)。正解是用线段树维护DFS序。其实我本来是想到了的,但由于发现线段树上非叶子节点似乎是没有意义的,就怕了不敢打。其实本身查询时就只需要单点查询,非叶子节点的确是无意义的,只是方便打标记。哎,线段树还是没学活。

  • [x] \(T2\ tenki\)

​ 题意:给 \(N(N\leq 10^{1000})\) 个人安排座位。座位坐法很独特,第一个人会坐在第一个座位上,其后每个人都会坐在距离最近的人的距离最远的座位上(如第二个人坐在最后一个座位上)。任意两个人不能相邻。问最少要求几个座位。用递推打表找到规律,然后高精度。

  • [x] \(T3\ mafumafu\)

​ 题意:给定一棵 \(N(N\leq 10^5)\) 个节点根为 \(1\) 的树,树上的节点有黑色和白色之分。记黑点集合为 \(S\) 。要求支持 \(M(M\leq 10^5)\) 个两种类型的操作:第一种是将 \(x\) 染为黑色;第二种是求解 \(\sum_{i\in S}F(dis(LCA(x,i)))\),其中 \(F(x)=\sum_{i=1}^{x}i^k\)\(dis(x)\) 表示根节点到 \(x\) 节点的距离(恒小于等于 \(10^7\))。 最初的想法:首先,黑点恒为黑点,所以可以在加入的时候维护某个序列以方便之后操作;其次, \(LCA\) 必然在 \(x\) 节点上方,于是可以枚举每个 祖先节点 \(i\),统计以该祖先节点为根的子树中有多少黑点,这些点的贡献就都是 \(F(dis(i))-F(dis(f[i]))\) 。于是可以在每次加入黑点时也溯根将祖先节点的 \(size\) 加一。但是!!我想到这里就发现是 \(\mathcal{O} (n×m)\) 的,于是就放弃了!!其实区间加法完全可以直接用树链剖分来优化,然后在树剖的线段树上预处理好 \(d_i=F(dis(i))-F(dis(f[i]))\) 就可以了。尽管每次加一造成的真实权值是不同的,但这个加一是相同的,依然可以用线段树优化,延迟标记只记加一的次数,下放时同时乘上预处理好的权值。Orz。

  • 感觉不错。趁着这个机会补一补之前欠的一些数据结构账。
12
  • 今天围绕数据结构为中心,学了点新的知识。在此感谢 Daniel_yuan , 他的讲解大大提升了我学习的效率。

  • 首先是终于学会了CDQ分治。关键就是排序(解决第一维)+归并(解决第二维)+树状数组(加速第三维的计数)。

  • [x] \(P3810\) 三维偏序(陌上开花)

​ 题意:给定 \(N(N\leq 10^5)\) 个三元组 \(\) , 求有多少组 \((i,j)\) 满足 \(a_i\leq a_j,b_i\leq b_j,c_i\leq c_j\) 。首先根据 \(a\) 排序,然后归并,归并时左边的 \(a\) 一定小于右边的 \(a\) ,左边的 \(b\) 和右边的 \(b\) 一定分别排好序了。那么此时比较左右边的 \(b_l,b_r\) 值,若 \(b_l\leq b_r\) 那么 $l $ 可能可以对之后的所有 \(r\) 造成影响,于是就在它的 \(c\) 值处的树状数组$+1 $ ;否则就直接统计当前树状数组 \(r_c\) 值的总和,因为之后的所有 \(l\) 都不可能对它造成影响了。

  • 然后用线段树分治+可撤销并查集过了前天考试的 T2,就放在前面总结了。
  • AK 了一场 Atcoder 比赛 人生第二次 AK,哈哈。
  • [x] \(E\ sum\ of\ gcd\ of\ tuples(hard)\)
  • [x] \(F\ select\ half\)
17
  • [ ] 终于学会了 \(Mobius\) 反演。 Orz 数学题都是仙。
数论函数
  • [ ] 狄利克雷卷积:对于函数 \(f(n),g(n)\) ,它们的狄利克雷卷积 \(h(n)=f(n)*g(n)=\sum_{d|n}f(d) \times g(\frac{n}{d})\)
  • [ ] 积性函数:若 \(GCD(x,y)=1\) 时, \(f(x\times y)=f(x)\times f(y)\) ,则 \(f(x)\) 是积性函数。
  • [ ] 一些简单的推论
    • [ ] \(\mu\ *\ I\ =\ \epsilon \iff \sum_{d|n}\mu(d)=[n=1]\)
    • [ ] \(\phi\ *\ I\ =\ id\)
    • [ ] 由此可以推出: \(\phi\ =\ \mu\ *\ id\)
  • [x] \(P3455\ ZAP-Queries\)

​ 题意:给出 \(N,M,d(N\leq M)\) ,求 \(\sum_{i=1}^N\sum_{j=1}^M[GCD(i,j)=d]\) 。首先,设 \(f(x)=\sum_{i=1}^N\sum_{j=1}^M[GCD(i,j)=x]\) 。设 \(F(d)=\sum_{d|n}f(n)\) ,则\(F(d)=\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\)这个时候我们可以发现 \(F(d)\) 是很好求的,但 \(f(d)\) 不那么好求。于是我们利用莫比乌斯反演来利用 \(F\)\(f\)\(F(d)=\sum_{d|n}f(n) \iff f(d)=\sum_{d|n}\mu(\frac{n}{d})F(n)=\sum_{d|n}\mu(\frac{n}{d})\lfloor\frac{N}{n}\rfloor\lfloor\frac{M}{n}\rfloor\) 。于是利用预处理 \(\sum_{d|n}\mu(\frac{n}{d})\) ,再用整除分块就可以了。

  • [x] \(P2257\ YY的GCD\)

​ 题意:给出 \(N,M(N\leq M)\) ,求 \(\sum_{i=1}^N\sum_{j=1}^M[GCD(i,j)\in prime]\) 。依然设\(f(x)=\sum_{i=1}^N\sum_{j=1}^M[GCD(i,j)=x],F(d)=\sum_{d|n}f(n)\) 。那么 \(Ans=\sum_{p\in prime}^Nf(p)=\sum_{p\in prime}^N\sum_{p|n}\mu(\frac{n}{p})\lfloor\frac{N}{n}\rfloor\lfloor\frac{M}{n}\rfloor\)然后这个时候我们不好预处理前面的 \(\mu\) 啊之类的,就再改写一下,最外层枚举 \(n\) ,内层枚举因数。然后就可以预处理了。

18
  • 今天考试了。考了两道点分治和一道 \(LCT\)
  • [ ] \(T1\ tree\)

​ 题意:给定一棵树,求前 \(k\) 大的路径 \((N\leq 10^4,K\leq 10^4)\) 。保证树随机生成。

  • [ ] \(T2\ mincost\)

​ 题意:给定一张图,每个节点有两个属性 \(a,b\) ,要求找一个恰好 \(k\) 个点的连通块,最大化 \(Maxa+Maxb\)

  • [ ] \(T3\ crisis\)

​ 题意:给定一棵树,每次将节点编号为 \([l,r]\) 的点染成黑色,再询问距离点 \(x\) 最近的黑点。多次询问\((N,Q\leq 10^5)\)。正解是点分树。先构建一棵点分树,树上每个节点上开一棵线段树,保存区间到该点的最小距离。修改时区间修改,查询时沿点分树逐级向上,每次比较当前 \(Ans\) 和点 \(x\) 到达该级分治中心与该级分治中心到达 \([l,r]\) 的最小距离的和的大小然后更新答案。

19
  • [x] 今天学习了很多很多很多很多的数学知识。但是部分学过,部分一时还没有消化。
  • [ ] (扩展)中国剩余定理
  • [x] (扩展)BSGS
  • [ ] 线性基
  • [ ] \(Miller\_Rabin\ \&\ Pollard\_rho\)
  • [x] 矩阵乘法
  • [x] 莫比乌斯反演
  • 计划再做几道莫比乌斯反演的题目巩固一下,然后再逐个学习未打勾的算法。
22
  • 大步小步走出过往。

  • 痛苦地搞学习 QAQ 。今天学习了 BSGS 算法。 拔山盖世

  • [x] $P2485\ $计算器​

​ 题意:给定 \(y,z,p(a,b ,求最小的 \(x\) 满足 \(y^x\equiv z\pmod{p}(p\in prime)\) 。因为 \(a^{p-1}\equiv 1\pmod{p}(p\in prime)\) 。所以 \(x\in[0,p-1]\) 。令 \(m=\lceil\sqrt{p}\rceil+1\) ,那么 \(x=am-b(a\in[1,m],b\in[0,m)),y^{am}\equiv z\times y^b\) 。然后枚举 \(y^b\) 存入 \(map\) 中,再枚举 \(y^am\) 来判定是否存在过就好了。

  • 然后希望自己对基本的同余知识更加熟练一点。
  • [ ] 欧拉定理:\(a^{\phi(p)}\equiv1\pmod{p}\)
  • [ ] 裴蜀定理:\(ax+by=c\) 有解的充要条件为 \(GCD(a,b)|c\) 。由此可得 \(ax\equiv b\pmod{p}\) 有解的充要条件为 \(GCD(a,p)|b\)
23

“反演的本质是容斥。” —— \(lightmain\)

"The introduction of numbers as coordinates is an act of violence." ——\(Hermann\ Weyl\)

  • 首先做了一道莫比乌斯反演的题目练手。自己手推出来的第一道数论题。 哈哈 QwQ 。

好像没什么可骄傲的毕竟我已经做了两道比这个难多了的题目了

  • [x] $P1447\ $ 能量采集

​ 题意:给定\(N,M(N\leq M\leq 10^5)\) 。求 \(\sum_{i=1}^{N}\sum_{j=1}^{M}2\times GCD(i,j)-1\) 。 按常规方法令 \(f(n)= \sum_{i=1}^{N}\sum_{j=1}^{M}[GCD(i,j)=n],F(d)=\sum_{d|n}f(n)\) 再变形就可以了。最后得到的 \(Ans=\sum_{d=1}^N\sum_{d|n}\mu(\frac{n}{d})\times F(n)\)注意到这个地方我们枚举的是每个数的倍数,这样不好预处理,我们应该转化为枚举每个数的因数 。然后实际上展开后再重新分配律可以发现与每个 \(F(n)\) 相乘的都是 \(n\) 的因数的 \(\mu\) 。所以可以重新转化为 \(Ans=\sum_{n=1}^N(F(n)\times \sum_{d|n}\mu(d))\) 。完结撒花 ~

  • 计算几何!I'd try to find the beauty lying in the violence!
计算几何基础
  • [ ] 基本概念

    • [ ] 向量:\(\vec{a}=(x,y)\) 表示一条从原点指向 \((x,y)\) 的有向线段。
    • [ ] 旋转:逆时针旋转为正方向。
    • [ ] 平面向量基本定理:设 \(\vec{i}=(1,0),\vec{j}=(0,1)\) (只要两者不共线即可),则任意一条向量 $\vec{a} $ 都可以表示为 \(\lambda_1\vec{i}+\lambda_2\vec{j}\)
    • [ ] 叉积(两向量所围成的平行四边形的面积):$\vec{a}* \vec{b}=|\vec{a}|\times |\vec{b}|\times \sin<\vec{a},\vec{b}>=x_ay_b-x_by_a $ 。
    • [ ] 点积(\(\vec{a}\)\(\vec{b}\)上的投影与\(\vec{b}\)的乘积):$\vec{a}\cdot \vec{b}=|\vec{a}|\times |\vec{b}|\times \cos<\vec{a},\vec{b}>=x_ax_b+y_ay_b $ 。
    • [ ] 运算律:叉积点积均具有结合律和分配律。点积具有交换律,叉积反着乘需要变号。
    • [ ] 旋转运算:向量 \(\vec{a}=(x,y)\) 旋转 \(\theta\) 角的 \(\vec{a}'=(x\cos\theta-y\sin\theta,y\cos\theta+x\sin\theta)\)
    • [ ] 直线:点向式:设 \(\vec{p}=(x_0,y_0),\vec{v}=(B,-A)\) ,那么可以用 \(\vec{p}+t\vec{v}\) 代表过点 \((x_0,y_0)\) 的直线 \(Ax+By+C=0\)
    • [ ] 直线相交:交点 \(\vec{\mathcal{O} }=\frac{(\vec{p_2}-\vec{p_1})\times\vec{v_2}} {\vec{v_1}\times \vec{v_2}}\vec{v_1}+\vec{p_1}\) 。(利用两向量若重合则叉积为 \(0\)) 。
    • [ ] 点线垂直:若线外点为 \(\vec{q}\) ,则交点 \(\vec{\mathcal{O} }=\frac{(\vec{q}-\vec{p})\cdot\vec{v}} {|\vec{v}|^2}\vec{v}+\vec{p}\) 。(利用两向量垂直则点积为 \(0\))。
  • [ ] 进阶应用

    • [ ] 凸包
    • [ ] 旋转卡壳
    • [ ] 半平面交
    • [ ] 最小圆覆盖
  • 可能是我独立做出来的第二道数论题。

  • [x] $P3306 $ 随机数生成器

​ 题意: 已知数列 \(\{x_n\}\)\(x_n\equiv ax_{n-1}+b\pmod{p} (x_i\in[0,p-1])\) 。给定 \(a,b,p,x_1,t(p\in prime)\) ,求最小的 \(i\) 使得 \(x_i=t\) 。 上午常规数学课刚学习了如何由递推式子写出通项公式,然后就变形一下将原式写成 \(x_n+\frac{b}{a-1}=a(x_{n-1}+\frac{b}{a-1})\) 。然后写出递推式,再用 BSGS 求解就好了。

24
  • 今天补充学习了昨天的计算几何的基础概念。
  • 学习了 exBSGS 。
  • [x] $P4195\ $ 扩展BSGS模板

​ 题意:给定 \(y,z,p(a,b ,求最小的 \(x\) 满足 \(y^x\equiv z\pmod{p}\)\(p\) 不一定是质数)。因为 \(p\) 不是质数,所以若 \(x^{am}\)\(x^{b}\) 同时在 \(\mod{p}\) 意义下为零时,就会得到错解 。同时,式子本身也不一定有解。判定 \(GCD(y,p)|z\) ,但即使满足,也可能无解(可能不满足 \(GCD(y^2,p)|z\) )。考虑到若 \(ax+by=c\) 有解时,同时除以 \(GCD(a,b)\) 依然有解。所以 \(y^x\equiv z\pmod{p}\) 两边同时除以 \(d=GCD(y,p)\) 得到 \(\frac{y}{d}y^{x-1}\equiv \frac{z}{d}\pmod{\frac{p}{d}}\) 一直除下去直至 \(GCD(y,p)=1\) 再 BSGS 就可以啦。

​ 还有一个问题,就是每次需要累乘 \(\frac{y}{d}\) ,不取模很有可能会溢出。为什么可以直接对当前的 \(p\) 取模呢?因为有这样一个式子 $a%p= a%(k\times p)%p\ (k\in N^{*}) $ 。 也挺好证明的吧。

  • 今天还重温了一下 exgcd。
  • 感觉自己学习效率还是低了一点。很多时间也不知道自己在干嘛,但打完代码就很晚了。
25

关播了兄弟们,不能太晚了,因为咱这里面有上学的,还有上班的,你们好好的,考个好成绩。还是那句话,给自己的父母争点光,别跟我学,往那一蹲,没出息,真事,让人唠一辈子。说句实话,我现在都成为笑话了,我得让人讲究一辈子。我跟你说背在我身上这个名,永远都擦不去了。不像我抹完口红,我拿纸还能擦掉,就是在我蹲茅坑起来的那一刻到现在,不是说到现在,到以后我都会一直背着,就是说我是一个吃屎的人。我自己心里明白我是啥样的人,但是我不在乎。有你们,为了你们,想想你们我也开心。谢谢你们,啥也不唠了,有你们我真的很开心。

​ ——老八

  • 今天考试了 \(NOIonline2\)
  • [x] \(color\)

​ 题意:给定 \(p_1,p_2,t(p_1\leq p_2\leq 10^9)\) 。有 \(10^{20}\) 个栅栏,编号为 \(p_1\) 的倍数的栅栏染成蓝色,编号为 \(p_2\) 的倍数的染成红色,同时为两者倍数的可蓝可红,最后删去所有未染色的栅栏。求能否找到一种染色方案,满足最大连续颜色的栅栏数小于 \(t\)注意:只有\(p_1,p_2\) 互质时才能保证至少存在一个红色栅栏紧邻蓝色栅栏 。然后这样肯定是蓝色最多的,判定一下就可以了。

  • [x] \(sequence\)

​ 题意:给定有 \(N(N\leq 10^6)\) 个数的序列 \(\{a_i\}\) 。设 \(f(l,r)\) 为序列 \(a_l \sim a_r\) 中不重复元素的个数,求 \(\sum_{l=1}^{n}\sum_{r=l}^n(f(l,r))^2\) 。设 \(nt[i]\) 表示 \(i\) 之后的第一个值为 \(a[i]\) 的数的编号,若之后没有值相同的数则为 \(n+1\) 。先扫一遍预处理一个 \(b\) 数组,\(b_i\) 代表 \(f(l,i)\) (最开始是 \(f(1,i)\) )。那么对于每一个 \(l\)\(ans\) 都是累加 \(\sum_{i=l}^{n}b_i^2\) 。而当 \(l\) 改变时,我们会发现只有 \([l,nt[l]-1]\) 之间的数的 \(b_i\) 会减一,其余则不变——自然想到了区间修改。同时, 两次 \(ans\)累计值的差值 \(=\sum_{i=l}^{nt[l]-1}b_i^2-\sum_{i=l}^{nt[l]-1}(b_i-1)^2=2\times \sum_{i=l}^{nt[l]-1}b_i-nt[l]+l\) 。也就是说区间查询就可以了。那么考虑线段树优化。枚举 \(l\) ,每次依据上一轮的累计值得出当前的就可以了。复杂度 \(\mathcal{O} (N\log_2{N})\)

  • [ ] \(game\)

  • 感觉还不错吧,考场上通过转化+数据结构想出了正解。难得这次考试思维还不错,继续加油啦。

26
  • 进军 FFT 。
快速傅里叶变换
  • [ ] 基本概念:

    • [ ] 复数:形如 \(a+bi(i^2=-1)\) 的数。\(a\) 称为实部,\(b\) 称为虚部。
      • [ ] 加减法:实部虚部分别相加减。
      • [ ] 乘除法:一次多项式的乘除法。
      • [ ] 共轭:实部相同,虚部相反。
    • [ ] 复平面:\(x\) 轴为实轴, \(y\) 轴为虚轴的坐标系。坐标系上的点与复数一一对应。
      • [ ] 复数相乘时,模长相乘,幅角相加。
    • [ ] 单位根:\(n\) 次单位根就是 \(x^n=1\) 的复数解。
      • [ ] \(n\)\(n\) 次单位根均为单位圆上幅角为\(\frac{2\pi k}{n}(k\in[0,n-1])\) 的点所对应的复数。
      • [ ] 记 \(n\) 次第 \(k\) 个单位根为 \(\omega_{n}^k\) ,那么有:
        • [ ] \(\omega_n^{k}=\omega_n^{k\%n}\)
        • [ ] \(\omega_{n}^{k}=(\omega_{n}^{1})^k\)
        • [ ] \(\omega_{n}^{j}\times \omega_{n}^{k}=\omega_{n}^{j+k}\)
  • [ ] 变换过程:

    • [ ] 总过程:先将多项式 \(A(x)\)\(B(x)\) 转为点值表达 (DFT),再分别相乘得到 \(F(x)\) 的点值表达,再将点值表达转化为系数表达 (IDFT)。
    • [ ] DFT:设要求 \(F(x)\) 的点值表达, \(F(x)\) 的次数为 \(n\) 。将 \(n\) 补成 \(2\) 的整幂次。

    则:\(F(x)=(F[0]+F[2]x^2+...)+(F[1]x+F[3]x^3+...)\)

    设:\(L(x)=F[0]+F[2]x+...F[x-1]x^{n/2-1}\)\(R(x)=F[1]+F[3]x+...F[x-2]x^{n/2-1}\)

    那么:\(F(x)=L(x^2)+xR(x^2)\)

    \(k 则:

    \(F(\omega_{n}^{k})=L(\omega_{n/2}^{k})+\omega_{n}^{k}R(\omega_{n/2}^{k})\)\(F(\omega_{n}^{k+n/2})=L(\omega_{n/2}^{k})-\omega_{n}^{k}R(\omega_{n/2}^{k}))\)

    观察到只有 \(R(x)\) 前的正负号不同,然后就可以分治 \(L(x)\)\(R(x)\) 求解了。

    • [ ] IDFT:设 \(G(x)\)\(F(x)\) 经过上述步骤得到的系数表达。

    设: \(F(x)=F[0]+F[1]x+...+F[n-1]x^{n-1}\)

    则:\(G[x]=\sum_{i=0}^{n-1}(\omega_{n}^{k})^xF[i]\)

    那么根据单位根反演可得: \(F[k]=\frac{1}{n}\sum_{i=0}^{n-1}(\omega_{n}^{-k})^iG[i]\)

    那么就可以类似于 DFT 那样求解了。

  • [ ] 实现技巧:

    • [ ] 蝴蝶变换:提前将数列处理成递归完后的数列。据此实现非递归求解。比如 \([0,1,2,3]\rightarrow[0,2,1,3]\)
    • [ ] 合并函数:通过判定 Flag 将 DFT 和 DFT 合在一起写。
void FFT(CP *f,bool flag){
	for(int i=0;i!=n;++i)
		if(i>1;
		CP tg(cos(Pi*2/p),sin(Pi*2/p));
		if(!flag) tg.y*=-1;
		for(int k=0;k
  • 可能是我学到目前学的知识中理论性最强的,直接带我把复数入门了。Orz
  • [x] \(P3803\) FFT模板
27
  • 继续补之前的理论学习。今天学了 CRT 和 exCRT 。
  • [x] \(P1495\) CRT模板

​ 题意:给定两个含 \(N(N\leq 10^5)\) 个数的数列 \(\{a_i\},\{b_i\}\) (满足 \(\{a_i\}\) 两两互质),求最小的 \(x\) 的满足任意 \(i\)\(x\equiv b_i\pmod{a_i}\) 。设 \(M=\prod_{i=1}^Na_i\) 。假设可以对每个 \(i\) 设计一个 \(x_i\) 满足 \(x_i\equiv b_i\pmod{a_i}\)\(x_i\equiv 0\pmod{a_k}(k\neq i)\) 。那么 \(ans=(\sum_{i=1}^nx_i)\%M\) 。重点是如何构造 \(x_i\) 。设\(x_i=k\frac{M}{a_i}\equiv b_i\pmod{a_i}\) 。因为\(GCD(a_i,\frac{M}{a_i})=1\) ,那么用 exgcd 求下逆元得到 \(k\) 就好了。

  • [x] \(P4777\) exCRT模板

​ 题意:与上题唯一区别是 \(a_i\) 不满足两两互质,即 \(GCD(a_i,\frac{M}{a_i})\neq 1\) 无法求出来逆元。

28

有红颜惊艳时光辜负岁月
到头来 一声叹 一生憾

​ ——《千里邀月》

  • [x] 学习了 Pollard-rho 算法。目前数学板子只剩线性基了,加油!
  • [x] \(P4358\) 秘钥破解

​ 题意:给定 \(N=p\times q(p,q\in prime)\) ,求 \(p\)\(q\) 。玄学 Pollard-rho 算法,当用 \(y=x^2+c\) \((c\)为任意常数\()\) 来生成数时,这个数 \(\%N\) 出现循环节的期望步数是 \(\sqrt{p}\) 。于是用 \(Fast\)\(Slow\) 来跑,\(Fast\) 每次跑两步,\(Slow\) 每次跑一步,然后就OK啦。

  • [x] \(P2480\) 古代猪文

​ 题意:给定\(g,N(g,N\leq 10^9)\) ,求 \(g^{\sum_{d|n}C_{n}^{d}}\% Mod(Mod=999911659 )\) 。根据欧拉定理,原式\(=\)\(g^{(\sum_{d|n}C_{n}^{d})\%(Mod-1)}\% Mod\) 。由于\(N\leq 10^9\) 此时自然想到卢卡斯定理。但由于 \(Mod-1\) 不是质数,于是我们考虑将 \(Mod-1\) 质因数分解 \(999911658=2×3×4679×35617\) ,对于每个质因数做一次卢卡斯,得到 \(x\equiv b_i\pmod{a_i}\) 的形式,再用 CRT 合并求出最小的满足条件的 \(x\) 即可。

  • 又是一个夏天啊。
30
  • Reunion Rethink Rebirth
  • 完成学习线性基。但还有第 \(k\) 大没学,找时间补。
  • [x] \(P3812\) 线性基模板

​ 线性基就是一个全集的一个子集,在满足可以由子集中的元素得到全集中的所有元素的前提下最小化子集的元素个数。这个定义就表明了:一个集合的线性基大小必须一定,但所含元素是可以不相同的。并且在线性基中任意异或得到的数一定可以由原全集中的元素异或得到。

  • [x] \(P4570\) 元素
  • [ ] 异或元素第 \(k\)
  • 用 9 班去与 5 楼作比较给了我很多的启发。党同伐异与学习的在社会环境中的主次地位本就是不言而喻的。我形成 prejudice 不能去怪别人,唯是自己只看到了事物的一个方面,唯是自己过于封闭自己而不了解事物。有思想的人不会甘心被禁锢在所谓的三观中,我认为的表面的和谐恰恰是可以反映本质的和谐的。根深蒂固了。看剖析人性的文章时重拳出击头头是道,剖析自己的各种人格的时候唯唯诺诺逡巡不前。
  • 下层基础决定上层建筑。社会风气与意识上的潜规则或许是由社会里的人决定的,是由社会里的普通人的平均性格与领导者的领导能力决定的。我之所以觉得某处好,实质是某处的人其自身给我的感觉好。

May

1
  • “尼哥也是人”带聚会。
2
  • 考试了。
  • [x] \(T1\ shopping\)

​ 期望得分:70;实际得分:0。题意:给定 \(N(N\leq 10^5)\) 个不同的人,其中 \(M(M\leq 300)\) 个人限制拿 \(w_i\) 个球,其余人无限制。给定 \(N,M,K,\{w_i\}\) , 求有多少种拿 \(K\) 个球的方案(人可以不拿球)。上生成函数求出 \(M\) 个人拿 \(i\) 个球的方案数,剩余的人用隔板法即可。求生成函数时可以用前缀和优化。

  • [x] \(T2\ highway\)

​ 期望得分:30;实际得分:30。题意:给定一张 \(N(N\leq 100)\) 个点 \(M(M\leq 10^5)\) 条边的图,\(Q(Q\leq 10^4)\) 次询问,每次给两个数 \(l_i,r_i\) 求边的序号 \(\in[l_i,r_i]\) 的边集的最小生成森林。注意到点数和边数的巨大差异,那么就要充分利用最小生成树中边数点数同阶的性质来解决。考虑利用线段树的结构来分治,每次归并合并答案,并舍弃不需要的边。太巧妙了!

  • [ ] \(T3\ sailing\)

​ 期望得分:30;实际得分:0。

  • [ ] 总结:这次考试考得不好,直接原因在于 \(T1\) 没有彻底想清楚就下手用时太长。从生成函数而非动态规划的角度去思考本身没错,但是当发现生成函数可能是正解时过于激动,没有细想复杂度,只觉得好像 \(\mathcal{O} (n^3)\) 就打了,结果裸的生成函数是 \(\mathcal{O} (n^4)\) 的。然后我才开始思考优化,发现是区间连续加和单点修改时觉得线段树可做,于是写了线段树优化——结果过大样例用了 \(4s\) ,我又以为是线段树常数太大,就改成了树状数组——但还是用了 \(3s+\) 。然后我就放弃了,结果最后光顾着看程序用时,没有看 \(out\) 文件里的输出,然后细节写挂了,爆零。讲讲措施:首先,当想出疑似做法时,先冷静 1 分钟——什么也不干,必须冷静下来,然后细致分析复杂度;其次,当思考优化时,不要总是莽上线段树 虽然它功能强大且还算好写 ,区间查询单点修改完全可以直接上前缀和,又快又好写。最后,一定要给每个过了大样例的版本留个副本,在最后的时候检查自己的程序是否能跑过大样例。
3
  • 考试。可能是最简单的一次了。
  • [x] \(T1\ coprime\)
  • [x] \(T2\ segment\)
  • [x] \(T3\ element\)
  • [x] \(T4\ tree\)

​ 题意:给定一棵 \(N\) 个点的无根树,你可以选定任意节点为根开始以任意顺序深度优先遍历这棵树,问在你得到的遍历序列 \(a_1 , a_2 , . . . , a_n\) 中,前 \(k\) 个节点 \(a_1 , a_2 , . . . , a_k\) 的最小权值最大是多少。“最小值最大”就提醒了我用二分答案。二分一个 \(Mid\) ,然后大概就可以树上 DP 做。注意深度优先遍历是可以回溯的 ,也就是可以走遍一棵子树再走另一棵——所以 DP 中应体现是否走完整棵子树。又,由于不同的根深搜遍历是不同的,所以看似需要以每个点为根都跑一次。但复杂度受不了。考虑换根DP,即通过当前的根的状态来推算出其子节点为根时的状态 。注意换根DP中一般先改变原根的状态,再通过新状态推算新根的状态。然后就可以做了。

  • 这次大概就是会的都做对了,不会的骗分也骗到了的这种感觉。还不错,嘿嘿!
4
  • 今天集训队爷 YZH 来讲课了。介绍了分治/矩阵树定理/平面图/欧拉路。

  • 回顾下今天学习的分治。

  • 分治算法的核心:对大问题分而治之。总体=各局部 (+ 局部与局部之间的互相影响)

​ 分治算法大致可以分类为:

对结构分治 对时间分治 对答案分治
序列分治、树上分治、图上分治 CDQ分治 整体二分
  • 然后有几个经典模型:

  • [ ] 一个长度为 \(n\) 的序列,并给出一个区间 \([l, r]\) 的贡献计算方式 \(f(l, r)\),问所有区间的贡献和\(\sum_{l≤r}f(l, r)\)

​ 例:给出一个长度为 \(n(n\leq 10^5)\) 的序列 \(\{ai \}\),设区间 \([l, r]\) 的贡献为区间最大值乘区间最小值乘区间长度,求所有区间贡献和。

​ 解法:固定套路:直接从中点二分下去,每次考虑左边答案、右边答案以及左端点在左边右端点在右边的答案。具体到本题,可以考虑左右区间各维护单调栈来实现。

  • [ ] 给出一个长度为 \(n\) 的序列,\(q\) 次询问一个区间的某些信息。

​ 例:给出一个长度为 \(n\) 的序列 \(\{ai\}\),有 \(q\) 次询问,每次询问区间 \([l, r]\) 内满足 \(i≤ j\)\(a_j − a_i\) 最大值。

​ 解法:分为左右两边递归下去,同时需要考虑左区间对右区间的影响。用ST表维护最值即可。

  • [ ] 给出一棵 n 个节点的树,并给出一条简单路径 \((x, y)\) 的贡献计算方式 \(f(x, y)\),问所有路径的贡献和 \(∑_{x,y∈ [1,n]}f(x, y)\)

​ 例:

5

My wither heart.

  • 今天继续学习分治/分块。

  • 然后写了人生第一道点分树的题。(容斥)

  • [x] \(P2056\) 捉迷藏

7
  • 下午 boshi 讲课,主题是生成函数。
  • 今昨两天写了一道整体二分。
  • [x] \(P3332\) K大数查询
9
  • 今天考试了,又没考好。
  • [ ] \(T1\ A\)

​ 期望得分:70;实际得分:50。

  • [x] \(T2\ B\)

​ 期望得分:30;实际得分:30。

  • [ ] \(T3\ C\)

​ 期望得分:0;实际得分:0。

  • 加油啊。
10
  • 今天改了昨天的 T2 ,学习了 NTT,然后在洛谷上写了一道题。虽说效率仍不够,但比起前几天总算有些进步。T3 一定改啊。计算几何加油啊。

  • 哎。或许在思维尚未成熟时真的不应该看知乎吧。有的事情我明知其存在,明知其必然存在,但真正了解时确仍希望自己活在未知中,仍感觉到不解与迷茫。

  • [x] \(P1919\ A*B\ Problem\)升级版

​ NTT 模板题。NTT 的模数必须为 \(p\times2^q+1\) 形式。

21
  • [x] \(P3396\) 哈希冲突

​ 题意:给定一个 \(N(N\leq 10^5)\) 个数的序列,\(M(M\leq 10^5)\) 次给定 \(k,y\) 的操作,每次或修改 \(a_k=y\) ,或查询 \(\sum_{i\equiv k\pmod{y}}^{i\leq n}a_i\) 。正解:对于 \(\sqrt{n}\) 以内的 \(y\) 预处理和暴力修改,大于 \(\sqrt{n}\)\(y\) 暴力求解,总复杂度 \(\mathcal{O} (n\sqrt{n})\) 。启示:对于与同余、倍数有关的问题,可以按照 \(\sqrt{n}\) 分为两块处理。

  • [x] \(UVA\ Expect\ the\ expected\)

​ 题意:每个晚上最多可以玩 \(N\) 局游戏,每局的获胜概率为 \(p\) 。 当一个晚上获胜概率严格大于 \(p\) 时, 就会高兴结束, 否则伤心结束。 如果某个晚上伤心结束, 以后就不会再玩游戏了, 否则第二天晚上继续玩游戏。 求期望会玩多少天的游戏。正解:因为各个晚上独立,所以可以先单独求出某个晚上伤心结束的概率。设 f[i][j] 为 前 i 盘赢 j 局的概率,则f[i][j]=f[i-1][j]*(1-p)+f[i-1][j-1]*p。那么某个晚上垂头丧气的概率为 \(Q=\sum_{i=0}^{i\leq p\times j}f[n][i]\) 。那么期望 \(E=1\times Q+2\times(1-Q)\times Q+3\times(1-Q)^2\times Q+...\)。 显然考虑错位相减求和,那么 \(E=1+(1-Q)+(1-Q)^2+...=\sum_{i=0}^{\infty}(1-Q)^i=\frac{1}{Q}\)注意公式 \(\sum_{i=0}^{\infty}x^i=\frac{1}{x}\)

23
  • 考试。
  • [x] \(T1\ tri\)

​ 预期得分:100;实际得分:100。

  • [x] \(T2\ game\)

​ 预期得分:30;实际得分:0。题意:将一棵树分为若干个连通块,要求最大化各连通块的大小的连乘\((N\leq 700)\) 。树上 DP 。设 F[u][j] 表示 以 \(u\) 为根的子树中的最大连乘,则 F[u][j]/j=max{F[u][j-k]/(j-k)*F[son][k]/k}。 由于此题需要高精度,而高精度除法太耗时间,考虑设 g[i][j]=f[i][j]/j 。然后就可以愉快的递推了。

  • [ ] \(T3\ path\)

​ 预期得分:30;实际得分:70。题意:给定一棵 \(N\) 个点的树,\(Q\) 次操作 ,每次可以进攻 \(x\) 号节点,或者查询树上 \((x_i,y_i)\) 中第 \(k_i\) 个 被攻击的时间点 \(t\leq y_i\) 的节点。每个点只会被攻击一次\((N,Q\leq 10^5)\)

  • 总结:本次考试感觉还不错。在 YZH “高效骗分“的指导思想下,我成功推出来了 T1 的正解。然后 T2 想到了链上的 DP 做法,然后尝试往树上靠但失败了——状态设置的姿势不对。再加上要写高精度,我就放弃了。T3打了个暴力+特判然后就走了。教训:当一个题的部分分给予了你启发,但是迁移失败的时候,不要放弃当前的想法,而应该尝试变换思路,如 DP 考虑改变状态,数据结构考虑维护其他的东西。
27
  • \(P1411\)

​ 昨天考试的 T2 原题。

28
  • \(P6086\) Prufer 序列
  • \(CF429B\) Working Out

​ 挺简单的一道 DP 题。

29
  • 继续做递推 DP 题。今天做了一道很好的题目。
  • [x] \(ZOJ3747\ Attack\ On\ Titan\)

​ 题解链接

30
  • 今天考试。
  • [x] \(T1\ fantasy\)

​ 期望得分:44;实际得分:32。题意:有点复杂。正解:可以发现 \(S_i\) 就是 \(k\) 进制下的 \(i\) 的各位之和模 \(k\) 的值。那么维护一个高精度就可以了。

  • [ ] \(T2\ goodbye\)

​ 期望得分:0;实际得分:0。题意:给定 \(n(n\leq 14)\) 的某一排列 \(\{A\}\),每次随机选择一个三元组 \(\),把 \(a\) 放在 \(b\) 当前在的位置,\(b\) 放在 \(c\) 当前在的位置,\(c\) 放在 \(a\) 当前在的位置。总共有 \(m(m\leq 10^9)\) 次,任意一次操作后若 \(\{A\}=\{B\}\) 就停止。询问最后 \(\{A\}=\{B\}\) 的概率。

  • [ ] \(T3\ reality\)

​ 期望得分:55;实际得分:52。题意:给定一张图,问删去哪些点(同时删去与该点相连的边)可以使原图变成一张DAG 。

  • 总结:大概还没有尽力吧。看到概率的题目就觉得不可做,或许是我的一个亟待克服的软肋。希望自己能克服这一点吧。“置换”对于我来说还是一个完全陌生的知识点,希望以此次 T2 为突破口!

Jun

4
  • 开始学习 KDT 了。
  • [x] \(P4148\) 简单题

​ 题意:二维平面内每次或修改一个格子内的值,或查询矩阵内的总和。利用每个存在

6
  • 今天考试了。这次考试题目都非常新颖。
  • [ ] \(T1\ bag\)

​ 期望得分:50;实际得分:50。普通背包问题,但物品个数\(N\leq 10^6\),背包容量\(V\leq 10^4\),每个物品的容量\(S\leq 300\)。普通的 \(\mathcal{O} (NV)\) 做法显然不可行,由于物品的容量较小,我们考虑从物品容量下手。

​ 先把物品按照容量大小分成 s 类,每一类的容量为s[i],这一类有cnt[i]个物品。设v[i][j]表示第 i 类物品取前j个时的价值 , f[i][j]表示前i类物品占用j容量时的最大价值。那么有转移方程:

\[f[i][j]=\max_{t=1}^{min(\lfloor \frac{j}{s[i]}\rfloor,cnt[j])}{f[i-1][j-t\times s[i]]+v[i][t]} \]

​ 此时的转移是 \(\mathcal{O} (k^2\log_2k)\) 的。仍然需要进一步的优化。

​ 优化是需要利用一些性质的。本题中有个很显然也很有用的性质:v[i][j]是凸增函数

​ 设a[j]=f[i-1][j],d[j]=f[i][j],w[t]=v[i][t],则有 d[j]=max(a[t]+w[j-t])

​ 假设d[j]是由 \(k_1\) 转移过来的,d[j+1]是由 \(k_2\) 转移过来的。那么就有

\[a[k_1]+w[j-k_1]\ge a[k_2]+w[j-k_2]\\ a[k_2]+w[j+1-k_2]\ge a[k_1]+w[j+1-k_1] \]

​ 两式相加可以发现:

\[w[j+1-k_1]-w[j-k_1]\le w[j+1-k_2]-w[j-k_2] \]

​ 因为w[i]是增函数,所以在 \(\Delta x\) 相同时 \(k_2\) 那边的差距是更大的。

​ 而w[i]又是凸增函数,也就是斜率不增的增函数,所以 \(j-k_2\) 更靠前,也就是 \(k_2\) 更大,或者至少等于 \(k_1\)。于是这个DP转移就可以利用决策单调性来优化了。

  • [ ] \(T2\ sequence\)

​ 期望得分:30;实际得分:5。

  • [x] \(T3\ plans\)

​ 期望得分:100;实际得分:50。模数看错了就是离谱。

  • [ ] \(T4\ matrix\)

​ 期望得分:50;实际得分:0。

  • 总结:本次考试最重大的失误就是 T2 和 T3 。模数一定不能想当然;DFS 中加入状态数组可以大大优化复杂度,这些教训一定要记住。T1 考试时的确往 \(S\) 的方向去考虑了,但毫无头绪——还是题目做少了。多做题目,学会从不同的角度去设置方程。
10

"自己选择的路,跪着也要走完。"

​ ——陈立杰

  • 认真做题。DP FIGHT!
  • [x] \(ZOJ3537\ Cake\)

​ 题意:给定 \(N(N\leq 300)\) 个点,若图形是凸多边形,就输出最小的分割方案(分割一刀的费用为\(|x_i+x_j|\times|y_i+y_j|\mod p\))使得原图形被分为若干个三角形;否则输出 -1 。首先利用Graham判断是否为凸多边形。区间DP的方法比较好想:先选定一条基边,再枚举断点,递归下去即可。

11

“不要成为功利主义的试验品。没有人替你承担责任,一切都需要你自己去衡量。”

​ —— 张泽伟

  • 继续区间DP。经过今天的训练,感觉区间DP无论在思维上还是实现能力上都有所提升。或许之后复习一下树形DP和数位DP就进入DP优化吧。
  • [x] \(CF149D\ Coloring\ Brackets\)

​ 题意:给出一个长度为 \(S( S\leq 700)\) 的配对的括号序列,对该序列按以下方法进行染色: (1).一个括号可以染红色、蓝色或不染色;(2).一对匹配的括号需要且只能将其中一个染色;(3).相邻两个括号颜色不能相同(但可以都不染色)。求符合条件的染色方案数。

​ 看到题目的第一想法是利用已经配对好的括号来分组。令to[i]表示与第i个括号配对的右括号。先将序列分为 (...)(...)(...)(...) 若干组,每一组里面再递归。设状态f[i][0/1/2/3]表示i~to[i]这个括号对状态为0/1/2/3(分别对应红无、无红、蓝无、无蓝)时的状态,那么可以实现递推。但这样子转移时比较麻烦。麻烦的根源在于内部细化的小组计算对上一层的答案时还需要考虑到第一个左括号的颜色和最后一个右括号的颜色(这两个可能不是匹配的)。

那么由上面的思考可以发现:我们实现转移时,仍然需要通过记录区间左端点颜色和区间右端点颜色来实现——这才是最根本的。括号对的状态并不能决定是否转移,而区间左右端点的颜色可以。于是设F[i][j][0/1/2][0/1/2] 表示区间[i,j]的状态,转移时分成:已是最小括号对;lr相互匹配;lr相互不匹配三种情况转移即可。这也是这类区间DP的最经典的方法了。

  • [x] \(P1651\ Multiplication\ Puzzle\)
  • [x] \(ZOJ3469\ Food\ Delivery\)

​ 题意:有 \(N(N\leq 10^3)\) 个人叫餐,人都在x轴上,并且每个人都有个愤怒系数 \(b_i\) 。每个人的愤怒值$a_i=b_i\times $等待时间。现在送餐员从 \(x\) 轴上的 \(s\) 处 出发,路上奔跑速度是 \(v\),要一次性把所有餐送完。求最小的愤怒值之和。这类问题的状态转移大致都是记录0/1表示在区间左/右端点,再由[i,j-1][i+1,j]得出[i,j]。然后这个题循环的实现方式也挺有技巧的——先确定一个点,再左右延伸。

	for(int i=s;i>=1;--i)
	for(int j=s;j\leq n;++j){
    	... 
    }
  • [x] \(HDU4283\ You\ Are\ the\ One\)

​ 题意:给定一个长度为 \(N(N\leq 100)\) 的序列 \(\{a_i\}\) 和一个栈,求一种出栈方式,最小化\(\sum_{i=1}^na_i\times (k_i-1)\)\(i\) 号元素是第 \(k_i\) 个出栈的)。

出栈顺序有个很好的性质——划分原序列。 假定现在区间[l,r]准备入栈。那么当l号元素第k个出栈时,[l+1,l+k-1]必然在其之前出栈,[l+k,r]必然在其之后出栈。划分后的两个序列是与原问题除规模外完全等价的子问题——也是本题区间DP的突破口。

  • [x] \(UVA1437\ String\ Painter\)

​ 题意:给定两个长度均为 \(L(L\leq 10^3)\) 的字符串 \(s_1\ s_2\) 。每次可以进行一次操作,使得 \(s_1\) 中某个连续的一段变成某个字母。求最小的操作次数,使得 \(s_1\) 变成 \(s_2\)

​ 一种全新的区间DP的题型。这道题的解法需要依赖于一个空串 \(s_3\) 。总体思路:先计算出将 \(s_3\) 中的[l,r]变成与 \(s_2\) 中的完全相同所需的最小次数,记作f[l][r],再设ans[i]表示 \(s_1\) 的前i个满足条件时的最小值。那么就有

\[ans_i=\begin{cases} ans_{i-1}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (s_1[i]=s_1[i-1])\\ ans_j+f[j+1][i]\ (s_1[i]\ne s_1[i-1]) \end{cases} \]

​ 问题就被转化成了如何求解f[][]。首先肯定有f[i][j]=f[i+1][j]+1(无脑涂色),然后考虑到如果中间 k处时已经被涂成了i的颜色,那么这一次就是不需要涂的,于是

\[f[i][j]=\begin{cases} f[i+1][j]\\ f[i+1][k-1]+f[k][j]\ \ \ \ (s_2[i]=s_2[k]) \end{cases} \]

​ 至此,问题得到了解决。这道题最巧妙的地方是利用空串来辅助转移,这样的目的是在状态递推中不需要记录颜色的使用状态,而只需判断两者的颜色是否相等。如果回归到以前的模型,大概也可以通过f[l][r][c]c维记录最后的颜色)来递推实现。

12
  • 烤了一个非常南的柿子。
  • [ ] \(T1\ america\)

​ 预期得分:8;实际得分:3。

  • [ ] \(T2\ continue\)

​ 预期得分:54;实际得分:12。\(p_i\) 的时候没有取模,本来应该是54分的嘤嘤嘤

​ 给定两个长度为 \(N(N\leq 10^5)\) 的非负整数序列 \(a\)\(b\) 。定义 \(b\)\(k\) 变换后得到的 序列 \(b'\)\(b'_i=b_{(i+k)\ mod\ d}\) 。要求求出所有的 \(k\) ,满足 \(b\)\(k\) 变换后的 \(b'\) 序列满足:存在一个 \(m\) 次的多项式 \(P(t)\) ,使得 \(\forall\ t\in[0,n)\) ,均满足 \(P(t) \equiv a_t-b'_t\pmod{998244353}\)

​ 定义两个序列相似:若存在一个 \(m\) 次的多项式 \(P(t)\) ,使得 \(\forall\ t\in[0,n)\) ,均满足 \(P(t)=A_t-B_t\) ,则称序列 \(A\) 与序列 \(B\) 相似,记做 \(A\thicksim B\) 。序列相似具有传递性:若 \(A\thicksim C\)\(B\thicksim C\) ,则 \(A\thicksim B\)

​ 假定序列长度恰好是 \(m+2\) 。根据序列相似的传递性,我们可以考虑间接证明 \(A\)\(B\) 是否相似。构造长度同样为 \(m+2\) 的全 \(0\) 序列 \(C=\{0,0,0,...\}\)(下标从 \(1\) 开始)。利用 \(A\)\(C\) 的前 \(m+1\) 位做差构造出多项式 \(R\) ,再令 \(C_{m+2}=-R(m+2)+A_{m+2}\)。那么此时得到的序列 \(C\) 与序列 \(A\) 相似。同时,我们记 \(C_{m+2}\) 为序列 \(A\) 的特征值。则序列 \([A_1,A_{m+2}]\) 的特征值 \(\lambda (A_1,A_{m+2})=-\sum_{i=1}^{m+1}A_i\times g_i(g_i=\prod_{j=1}^{j\leq m+1\&j\ne i }\frac{m+2-j}{i-j})+A_{m+2}\) 。同理可以得到序列 \(B\) 的特征值。若序列 \(A\) 的特征值与序列 \(B\) 的特征值相同,那么 \(A\thicksim C\thicksim B\) ;反之,则 \(A\not\thicksim B\)特征值相同是两序列相似的充要条件

​ 但是序列的长度可能不是 \(m+2\)。这时该如何判断序列相似呢?我们可以先令 \(\alpha(i)=\lambda(A_i,A_{i+m+1})\) ,同理得到 \(\beta(i)\) 。现在考虑如何通过 \(\alpha\)\(\beta\) 来判断当前情况下序列 \(A\) \(B\) 是否相似。这时有一个结论:如果 \(\alpha(i)=\beta(i)\)\(\alpha(i+1)=\beta(i+1)\) ,那么 序列 \(A[i,i+m+2]\)\(B[i,i+m+2]\) 也是相似的(因为这两个 \(m\) 次多项式过了相同的 \(m+1\) 个点,所以这两个多项式是等同的)。也就是说,如果在 \([1,n-m-1]\) 的这一段前缀中均有 \(\alpha(i)=\beta(i)\) 那么 \(A\thicksim B\)

​ 但是 \(B\) 还可以旋转。如果每次旋转都重新求特征值,复杂度显然不能接受。考虑到当 \(B\) 旋转时,序列 \([l,r]\) 变成了 \([l+k,r+k]\),它们所对应的多项式的图像仅仅是横坐标均 \(+k\) 而已,但是特征值只与纵坐标有关。故:旋转不会改变特征值。再深入思考,既然旋转不会改变特征值,那么在最原始的 \(B\) 序列中,最后面 \(m+1\) 个数的 \(\beta\) 值就可以通过倍增 \(B\) 处理出来。得出完整的 \(\beta\) 序列后,再与 \(\alpha\) 做一次字符串匹配统计相同的前缀个数以及位置就可以了。

​ 最后的关键问题:在求解 \(\alpha\)\(\beta\) 时,若对每个点暴力求解,复杂度高达 \(\mathcal{O} (n\times m)\) 无法接受。而其实 \(\alpha(x)=\sum_{i=x}^{m+x+2} A_i\times g_i\)两个多项式的下标相同时做法可以用减法卷积FFT来优化 。于是这个题就完结撒花了。于是这个人也完结撒花了

  • [x] \(T3\ flower\)

​ 预期得分:23;实际得分:23。

​ 给定一棵 \(N(N\leq 10^5)\) 个点的树,树上的边为一类边。再给定 \(k(k\leq 100)\) 个整数,表示 \(k\) 条二类边的权值。二类边的起终点是任意的。定义一条合法路径为:每条一类边被经过了至少一次;每条二类边被经过了至多一次;路径的起终点均为 \(1\) 号点。要求合理设置二类边的起终点,最小化最小的合法路径长度。

​ 解法是贪心,带撤销的那种。首先,如果某条二类边无法为最后的最优解做出贡献,那我们可以任意指定起终点。于是可以不管它,只讨论必然会经过的二类边。二类边的作用就相当于构成了一个基环,边的端点完全可以先处理完其他分支再从该条二类边经过,如此可以减少走一次两个端点的简单路径。也就是说若 \(k=1\) 的话,选择的二类边必然是可以替代直径的。

​ 那如果 \(k>1\) 呢?首先或许会考虑在剩余的边中继续寻找直径,若前后两条直径无交边,那么直接连接之后的直径的两端就可以了。但或许前后的两条直径是有交边的。记相交的边集为 \(S\) ,这个时候有一个性质:此时的 \(S\) 必须又被经过两次(并不会证明)。如果三次找到的直径交集为 \(S'\) ,那么 \(S'\) 又只会经过一次了。也就是说每多经过一次,我们就可以把边权取反再跑直径来类似于“撤销”性质的增加边权。

  • 总的来说,\(T2\) 这种数学题完全没有遇见过,做不出来也是自然;\(T3\) 没有发现贪心性质,做不出来也在情理之中。还是题目做的太少了。什么方法啊总结啊都是在扎实基础上而言的,像我这样的人,就应该先大量做题,把“套路做了,模型看遍”,再去要求自己精做。

  • [x] \(P4781\) 【模板】拉格朗日插值

\(P=\sum_{i=0}^{n}(y_i\times \prod_{j=0}^{j\leq n\&j\ne i}\frac{x-x[j]}{x[i]-x[j]})\)

13
  • 再次深切的认识到了自己有多菜。wa 得一声就哭了出来。
  • [x] \(T1\ shopping\)

​ 期望得分:50;实际得分:50。

​ 给定一棵 \(N(N\leq 500)\) 个点的树,树上的 \(i\) 号节点卖第 \(i\) 种商品,价格为 \(c_i\) ,满意度为 \(w_i\) ,库存量为 \(d_i\) 。要求用 \(M(M\leq 4\times10^3)\) 元实现最大满意度,同时,经过的所有节点必须是互相连通的。

​ 考场上自然只想到了最基础的树上背包f[p][i]=f[son][j]+f[p][i-j]。复杂度是 \(\mathcal{O} (N\times M^2)\) 的过不了。而这种背包合并直接优化的空间已经不足了(毕竟状态就有 \(\mathcal{O} (N\times M)\))。于是考虑从状态入手。

​ 设f[i][j]表示DFS序大于等于i的点使用j元的最大价值(并且若自己被买自己的父节点必须被买)ind[x]表示DFS序为x的节点;oud[x]表示x节点的子树中的最大的DFS序。假设我们现在DP的是DFS序为i的节点。此时有两种完全互斥的情况:i被买/i不被买。先强制i被买——由DFS序为i+1的点直接继承过来,再与自己做一次背包DP。此时的这个背包DP可以用二进制分组来优化。

int cur=ind[i],tmp=d[cur]-1;
for(int j=m;j>=c[cur];--j)
	f[i][j]=f[i+1][j-c[cur]]+w[cur];//强制选择 直接继承
for(int j=1;;j<<=1){//二进制分组优化
	if(tmp=j*c[cur];--k)
		f[i][k]=max(f[i][k-j*c[cur]]+j*w[cur],f[i][k]);
	tmp-=j;
	if(!tmp) break;
}

​ 再来考虑i不被买的情况。因为i不被买,所以i子树内的点都不能被买,所以此时直接由子树外的最优值转移过来。

int cur=ind[i];
for(int j=0;j<=m;++j)
	f[i][j]=max(f[i][j],f[oud[cur]+1][j]);//最大值直接转移过来

​ 此时i节点的转移就完毕了。我们惊喜地发现:一次转移是 \(\mathcal{O} (\log_{2}d\times M)\) 的。为什么这个转移快?我们可以发现,转移基本上都是直接转移过来的,而不是外层内层各一个 \(M\)。这是因为:最普通的树形DP子树间的合并是交合并,也就导致要拼凑;而如果分为是否强制选当前节点来转移,那这就是并合并,两者不需要拼凑,而是比较最大值直接继承,所以这样快。而这样唯一的一点不足就是强制了父子关系——也就是常说的“树形依赖关系”,于是需要在外面套上点分治。故时间复杂度为 \(\mathcal{O} (M\times \log_{2}N\times \log_{2}d)\)

​ 余以为妙绝。

  • [ ] \(T2\ tree\)

​ 期望得分:10;实际得分:10。

  • [x] \(T3\ shallot\)

​ 期望得分:50;实际得分:50。

​ 给定可重集合 \(S\) ,最开始为空集。要求每次动态插入或删除一个数,并维护从 \(S\) 中取若干个数可以得到的最大异或和。\(|S|\leq 5\times 10^5\) 。正解:在全局开一个线性基,再上线段树分治就可以力。

  • 总结:\(T1\) “点分治上利用DFS序进行由上至下的DP”这种解法以前从来没见到过,甚至连二进制分组的多重背包也没写过,还是经验太少了。\(T2\) 没有发现所谓的每层的属性的本质——\(k\) 的二进制拆分。\(T3\) 全程只思考着如何实现待修改的线性基——一直在往可持久化方面考虑。但实际上貌似“可持久化”这个东西都是针对树形结构来的——如 Trie树、线段树、并查集。所以本就应该早早放弃这种想法。并且当有“时间”这一维度存在时应该立刻想起CDQ分治、线段树分治或者整体二分。这类的数据结构是处理时间偏序问题的利器。
15
  • 今天凭一己之力写了一道树形DP简单题。明天开始打算改之前欠下的考试题。还是要多做点难题。
  • [x] \(CF337D\ Book\ of\ Evil\)

​ 两遍DP,分别求出子树内的和子树外的最长链即可。

  • 今天考了生物周测,不是很理想。哎,最近学习有种不是很踏实的感觉。我模糊中记得自己上期也曾有过不踏实的感觉,但清晰的记得当时做题的准确。希望自己赶快能从内心的浮躁中走出来吧。
  • “人间有味是清欢”。并不是很羡慕所谓的万人景仰,活在人群之中;但确很希望自己能有一个自己的小圈子,就像比企谷团子和雪乃那般的。这是坠好的。
16
  • 今天改了13号考试的T3。训练了一手线段树分治。
17
  • 今天改了13号考试的T1。希望自己能把握这几天的时间,把之前考试的硬骨头给啃掉。多做难题才能进一步提高思维和代码能力。
  • 加油加油加加油!!!!!!!
18
  • 今天效率不高。

  • [ ] \(P3565\ HOT-Hotels\)

19
  • [x] \(AT5141\ Add\ and\ Remove\)
  • [x] \(P3146\ 248G\)
20
  • [x] \(P5664\ Emiya\) 家今天的饭​

​ 容斥+DP。

  • [x] \(P3052\ Cows\ in\ a\ Skyscraper\ G\)
21 省选结束
  • 省选总结:Link 。
26
  • 迎来了DP专题的考试。
  • [x] \(A\)

​ 题意:给定一棵 \(n\) 个点的树,相邻两个点之间的距离都是 \(1\) 。小奇要在若干个节点上建立仓库,建立一个仓库需要花费 \(K\) 元。对于未设立仓库的节点,设其到最近的仓库的距离为 \(i\),那么它要花费 \(C_i\) 元。求最小花费\((n\leq200)\)

​ 这类题目最难处理的就是由子树外的节点转移过来的情况。面对这种情况有两种做法。

​ 第一种做法是未来费用。设状态f[p][j][0]表示节点 \(p\) 由子树内的节点建仓库转移过来,且仓库与 \(p\) 的距离为 \(j\)f[p][j][1]表示节点 \(p\) 由子树外的节点建仓库转移过来,且仓库与 \(p\) 的距离为 \(j\) 。那么可以得到转移方程:

\[x_v=\min\limits_{j=0}^{n} f[v][j][0]\\ \begin{cases} f[p][j][0]=\sum\limits_{v\in son[p]}^{v\neq t} \min(x_v,f[v][j+1][1])+f[t][j-1][0]+C_j\ \ (j\geq 1)\\ f[p][0][0]=\sum\limits_{v\in son[p]} \min(x_v,f[v][1][1])+k\\ f[p][j][1]=\sum\limits_{v\in son[p]} \min(x_v,f[v][j+1][1])+C_j \end{cases} \]

​ 这种做法可以说是最常规的树形DP的套路,但蕴含了很多的技巧。首先,记得考虑子节点自给自足的情况;其次,对于子树外的仓库可以用未来费用来计算;最重要的一点是,在父节点处枚举子树中的仓库时,需要一并处理兄弟节点之间的情况。这三点实在是太重要了。

​ 第二种做法简单粗暴。设f[i][j]表示 \(i\) 号节点选择 \(j\) 号节点作为仓库时的最优费用。注意:这个费用中暂时不包含 \(j\) 号节点建立仓库的费用。首先可以预处理出f[][],然后我们要将所有节点的答案合并起来。这种合并可以通过如下转移:

\[x_v=\min_{i=1}^{n}f[v][i]\\f[p][i]+=\sum\limits_{v\in son[p]} \min(f[v][i],x_v+k) \]

​ 这种方法实在是太妙了,根据题目的需要来设置状态。自叹弗如。

  • [x] \(B\)

​ 题意:给定一棵 \(n\) 个节点的有根树,树上有 \(m\) 个叶子,编号为 \(1-m\) 。有一枚棋子,初始时从根节点出发,一直向下走。小奇和小泽轮流移动棋子。设最终走到的叶子结点的编号为 \(x\) 。小奇需要最大化 \(x\) ,小泽需要最小化 \(x\) ,且两人都足够聪明。现在需要设计一种叶子结点的编号方案,最大/小化最终的 \(x\ (n\leq2\times 10^5)\)

​ Min-Max 博弈问题。设f1[i]表示节点 \(i\) 的所有叶子节点在最优方案下可达到的最小相对排名。注意:最小排名,即是最大编号;相对,是指在 \(i\) 的子树中的所有叶子节点中的相对值。那么就有以下转移(假设根节点深度为 \(1\)):

\[f1[i]= \begin{cases} \min\limits_{v\in son[i]} f1[v]\ \ \ \ \ (dep[i] \mod2=1)\\ \sum\limits_{v\in son[i]} f1[v]\ \ \ \ \ (dep[i] \mod2 =0) \end{cases} \]

​ 再设f2[i]表示最大相对排名,同理即可做出本题。

\[f2[i]= \begin{cases} \min\limits_{v\in son[i]} f2[v]\ \ \ \ \ (dep[i] \mod2 =0)\\ \sum\limits_{v\in son[i]} f2[v]\ \ \ \ \ (dep[i] \mod2 =1) \end{cases} \]

  • [x] \(C\)

​ 题意:给定一棵 \(n\) 个节点的树,每个节点上有一个权值 \(a_i\) 。每次可以选择一个最大权值与最小权值的差小于等于 \(d\) 的一个连通块删去,删去整棵树的最少次数。

​ 考试时不知道怎么的,看到连通块就直接放弃了。与连通块有关的树形DP有些套路,一般都先设第一维f[p]表示在 \(p\) 的树中 \(p\) 所处的连通块,第二维设置连通块的限制条件。转移时枚举限制条件,由子节点递推上来。本题的标准解法也是如此。设f[p][val]表示在 \(p\) 的子树中,若 \(p\) 所处的连通块的权值上限是 \(val\) 时的最小连通块数量。那么就有:

\[f[p][j]=\sum\limits_{v\in son[p]} \min(f[v][j],g[v])\ \ (j\in[a_p,a_p+d]) \]

其中,g[v]表示将以 \(v\) 节点为根的子树完全割开的最少删除次数。可以由f[][]推出:

\[g[p]=\min\limits_{j=a_p}^{a_p+d}f[p][j]+1 \]

将树分割为连通块的题目,一般设第一维表示在子树内所处的连通块,第二维表示连通块的某个限制。以后要更加大胆些去尝试。

  • [x] \(D\)

​ 给定 \(n\) 个点,每个点有一条出边,分别指向 \(a[i]\) 。若修改其出边,可以指向任一节点,费用分别为 \(c[i]\) 。求修改若干条边使得原图是一个包含所有的点的环的最小费用。

\(n\) 个点,每个点仅有一条出边——这个图必然是内向基环树。于是分别在树上和贪心即可。

  • 考试总结:这次考试暴露了学习中潜在的很多问题。首先,对于基础的树形DP的套路已经不熟练了,如本次考试的 A 题。考场上方程都设好了,但就是忘记了在父亲处处理兄弟之间的关系以及处理向上的未来费用。另外,对于树上的连通块的问题,第一次做的时候没有总结,导致本次考试依旧望而生畏。以后总结要更加及时全面深刻。还有一个很重要的问题就是题目刷少了。我一直以为树形DP的题目我已经做得差不多了,没想到这次考试一下子蹦出来几道没见过的或者不熟练的模型——要在做题来源上下功夫了!
27
  • 今天考试爆零祭。
  • [ ] \(A\)
  • [ ] \(B\)
  • [x] \(C\)
  • [x] \(D\)
  • 总结:这次考试有三个重大失误,或者说应该引起以后警觉的地方。首先是 C 题一直看错题目,这非常耽误时间。其次,A 题是一道显然的内向基环树森林的题,然而我并没有往内向基环树森林上面去想,这说明之前的总结还不到位。最后,本次考试 \(2\) 道题考试的时候题目都没读懂,语文理解能力也是菜啊...以后加油!
  • [x] \(P3622\) 动物园

​ 状压DP。比较简单,但我错了很多次直到最后重构代码。在有思路的情况下要先做好代码的整体规划,再开始敲。

28
  • 今天考试,接触到了很多的新套路——太赞了。
  • [x] 仓库选址

​ 给定一棵 \(n\) 个点的树。对于节点 \(i\) ,定义 \(v(i)=\sum\limits_{j=1}^{j\leq n\&j\neq i} dis(i,j) \oplus m\) 。求所有的 \(v(i)\) \((n \leq 10^5,m<16)\) 。观察到这题的 \(m\) 很小,考虑从 \(m\) 下手。异或运算,只改变操作数二进制下的后面的若干位。放到这个题上,如果本来的两点距离为 \(x\) ,那么只会改变 \(x\) 二进制下的的后四位。而对于后四位相同的数,其变化量是一样的——都是 \((x \mod 16)\oplus m-(x\mod 16)\) 。于是我们统计所有点到某个点的距离之和,同时记录ans[i][j]表示有多少个节点到 \(i\) 号节点的距离的后四位为 \(j\) ,就可以了。复杂度 \(\mathcal{O}(16n)\)

  • [x] 动漫排序

​ 给定一棵 \(n\) 个点的树,树上的每个节点表示一部动漫。每个点的兄弟节点之间是有先后顺序的。小 A 要来看动漫了,他希望你来设计一种满足下列要求的看动漫的顺序:

  • \(n\) 部漫画都要看到。
  • 在观看某部漫画前,必须先看完它在原来树上的父节点和比他排名靠前的兄弟节点的漫画。

​ 请问总共有多少种安排看动漫的顺序的方案。

​ 计数 DP 题——是我不擅长的。设size[u]表示 \(u\) 的子树的节点个数,f[u]表示 u 的子树内部的排序方案数。接下来考虑怎么递推。

​ 假设现在是 \(u\)\(1\) 号子节点 \(v\) 。因为选 \(v\) 的子树时,\(u、v\) 都必须要选,且一定是第一个和第二个,所以若不考虑 \(v\) 子节点内部的顺序,方案数就为 \(C_{size[u]-2}^{size[v]-1}\) 。什么意思呢?把最终的顺序看成是一个空的序列,那么由于前两个填了,该序列就只剩下了 \(size[u]-2\) 个空位置,而我们至少有一种合法的方案使得任意选 \(size[v]-1\) 个位置出来都满足。而若考虑 \(v\) 子节点的顺序,我们对于选出来的 \(size[v]-1\) 个位置就均有 \(f[v]\) 种放法,所以就是 \(f[v]\times C_{size[u]-2}^{size[v]-1}\) 。其余子树是类似的,最后再用乘法原理合起来即可。

​ 启发:对于计数题,先把最后的答案看成是序列,然后思考如果得到不考虑顺序时的方案数,再乘上顺序的方案数 。在求顺序时的方案数时,先把固定了位置/位置范围的数先放,后面的数再放进去。

  • [x] 消息传递

​ 给定一棵 \(n\) 个点的树,每个节点上有一个人。在时刻 \(0\) ,你可以将消息告诉一个人,然后那个人可以任选一个与他相邻的不知道消息的人并告诉他消息。在同一时刻,一个人只能告诉一个人消息,传递消息的时间均为 \(1\) 。请问最少需要多少时间来使所有人得到这个消息,并且可以通过告诉哪些人来得到最小值 \((n\leq2\times 10^5)\)

​ 典型的换根DP。先考虑如何对一个点暴力求解。设f[i]表示当 \(i\) 号节点知道消息时,还需要的最小时间。假设我们先把所有的 \(f[v](v\in son[i])\) 按从大到小排完序,则 \(f[i]=\max\limits_{i=1}^{son[i].size()} f[i]+i\) 。答案就是当前的 \(f[rt]\) 。怎么换根呢?当 \(rt\rightarrow rt'\) 时,此时对于 \(rt'\) 而言,其 \(f\) 值的来源应该还有一个换完根之后的\(f[rt]\) 。假设g[p]表示当根从 \(fa[p]\rightarrow p\) 后的 \(f[fa[p]]\) ,问题转化为如何高效求解g[]。假设目前的根是 \(p\) ,它目前的儿子节点集合为 \(S\) 。当对目前的所有子节点排完序后,假设 \(rank[i]\) 表示 \(i\) 节点是第 \(rank[i]\) 大,则对于 \(\forall x\in S-fa[p]\)\(g[x]=\max\limits_{y\in S}^{y\neq x} (f[y]+rank[y]-[rank[x] 。于是我们维护一个前后缀 \(\max\) 就可以把求每个点 \(g\) 值做到 \(\mathcal{O}(1)\) 的复杂度。 完结~

  • [x] 大逃杀
  • [ ] 梦中漫步
29
  • 今天做了两道数据结构题,积累了一些套路—— DSU和 0/1Trie 。

  • [x] \(CF600E\ Lomsat\ gelral\)

​ 给定一棵 \(n\) 个点的树,节点上染了色。每种颜色有一个编号。求某个节点的子树中,颜色最多的节点的颜色编号。若有多个颜色编号满足条件,输出它们的和 \((n<=10^5)\)

​ 暴力的做法是遍历每一棵子树。在遍历的时候,我们需要用个cnt[]记录某个颜色的数量,而当我们首先遍历完一棵子树后,必须要清空这个数组才能遍历下一棵——也就是说由于空间限制,我们不能从下往上递推。虽然不能继承所有子树信息,但我们可以是可以继承最后一个子树的信息的。继承哪个子树呢?当然是重儿子!于是就这样暴力做。复杂度:每个点只可能在祖先节点暴力清空和自己更新答案时被经过,而某个点到根节点的路径上轻链数量必然小于 \(\log_{2}{n}\) ,所以复杂度为 \(O(n\log_{2}n)\)

  • [x] \(P6623\)

​ 省选 Day2T2,算是一个 0/1Trie 维护的大杂烩吧。0/1Trie 可以用来维护整体加一是我真的没想到的。这个题也算是学了树合并吧, 但还是需要做点线段树合并的题目来熟练。

  • [x] \(P4170\) 涂色

​ 比较简单的一道区间DP题。3min秒了

30
  • 今天继续刷题。不知道怎么的有点不想改考试题。
  • [x] \(P2150\) 寿司晚宴

​ 给定 \(n-1\) 种物品,重要度分别为 \([2,n]\) 。甲乙两者来拿若干件(可以为 \(0\))物品。若甲拿的物品的重要度集合为 \(S_1\) ,乙拿的物品的重要度集合为\(S_2\) ,则一种合法的方案定义为 \(\forall x\in S_1,\forall y\in S_2,\gcd(x,y)=1\) 。求拿物品的方案总数。

​ 既然两个集合的唯一限制是质因子无交集,那么不难往状压DP方面去思考。压 \(500\) 以内的全部质数?不是很可做的亚子,我们必须思考如何压缩状态。

状压DP非常重要的一点就是把本来看上去不可以压的东西通过一些小 trick 使得一些东西可以单独拿出来。比如在这个题目中,一个数不可能同时有两个大于 \(19\) 的质因数!

​ 也就是说,当我们考虑某个质数 \(p(p>19)\) 时,我们只需注意所有小于等于 \(19\) 的质数及该质数满足条件,其他的质数可以暂时不作考虑。故我们只需要压 \(19\) 以内的质数——很幸运,只有 \(8\) 个。具体处理的时候,我们先将所有数按照最大的质数排序,大质数相同的一起处理。设两个数组f1[][]f2[][],分别表示当前质数只放在甲手里/只放在乙手里。于是就可以实现DP啦。


  1. 由于我们需要的是它后面的点,所以作后缀和。 ↩︎

  2. 下面的概率题都是几何概率,建议画二维坐标系求解以加深理解。 ↩︎

  3. 下面的期望题由两种求法,一种是递归或解方程,一种是微积分。微积分做法也可转化高一维度来求解,如平面上的微积分转化到三维求体积。 ↩︎

  4. 简便起见,在\(Trie\)树上用\([root,i]\)表示从\(root\)\(i\)的路径上所形成的前缀串。 ↩︎

你可能感兴趣的:(『竞赛日记 2020 』(上))