【NOI2014】购票 因为线段没有区间限制,所以李超线段树只有一个log,但是树剖有两个log,一共三个log,不过考虑到其中两个log(重链和李超树)的log常数比较小,所以可以跑过去。我们只需要维护前面的一部分,这就是相当于插入了一条。一个根向的树,边有边权,每个点可以往上跳不超过。上方最小的一个线段上的点,插入比删除好维护。,让你求出每个点到达根节点的最小花费。的距离,并且到达一个祖先,花费为。所以我就在树剖上面套李超线段树。考虑了很多种思路,发现如果维护。
洛谷P3975 [TJOI2015] 弦论 最近开始做command_block的题单https://www.luogu.com.cn/training/5322#problems。现在得到了parent-tree,容易知道,儿子所代表的字符串一定比父亲的大(因为父亲是其前缀)。因为比较字典序需要从头开始比,但是SAM只能处理endpos,所以我们把字符串反着来建。我们肯定要先预处理出每个点endpos中的任意一个元素,然后假设父亲所代表的长度区间为。求一个字符串中第k小的子串是什么,要求能够相同统计多次或者统计一次。,那么只需要比较儿子之间的。
thucam day1: H. Ancestral Problem 不过仔细观察发现,复杂度的瓶颈在于第一部分,比如菊花图,会导致每条边都要把全部的点建一次图。然后看右边剩下的点中,有哪些能够沿着残量图从汇点出发,经过这个点,再到达原来没有匹配的点。值得注意的是,第一棵树的根节点不一定会和第二棵树上面的点对应,因此我们还需要再特别判断一次点。,但是空间限制为256MB,因此我们把边的流量数组设置为bool,这样只用开。的子树,是否能与第二棵树中(当u为v的父亲时)v的子树匹配。的儿子为右部分建立二分图,判断右边是否每个点都能匹配上。3.匹配数
[NOI2022] 二次整数规划问题 稍微思考你会发现无论矩形怎么平移,最优值一定在凸包上,直接无脑的把凸包整个找出来即可,只需要找到x最小和x最大,然后分治找即可。然后我们发现,除非必须要填1或者5的位置,都必须填2,3,4。因此我们可以预先求出来这些数,然后剩下的只用考虑填2的数和填4的数,就足以计算出式子。如果全部在第三象限,那么只用考虑上凸壳(当然你没有必要判断,你只需要把凸壳上的点求出来,然后全部求一次即可)。为了方便用切糕模型求解,我们把三个统统取反,然后求最小值,如果有负数,那么就把全部加上一个值使三个数都是正数。
P3227 [HNOI2013] 切糕 的得分,但是相邻两点之间的差值有限制,让你求最大得分。连一无穷大的边,因为如果相邻的链选择的点。那么就会有流量剩余,因此就能进行限制了。的矩阵,每个点可以选择一个值。考虑限制,只需要从这条链的。
2024北京市赛 A.不要玩弄字符串 两个人轮流填0或者1,如果某人填完后某个字符串第一次出现,那么这个字符串的分值加到这个人的总分里面,每个人都要最大化自己的分减去另外一个人的分。如果不存在前面的点,那么我们就考虑当前能在已经确定一部分的情况下能到达最大的点,再把这个点变成确定的。如果走到了某个节点以后,状态会发生改变,那么我们就把这个点设置成确定的。如果某一个点能走到的点都是确定的,那么显然它也是确定的。很明显,首先建立AC自动机,然后用状态压缩。现在难点在于,如果出现了环应该怎么办。,接下来先手能得到的最大差。,已经填完的字符串状态是。
P5540 [BalkanOI2011] timeismoney | 最小乘积生成树 很显然这个东西又可以用最小生成树求解,因此这就变成了一个递归求解的过程。最小的点一定在凸壳上面,这两个都可以用最小生成树来求,分别设为。最远的点,这个点肯定也在凸壳上面。我们用差乘来求距离。,很容易发现这一定是在所有点的下凸壳上。根据定理,下凸壳上的点数量很少,大概是。条边的无向图,每个边有两个权值。首先,对于一棵生成树T,我们令。现在考虑怎么找出这个凸壳。就可以对应平面上面一个点。这网上有很多种说法。
[NOI2022]移除石子 但是这很明显是不正确的,因为你只要手玩一下,观察怎么样才可能把石子删除,你就会发现这里面涉及到非常复杂的东西,基本上不可能用结论来概括,所以要考虑用dp。重要的性质我基本都观察到了,不过我考虑状态的时候出现了一些问题,主要就是基本功不够,无法再推下去了。,但是不同形态之间可以用极少石子使其转换成另一种形态,我们爆搜一下,发现状态很少,直接dp就可以了。因为k的恰好很麻烦,但是我们很容易发现能将其变成至少,只要特判k=1,全0,或者3个1的情况即可。中的一个,问有多少种可能性,使得添加恰好。
2024ICPC网络赛2记录:CK 不过看到异或就知道这个异或肯定不是白给你的,大概就是用字典树,一开始我以为是把两个数组分开建字典树,后面发现要一起建,然后就想到用dp来维护。这一把我们三个人手感都很好,前六题都是一遍过,然后我又切掉了非签到的E和C,最后时间不是很多,K只想到大概字典树的思路,细节不是很懂就直接开冲,当然是没有冲出来。我们想了很多错误的思路以后才开始思考kmp,然后就想到了可以一直跳kmp,只需要把相同的合并起来,如果能匹配的就全部一起跳过,不匹配的就直接删掉,时间复杂度O(n)。看上去要求某种匹配数的个数,有点吓人。
几有趣的位运算技巧 我们都知道最小可以用x&-x来实现,但是最大要怎么实现呢,感觉应该没有能够左右翻转的位运算。今天ICS课上讲了两个很有趣的位运算技巧。然后老师给出了一种常数非常小的做法。所以基本可以用类似二分的做法来做。实现一个函数,判断x位的奇偶性。题目1,你要实现一个函数。返回x的最大一位1。
左偏树与可持久化左偏树 比如说,比如某两个multiset都有1~10000的每个数,那么线段树上就会形成一个有接近10000个节点的满二叉树,然后每次合并都要把全部的点遍历一次,这样必然会超时。左偏树的做法就是依靠对换左右儿子,始终把这个最近的空儿子放在右边,因此在左偏树中,每次合并都只需要在确定哪个为当前根节点以后往右走即可,时间复杂度是单log的。(我自己的想法)合并其左右儿子,把节点从堆中删除,把堆的根节点和已经合并的左右儿子再次合并(虽然常数大但是很好记,而且不用专门打一个函数)。1.合并两个堆,这就是我们前面说的。
[NOI2022] 挑战 NPC Ⅱ(树哈希) 考虑所有儿子,如果树哈希的值相同就直接匹配,否则用check判断是否匹配,最后用匈牙利跑一遍二分图匹配,看看能不能把小的那个全部都匹配掉。给你两个棵树,判断能否删去大的一棵的某几个点使得同构,保证树的大小只差不超过5。因为差最多为5,无论怎么拆5取平方,都不会大于25,所以时间复杂度为。为根的子树是否能删点使得同构。一个树哈希的题目,考虑。
[NOI2022]冒泡排序 然后我就想了一个不太严谨的贪心:小的b一定比大的b能够变化的空间更多,因此我们一定是先处理大的b,在用小的b去将就大的b。所以我们就先填大的,再填小的。然后我们可以发现,空的格子里面填的最优的数一定是从小到大的,否则交换能得到更优的结果。而且,加入我给某个格子填了i,那么这个最优的值一定是把左边连续的若干个变成i,而不会改变更大的最优的数的格子。这个线段树维护当前最优解和改成bi之后逆序对数的差值,只需要在确定某个点的之以后把左边增加1,右边减少1即可(类似)。,因为大的会覆盖小的,大的。
2024ICPC网络赛1: C. Permutation Counting 4 赛后得知这是一个很常见的套路,但自己感觉能想到行列式已经非常的不容易。而且求解行列式可以建立n+1个点,给点。连边,判断是不是树即可。原理就是线性相关的几个行向量系数都是1和-1,就相当于往左跳或者往右跳。这道题在比赛的时候被卡了很久,我尝试猜各种结论,但是发现都行不通。导致了整个比赛的节奏很糟糕。最令人难过的是,我在一本竞赛书里面查积分表的时候发现旁边已经写了这个结论。然后我就想着左端点相同的可以用最短的来消元,然后用线段树合并来维护。列全部填1,其它都是0,求这个行列式的奇偶性。
thucampday3 K. Conference 也就是外面的线段刚好保留一半,然后我就立即意识到应该只用在原来的m个里面保留前一半或者后一半,仔细思考以后发现这是正确的,因为我们只用考虑外面线段左端点的坐落在那一半里面,任何一条外面的线段属于哪一半都是可以唯一确定的,因此这样肯定是正确的。我的直觉告诉我这些线段一定是连在一起的,然后我就想处理出每个线段之后的下一条线段,然后就会连成很多棵树,然后枚举开头找连续。首先考虑怎么求最多的不相交的线段,很明显只要把所有线段的右端点排序,然后能插进去就插进去。条线段,使得最多不相交的线段为。个最多能多选多少个。
thucampday3 F. Choosing a Capital 首先,考虑怎么在固定根和最大距离d(容易想到二分)的时候判断是否可以。我们只需要不断找距离根最远的点,然后往上跳d-1个,然后把子树截掉。题意:给你一个n个点的树,你要求出以第i个点为根,把边全部变成父亲到儿子的有向边,你可以添加不超过k条有向边,使得距离根的最大距离最小,你要求出每个点作为根的答案。观察发现,相邻点之间的答案只差不超过1,因此可以先求出一个的答案,然后和换根法一起遍历一遍即可,就能优化掉一个log。然后可以想到可以用换根法来维护距离,然后二分处理。一道很有难度的题目,想了很久才有思路。
thucampday1 A. Palindromization 给你一个序列,长度为n,你每次操作可以选择任意一个区间,并给区间里面每个数加上不超过k的正整数,让你用最少的操作使得序列变成回文。1<=k<=3n<=106,特别地,当k3n<=1000。
一种后缀数组的奇妙运用 大部分人都是用后缀自动机做,我也是这样感觉的,不过想了好一会儿也没有很清晰的思路,但是突然想到了一个用后缀数组建树的方法,我2h码了7kb的代码,但是居然能够一遍过,有点不可思议。种,而且每一类必然是一直往上的一条链,我们完全可以把每一类以一个点表示,因此我们只需要建出归类以后的树即可。然后我们把原来的字典树上的点按照子树中有哪些后缀分类,总共有不超过。构成的字典树,某个节点会不会出现取决于它的子树中是否存在被选择的。反转,求所有字符串构成的trie树的大小的期望值。后缀,然后在合并后的字典树往上跳即可。