record 6.20-6.26
* D1 B
非常好赤石场,使我的领带旋转。
省流:t1 是集训队互测的神秘科技题,t3 是 cf *3500,只有 t2 还稍微能补一点。
t2 是这么个东西,给你一个树,然后你要构造一个排列(指定为普通排列或者圆排列),要求走的路径总长度是 \(k\)。
因为圆排列没有破坏任何对称性,更简单一点,所以我们先看看圆排列。
有一个想法:如果我们能找到 \(k\) 有解的一些必要条件,那么这些条件其实往往是充要的。
我们尝试来这么找一下。首先找找上下界,显然每个边至少要被走 \(2\) 次,至多被走 \(2\min(sz_u,sz_v)\) 次。并且显然每个边被走的都是 \(2\) 的倍数次,那么我们求和得到上下界,猜测在这个范围内的偶数都是可以构造出来的。
事实上,确实如此。
这东西构造起来相当困难,我们先从极端情况入手。比方说最少的时候,显然按照任意一个欧拉序来走就可以了。比方说最多的时候,这个就稍微有点困难了,我们要求每个边都要取到自己的最大值。
考虑到 \(\min\) 是非常讨厌的,我们尝试钦定一个根,让子树内较小,子树外较大。这个根就是重心。
这个时候答案就化简成了 \(2\sum dep_{p_i}-2\sum dep_{lca(p_i,p_{i+1})}\le 2\sum dep_{p_i}=C\),等号成立当且仅当 \(\forall i,lca(p_i,p_{i+1})=rt\),也就是说相邻两项都来自不同子树。
因为根是重心,所以没有子树大小大于 \(\lfloor\frac n2\rfloor\),所以确实能够构造这样的一个排列,只需要我们每次贪心取最大的就可以了。
剩下的问题是,怎么构造其他的 \(k\)。一个想法是基于这个最大的情况往下调整,具体来说,我们考虑增大 \(\sum dep_{lca(p_i,p_{i+1})}\)。
考虑把所有同一子树内的点在排列中标记出来。我们先钦定它们内部的顺序是 dfs 序,这样的好处在于如果大家都合并成一个区间的时候能取到最小值。
然后你为了增大 \(\sum dep_{lca}\),一个有效的方法就是把一些同子树的点合并起来。对合并之后的部分,再去跑之前的算法就行了。
问题是,这东西是我们想合并多少就合并多少的吗?是这样的。
我们指出,只考虑其中一个子树的时候,我们的策略就是选出相邻两项合并之后影响最大的,贪心进行合并。如果超过了,我们就在这个子树里继续找,声称一定可以恰好找到合适的位置。
换句话说,我们声称一个子树内可以凑出来 \([0,\sum]\)。我们声称,如果存在 dfs 序相邻的两个,满足 \(dep_{lca(p_i,p_{i+1})}=x(x\ge 1)\),那么就一定存在另外一个 \(j\),满足对应的值是 \(x-1\)。
首先如果 \(i+1\) 是 \(i\) 的儿子那没啥好说的,其次就是不是儿子的情况,那你简单看一下就知道确实有了。
这样的话,我们确实可以证明它们能连续地凑出所有需要的东西。
还剩一个问题,就是我们仍然需要保证 \(mxsz\le\lfloor\frac n2\rfloor\),仍然每次操作最大的子树就可以了。
现在你会了环排,问题是怎么做普通排列。
我们把普通排列当成是环排去掉一部分。仍然先考虑必要条件。
最小应该在欧拉序去掉直径取到,最大应该在我们之前的最大值去掉 \(1\) 取到,并且没有奇偶性的限制。事实上这也是充要的。
我们考虑一部分用环排列删掉 \(1/2\) 来取到,但是还有一部分没办法取到,具体而言就是在最小值附近的部分取不到。
这部分我们可以找一个直径,然后删掉其中一个端点到另外一个点的一部分,这样显然是存在一个合法的 dfs 游走顺序的。
最后一部分就是怎么给环排列删掉 \(1/2\),这个显然就是要求我们开头和结尾必须间隔 \(1/2\)。
如果是 \(1\),我们可以把一个子树的第一部分放到开头,最后放上一个根。
如果是 \(2\),显然这需要我们的两个子树的根节点凑到一起。开头就不说了,结尾的话我们只需要把那个排列倒过来就行了。
D2
怎么打得这么糖???
不要觉得这东西很困难所以就没啥想的动力,哪怕最后没想出来正解,思考的过程对你而言也是有意义的。
不要老去想别人怎么样,实际上自己认真打也不会太差。打到什么排名就是什么排名,排名很重要但不是一切。
以及再锻炼一下实现能力和调试能力。
* D2 A
咋一万个人都会啊,我觉得有点困难的。
这个东西问你 \(n\) 个点非自同构的图的边最多有多少条。
我们发现,最多有多少条是比较稠密的,所以它的反面就是比较稀疏的。并且,我们发现反过来之后显然仍然满足它不能自同构,所以问题可以转化成求最少有多少条。
怎么做呢?没啥头绪,所以我们先手画一些小样例。6 15-9=6 7 21-15=6,你发现这个量级大约是略小于 \(O(n)\) 的,所以我们就猜测这个东西是森林(这有道理吗?)
如果这个图包含若干个连通块的话,我们知道每个连通块都必须是非自同构,并且也不能跟别人同构,这是充要条件。
因为我们需要的是边最少,所以想一想能不能让每个连通块都变成树。
考虑一个非树连通块,显然这个连通块大小 \(\ge 6\),否则没有合法解。我们把它替换成一个树的情况,然后接到这些连通块当中最大的那个树当中。
额这部分我其实还不是很明白,姑且认为答案确实是森林。
因为森林满足 边数=点数-连通块数,所以我们希望最大化连通块个数。如果我们知道大小为 \(n\) 的森林有 \(f_n\) 个,那么我们就可以贪心构造了。如果最后剩了一些也无所谓,接到最大的一个树上就行了。我们只讨论可行性,又不需要真的构造。
问题完全转化为求 \(f_n\),可是实在有些难求,它的限制是非自同构的无标号无根树个数。
我们先去学习一下无标号无根树怎么计数的,然后使用类似的技巧。
这个题,场上觉得要么很难要么很简单,一直在找规律啥的,没想啥正经做法。感觉以后肯定还是要先认真对待每个题才行啊。
然后我们看看是怎么计数的。先假装我们知道了无标号有根非自同构树的个数是 \(f_n\)。
为了计算无根的情况,我们仍然进行容斥。
额我看懂了,挺有道理,这种技巧应该还有类似的应用。
?* D2 B
正解非常长,不是很懂,所以我们说一个部分分。
我们看一下 \(n\le 2\times 10^5\) 怎么做。一个直观的想法就是 kruskal,问题存在大量的边是没有用的,我们如果能只算那些有用的边就很好了。
或者说,我们接下来会进行一系列操作,操作是直接连两个点,或者连所有 \(d\) 的边,或者询问当前连通块个数。
有一个方法是使用 ST 表,在第 \(i\) 层中 \(u,v\) 连通表示存在 \(u+j,v+j(j\in[0,2^i))\) 的连边。
你考虑这个关系有没有传递性,发现是有的,如果 \(u,v\) 有边,\(v,w\) 有边,那么 \(u,w\) 显然也可以有边。
然后如果第 \(i\) 层两个点真正被合并了,那么我们就在 \(i-1\) 层合并相应的两组点。这样,显然每次操作都会合并两个点,而点的个数不是很多,所以就正确了。
这个东西是这么考虑的。你发现你希望查询 \((u,v),(u+1,v+1),\dots,(u+k,v+k)\) 哪些是没有连边的,你只需要维护每个区间是不是都有连边,就可以类似于在线段树上 dfs 来做。
这样,对于每个区间而言,我们都需要维护 \(O(r-l)\) 个 \(d=v-u\) 的值,但是为了维护这些东西我们还需要维护以每个位置为左端点,每个位置为右端点的答案,你发现没啥优化。
这里你发现,刚刚说的那个传递性的东西。然后可能就有 ST 表了。
[IOI2020 Mushrooms]
考虑我们当前已经知道 A,B,还不知道的是 S。接下来的询问,可以 B?B?B?B?B?B 这样就可以知道所有的里头 A 有多少个。
所以如果我们知道了 x 个 B,那么接下来就可以使用 O(n/B) 来完成这个事情。
对对对,dwt 说了这个做法,好像可以过 70 pts,还不错。
就是我们问 2sqrt(n) 次先知道前缀,然后拿更大的那个给问出来,这样是根号的。
然后有一些常数优化。
我们可以一次操作知道两个值,只需要 [A,x,A,y],这样就可以同时知道了。另外就是可以 A?A?A?A? 这样可以同时多知道一个数。
然后我们分两个阶段来做这个事,分界线通过什么奇怪的 DP?来找分界线。
正解需要进一步卡常。
D3
今天题目好多了,但是我打得还是有点一言难尽。为啥全世界都会 A 就我不会啊???
全是暴力。
今天节奏本身还行,可能写代码的时间稍微有些久,不过这个是写这些部分分不可避免的问题。
有点错误估计题目的难度了,本来感觉挺好,出来之后发现大家都会。
问题主要出在第一个题没想出来。不过如果我有后面的分可以打,A 的贪心又已经假了一次的话,我可能还是会去先打后面的,这个策略本身并没啥问题。
不过写代码可能还是不是很紧张,就是觉得自己已经写得差不多了。
A 题属于我不是很擅长的类型。但是我似乎任何分析都不是很擅长,这就很寄,因为什么题都是要分析的。
B 题有点没想到一维 NTT。
C 题感觉这个转化我不一定想得出来,写了这个已经差不多了。
大胆一点。
多尝试,多玩玩。
* D3 A
其实关键性质我已经知道了,但是还是没做出来,先说说做法。
我们把这个过程想象成从高位到低位往里头依次填数,这样我们会有一个很自然的想法:当要填 \(0\) 的时候我们填入当前剩余较短的那一段,当要填 \(1\) 的时候我们填入较长的那一段。
这个贪心是错误的,原因在于,如果要填 \(1\) 的时候,我们填到了更小的那段,但是接下来还有一些 \(1\) 能把长的给补回来,那么这样的操作反而把较短段的 \(0\) 后移了,得到更优的解。
但是经过简单思考,我们猜想,\(0\) 的填法是正确的,无论怎样我们都是要填入较小的那一段。事实上这是可以证明的。
接下来我们需要决策这些 \(1\) 填到哪里,\(0\) 会随之填入。问题是 \(1\) 的决策会影响 \(0\) 填到哪里,很麻烦。
事实上,我们可以证明,原本较长的那一段在填的过程中始终保持较长。
考虑两段同样长的时刻,接下来再填一个数,显然填到哪里是完全无所谓的,所以我们调整为填到原本的较短段,这样它就永远较短了。
因此,我们知道在较短的填满之前,\(0\) 一直会填到较短段。所以我们枚举较短段填入的最后一个数,接下来需要在它前面选择若干个 \(1\) 填入较长段当中,显然会找最靠后的若干个 \(1\)。
然后这样是平方的,我们枚举的同时维护增量就可以做到线性了。
但是好像他们的贪心大多数不是这么个东西,问问。
额看了一眼 zzk 的,他写的大概就是说,如果是 \(0\) 就填到小的,如果是 \(1\),就看看能不能给小的填,给小的填需要满足首先这些位置更高的要都能填上 \(1\),也就是说,找到这么多 \(1\),然后这之中的 \(0\) 要能塞到更小的当中。
感觉这个也很对,而且好写一万倍。我们就写这个了。
场上应该多想想的,就是考虑这个 \(1\) 怎么决策,还是能说清楚的。
D3 B
有点糖了。我写了个东西然后说这是二维 NTT,其实确实没问题吧,但是你仔细看一眼发现做一些一维 NTT 就可以了。
这个因为过程中没必要逆回来,你大概感受一下,所以复杂度是 \(O(n^4+n^3\log n)\) 的,所以就可以了。
唉,场上觉得这东西是个逆天东西,写了一会发现写不动就没细想了。但是其实能 NTT 来着。
* D3 C
首先 \(O(nk\log n)\) 是简单的。然后听说有人直接卡过去了。
然后我们就是要做到 \(O(nk)\) 左右。怎么办呢?可能会想一些数据结构。
但是 sol 里面说我们还要进一步转化。
考虑给 \(1\) 加一个父亲 \(0\),这样一个区间是合法的,相当于我们去数连通块的根恰好是 \(1\) 个,相当于我们去数那些自己在这个区间里,父亲不在这个区间里的点的个数,要恰好是 \(1\) 个(事实上不会 \(<1\))。
也就是 \(\sum_{u=l}^r[fa_u<l]+[fa_u>r]\),把它拆开,在做 \(r\) 的扫描线的时候右侧是单调的,因此我们可以求出是 \(0/1\) 的区间。左侧需要进一步分析。
考虑到一个点 \(u\) 的贡献相当于是对 \([fa_u,u)\) 上加 \(1\)。而这都是后缀修改,所以我们可以维护两个栈,然后加 \(1\) 就是删掉一个后缀加到下一个里头。
然后前缀和一下我们就可以查询区间的和了。这不是很难,总之我们可以做到线性。
这个连通条件的转化可以记录一下。
[GYM102028 J]
好像会了。
你考虑如果拿走一块地毯怎么做。统计只被一块地毯覆盖的位置,取最大就行了。
考虑两块地毯。统计被 \(1/2\) 块低糖覆盖的位置,然后这相当于一张图,有点权有边权,你可以选择两个点,然后让点权加上它们之间的边权最大。
显然,如果你吃了边权,你就枚举这个边来算。如果你没吃边权,你就取 mx mxx 就行了。
主要是,这个 \(m\) 小得不正常,所以就可以做了。
额,他想说的重点不是这个,看一下 sol 吧。
* [CODE FESTIBAL 2016 Final E]
不会。
[CF1239 E]
先想一个子问题:如果我们已知上面的是 S 下面的是 T,那么上面递增下面递减。这个过于显然了。
然后你就喜提一个 \(\binom{2n}{n}\) 的做法,烂完了。
注意到这样两个前缀和都是凸的,\(s\) 是下凸,\(t\) 是上凸。
或者说我们直接考虑路径吧。你发现右移一位就是加一个上面的然后减掉左下的,你发现这个变化量是递增的。
所以这个和是一个下凸的形状,也就是说,最大值一定在两侧取到,也就是说,是一个整块的和加上一个最小值。
所以说,相当于你要把这些数划分成两个大小相等的集合,然后要最小化 \(\max(sum_1+mn_2,sum_2+mn_1)\)。
我们干脆枚举另一个最小值,然后就相当于知道了 \(mn_1,mn_2\),然后相当于现在两个数分别是 \(x,y\),然后要让最大值最小。这东西可能能做。
哦,然后你发现没必要枚举,另一个最小值显然是次小值。
然后剩下就是要一个背包一类的东西,简单做。
很有意思的题,做起来连贯性很强。
?* [QOJ 5874]
这个题好像见过,但是不太会。
平方数要么是数论,要么是用于复杂度分析。
有人爆了个类似于 meet in the middle 的东西,我们分高位和低位,然后对情况少的爆搜。
然后如果高位更少,你发现它基本决定了低位是啥,我们平方根,然后加 \(O(1)\) 次就行了。
如果低位更少,(2k+x)2=2{2k}+2x+x^2,如果 \(x\) 是偶数,我们枚举最后的后缀零长度,就转化成了奇数。
哦哦,然后你从低到高去确定平方根的二进制表示。
* [ARC160 E]
挺有意思的。
我们先尝试刻画点双,发现比较困难。注意到 \(deg\le 3\),所以,对于 1 度点删掉它没要求,对于 2 度点,要求它删掉之后的两个子树有边;对于 3 度点,要求三个子树连通。
然后,观察到一个下界是所有叶子的和。尝试对叶子进行匹配。
如果叶子偶数个,那么直接以重心为根匹配不同子树两个点即可,可以证明是对的。
如果叶子奇数个,我们肯定要多取一个点,不妨取全局最小值。然后再做这个,这个会出问题,分析一下出问题的情况,仔细做做。
另一种常见的匹配方式,就是找叶子的 dfs 序,然后前一半跟后一半一一对应地匹配。
D4
卡常题\tuu\tuu\tuu。
这一场时间分配上可能有点问题。A 这个卡常先假了一次,然后又花了很多时间调试,卡常,所以在 A 上面花了很多时间但是没有很好的结果。
BC 时间就不太够了,只来得及打一些简单的暴力。
C 暂且不论,B 的话,感觉有很多人做出来节哀啊。这方面我的观察性质啥能力是不是有点太差了,一直都是短板,但是不是很会锻炼啊。这咋办。
是不是你场上真的很难有什么有用的思考,基本都是在干脏活?
TODO:今天讲了很多有用的组合思考方式,记录一下。
D4 A
没啥好说的,就是那个做法。但是这个 log 在根号外面。
正解就是把 log 搞到根号里头去,方式就是把排序改成归并。很没意思。
* D4 B
好的果然就是这样的偏序对的东西,我看了一下挺容易想到的啊,为啥场上没想出来。
场上我知道了,可能能作为支配对的,可能是 \(j,(i,j),(i,k)\),然后我尝试进行了一些做法发现不太对。
但事实上就是 \((i,j)\) 的偏序对。我们发现,如果在区间 \((i,j)\) 中还存在一个比它大的,那么我们可以改过去,一定会变得不劣。
这个我感觉就是你要确定怎么去评判一个 \((i,j)\),你发现因为对询问会有影响所以两个互相包含的可以评价,并且因为有和所以和的可以评价,因为对 \(k\) 有限制,所以限制弱的可以评价。
同时满足这三者,恰好就是这当中还有一个比它大的时候满足。因此 \(a_i,a_j\) 是区间最大/次大值。
考虑这样的区间有多少个,考虑一个单调栈的过程你就知道一共有 \(O(n)\) 个,因此考虑它们的影响用数据结构随便做做就行了。
这个题真的应该会的。感觉就是在考场上会很不一样,有些题就是没想法。所以我们不光要训练思维,还要训练在考场上的思维。
这题没啥思维含量,为啥没做出来呢?可能还是时间有点紧张了。
* D4 C
sol 好长啊。
前面 \(O(n^4)\) dp 是 trival 的,然后观察的有用的不是很多,改成记忆化搜索,但是我不是很会分析复杂度。
然后一个优化就是把转移改成 NTT,这样他说复杂度就变成了 \(O(n^2\log n)\)。
尝试分析复杂度。我们为了计算 \(f(n,m,i)\),如果 \(n\) 是奇数,接下来会计算到 \(f(\frac{n-1}2,*,i)\),如果 \(n\) 是偶数,接下来会计算到 \(f(\frac n2,*,i),f(\frac n2-1,*,i)\)。
注意到计算 \(f(n,*,*)\) 可以打包考虑,因为反正这些位置大约都是要计算的。因此我们考察怎样的 \(n\) 会被算到。
考虑一奇一偶两个数 \(2k,2k+1\),它们会用到 \(k-1,k\) 这两个数;如果是 \(2k-1,2k\),那么会用到 \(k-1,k\),所以每一层只有 \(2\) 个数是有用的,而每递归一层,规模减半,所以也就 log 层。
我之前证明的时候,想在二进制上考虑,发现这个情况很复杂。转化成这样之后就好多了。不过自己试试应该也能试出来。
因此如果你算 \(f(n,*,*)\) 是 \(F(n)\) 那么总复杂度就是 \(T(n)=F(n)+T(\frac n2)\)。
这些不用动脑子的机械优化我还是会一点的。
[LOJ 2159]
我不会最小圆覆盖啊,但是他说这个东西存在一个 \(O(k)\) 求 \(k\) 个点的算法,不支持增量。
所以我们就二分一个界,然后每段去倍增就行了。复杂度 2 log。
* [QOJ 7303]
你考虑设计权值,给每个点集赋权。
我们想要当这个点集是连通块的时候,就是 \(1\),否则是 \(0\)。当然这是在 \(\bmod 2\) 意义下的。
考虑 \(2^{scc}\bmod 4\)。而 \(2^{scc}\) 可以当成是每个连通块黑白染色,也就是每个点黑白灰染色,要求没有黑白边的方案。
[ARC160 D]
我们考虑把操作二记在它的开头位置,显然可以进行一个规范化,如果操作超过 \(k\) 次就换成操作一。
接下来,我们不考虑操作一,只有操作二,然后这东西显然操作方案唯一,因此我们只需要对操作来计数。
然后就会了。
D5
不是啥心态啊放个纯纯卡常题到 A???来报复社会的吗?
B 为啥写挂了啊???唉不过这个最后才看出来,时间不太够没来得及拍也很正常。
C 不会,不做评价。但是暴力都写错了我不好讲。
咋连着五天爆炸。我有点急了,这样怎么 noi?
今天的我好失败,B 也是假的。一车人优化 DP 过了。为啥我总是想不到大众都能想到的东西?
D5 A
哈哈,卡常吧。\(O(n^3)\to O(\frac{n^3\log n}w)\to O(\frac{n^3}w)\)。
无语了,打完暴力之后想了很久这东西怎么做,中间也考虑过这东西是不是没啥 \(O(n^2)\) 做法,但是直接胡的是 \(O(\frac{n^3\log n}w)\) 做法,写完感觉卡常没啥救啊,就不想了。
D5 B
你观察到,可以增量贪心。
所以变成了纯粹的数据结构问题,polylog 做法是 KTT,肯定没人会去写。
我们考虑分块,每个块维护凸包就行了。因为各个东西都有单调性,所以复杂度是单根号。
好像不太对。他说这里需要加一个反悔,就是支持把已经加进来的给删掉。
相当于我们说是一个数加进来之后就不会被删掉了。他说一个数加进来之后再被删掉,就不会再加进来了。
这个东西 ds 部分不变。我拍拍看是不是这个东西的问题。
听说另外一种做法是你暴力用平衡树维护那个 dp,然后做一些什么神秘东西。这个之后也要想一下。
ok 调了一下,不反悔大概真的是错的。但是似乎小样例总是能过,大的总是过不去。好吧,很有意思。
? D5 C
是个 JOISC2017 来着,做法很复杂,不会。
* [Dwango Programming Contest 6th] Cookie Distribution
考虑组合意义,相当于每个孩子再选一个曲奇。
[JOISC 2015 D2] Keys
这个我之前好像见过。
就是你发现,这个门的状态会由上一个人更新。也就是说,这东西没啥后效性,所以我们考虑相邻两个人之间的时间间隔,分四类讨论,你就知道该怎么搞了。
接下来就是若干个链,然后有点权有边权,然后你随便 dp 一下就会了。
* [JOISC 2020 D4] 治疗计划
你把这个情况看成是在二维上的东西,然后有一些位置有区间。我们可以在时间轴上穿越,考虑最后一个治疗方案从 \(1\) 开始不断拓展治疗前缀。
两个位置能不能拼起来,就看更早的那个区间斜着移过来能不能拼上。这样就能转移了,然后使用类似 Dijk 的转移方法。
[JOISC 2020 D3] 星座 3
这个东西我看过,当时好像会做一点,然后不想写。
做法很简单,你考虑有一些点对是不能同时选的,具体来讲,如果两个点之间的最大值比较小值要小,那就产生一对限制。
考虑怎样刻画这样的限制。我们发现,会跟一个点产生限制的区域是一个 3-side 矩形(钦定只考虑比它高的),我们在这个矩形当中找一个最低的,然后发现这个点的限制一定比原本要强,所以向它连边。
额,他说的是一个基于笛卡尔树,然后线段树合并。感觉没那么牛。
! [AGC038 E] Gachapon
AGC E/jy。
这个东西是不是啥 minmax 容斥啊。
我们考察集合 \(S\) 中存在条件被满足的期望时间。
感觉可以数学爆推啊。
这里的数学处理手段很有意思,可以学习一下。
简单来说,对于无穷情况,我们考虑有贡献的部分。比方说,虽然枚举 \(S\) 后中间可能有非常多次在 \(S\) 外的部分,但我们可以算一下下一次出现某一个数的概率,然后直接算。
* [AGC033 D] Complexity
这咋不会呢?
有个暴力 dp,不说了。
然后你观察到,这个 dp 的值域不大。具体来说,是 \(\log(n)+\log(m)\),所以我们交换值域和一个定义域就行了。
然后再利用单调性啥的做做。
D6
还可以。不过这些都见过。
为啥不会 B???是不是又没脑子了???
TODO:拉格朗日插值二
D6 A
我们把状态精细化实现一下,你发现这个状态数就是 \(n\) 个数的和 \(\le n\) 的方案数,然后你感受一下不是很大。
哦不对,严格的说是 \(x\) 个数的和 \(\le n\),方案数是这些数 \(+1\) 乘起来,然后你发现肯定是全部相等的时候最大,然后你求个导发现是 \(e^{\frac ne}\)。
* D6 B
不是很会。我只会做 \(n\le 2\),因为此时不会走“回头路”,所以可以分治。
哦我会了。你观察可能走回头路的路径,发现它一定要过中点。所以你先算出来过中点到每个点的方案,然后再做一做啥的。
哦不对。
哦他分析一下,发现这样的路径只可能先横着走,然后竖着走到底,然后再横着拐回来。
哦然后我们记录边界三个点两两真正最短路就行了。
就差分析这个路径的性质这一部分了。额似乎不分析也可以。
不是很想写这个东西。我们先简单整理一下这两天的内容,然后再看吧。
D6 C
你观察到,我们先把重量是 \(i\) 的合并起来,每个组内部都是凸包。
然后你注意到,第 \(i\) 组模 \(i\) 同余的部分是满足决策单调性的,那你做就行了。
现在不是很懂这个题了。
* 小 Q 的序列
想想有没有组合意义。不太有的样子。
他说是优化朴素 dp。这咋优化,整体 dp?不太能做吧。
做法有点逆天,他往 string 数上去凑出来一个结果,然后其实本质还是考虑组合意义,只不过原问题很难看出来。
[JOISC 2017 D3] 自然公园
没看懂啊,这询问有啥用啊。
我们考虑一个简单的情况,如果整张图压根就没有边,我们至少需要多少次才能发现这个事。
这样的话,你任意进行询问,发现你知道信息最多的也就是每次询问全集,然后就知道这两个点不在同一个连通块里头。
可这真的不需要 \(O(n^2)\) 次询问才能得到答案吗?否则我随便往里头塞一条边,你都找不出来。
哦 m 是不是告诉你的。那没事了。
不对,这也不行。他肯定少写条件了。
果然,限制了这是个连通图。
D7
今天整体而言还算正常。
A 是个简单推推题,但是好像搜系数的方法反而更好一点。
B 不会,这个应该是我是唐诗。
C 是个简单题,组合练手题难度,没啥好说的。
C 花的时间有点太久了,场上真这样肯定不行。其实也没啥难写的,不知道为啥写了很久,又调了很久。
D7 A
另一个做法是,我们观察发现答案是 \(n\) 个球放到 \(k\) 个盒子里,每个盒子都要非空的方案数的线性组合。
然后你细想一下,发现很有道理。因为任意两个的交都是存在的,所以你可以拆分出来若干个基础单元。你把基础单元当成盒子就行了。
我好像在具体的小情况里陷得太深了,应该有一个整体的想法。
* D7 B
既然都想到网络流了,为什么不多用一点呢?
事实上,我们把不能重复的要求也建到网络流里头,然后就可以构造方案了。
不是这也是唐题啊???为啥我都想到 flow 了没有继续想呢???这就很逆天!!!
[CCPCF 2023 E] Min 或 Max 2
很有意思的题。
我想到了,如果最后取到的答案是 \((a_u,b_v)\),并且 \(u<v\),那么其实 \(u\) 之后怎么选是固定的。
但是我没发现 \(b_v\) 只有两种取值可能,就是这之后的选法带来的 min 和 max。
我们考虑怎么判断能不能取到这两个值,这需要维护当取到 \(a_u\) 的时候另一个值的最大最小值,这个可以在线段树上做一做,就可以了。
然后如果 \(u=v\),判定方法是看前一个位置的取值之类的。
[Shenzhen 23 C] 报数 Ⅲ
我们考察如何判断一个 01 串视作 \(k\) 进制之后是否被 \(7\) 整除,这是容易的,因为我们可以把它看成是多项式,这样,只需要检验当 \(x\in[2,8],7\not\mid f(x)\) 就可以了。
进一步,因为模数是 \(7\),所以 \(a^6\equiv1(\bmod 7)\),所以我们只需要保留 \(x^0,x^1,x^2,x^3,x^4,x^5\) 前面的系数就可以了,而这些系数显然都是 \([0,6]\) 的,所以一共有 \(7^6\approx 10^5\) 种系数,其中只有一些是合法的。
下面的问题是怎么统计每种系数有多少个。
我们把原 01 串每 6 个一组来考虑,它们恰好会影响每个系数各一次。接下来唯一的问题就是小于条件带来的限制。
我们考虑每次锁定一个前缀,然后考虑所有可能的后缀,这个东西是 trival 的,所以就可以做了。
我真牛。
哦不太行,复杂度有点高。
注意到,我们只需要 \(x\in[1,6]\) 的值,因为 \(x=7\) 只需要判最后一位。
注意到,\(4,5,6\) 进制等价于 \(-1,-2,-3\) 进制,然后就相当于奇数位偶数位分开考虑,然后仍然枚举前缀,然后做一些什么神秘东西,还要做容斥啥的,后面不是很懂。
看懂了,这个是说,你奇偶分开做数位 dp,状态数都是 \(3^6\) 的,所以是可以做的。然后你考虑两个东西拼起来,比方说枚举偶数位状态,这会限制一些奇数位状态不能选,但是每个维度至多两个,我们钦定必须选某一个,做一遍前缀和啥的就行了,复杂度 \(O(n21^3)\)。
还是有点意思的。

浙公网安备 33010602011771号