做题笔记22
这篇咋这么快就没了
11.5
P7468 [NOI Online 2021 提高组] 愤怒的小 N
计算
对于前者,由于 \(f(i)\) 是 \(k-1\) 次多项式,可以归纳得到其前缀和是 \(k\) 次多项式,于是可以拉格朗日插值做到 \(\mathcal{O}(k^2)\)
对于后者,再化一下式子
现在需要快速计算 \(\sum_{i=0}^{n-1}(-1)^{\text{popcount}(i)}i^j\),我们逐位考虑,记 \(g(x,t,c)=\sum_{i=x}^{x+2^t-1}(-1)^{\text{popcount}(i)}i^c\),有
\(g(0,t,j)\) 怎么算,考虑递推,有 \(g(0,t,j)=g(0,t-1,j)+g(2^{t-1},t-1,j)\)
后面两维状态是 \(k^2\) 的,这样可以做 \(\mathcal{O}(m^2\log n)\),打表发现当 \(x>2^c\) 时,\(g(x,t,c)=0\),所以只有 \(\mathcal{O}(m)\) 个有用的 \(x\),于是复杂度就只有 \(\mathcal{O}(\log n+m^3)\)
证明可以归纳
CF1938M Zig-Zag
直接容斥,之后做类似分拆数,直接 SEQ 合并起来即可
P8147 [JRKSJ R4] Salieri
建 ACAM,对于询问串,拉出来他在 ACAM 上跑所经过的点的集合 \(T\),\(cnt_i\) 则为代表 \(s_i\) 的节点的 fail 树上子树内,在 \(T\) 中的点的个数
考虑二分,建虚树,发现虚树上 \(u\rightarrow fa_{u}\) 这条链上的 \(cnt\) 都相同,那么只需要数这样的链上有多少点满足 \(w_i\ge \left\lceil \frac{mid}{cnt} \right\rceil\),这个可以主席树维护,总复杂度 \(\mathcal{O}(|T|\log L\log V)\)
P11057 诈骗题
首先可以说明最大操作次数 \(=n+m-1\),由于每次操作肯定会染色某一行或者某一列,所以最多有 \(n+m\) 次操作,而如果每一行都被染色了,每一列也都不能再染色了,所以最多有 \(n+m-1\) 次操作
随便构造到这个上界,只需染色任意 \(n-1\) 行,最后把每一列都染色就行了
考虑建二分图计数,连边 \(x\rightarrow y\) 或者 \(y\rightarrow x\),我们发现操作次数最多的时候一定是一棵外向树,于是可以数无根树,考虑 prufer 序列,对于左边的点,其能选的父亲一定在右边,对于右边的点,其能选的父亲一定在左边,而最后剩下两个点一定是不同侧的点,所以无根树的方案就是 \(n^{m-1}m^{n-1}\),总方案就是 \((n+m)n^{m-1}m^{n-1}\)
P11056 Fire and Big
发现膜 \(n\) 相同的只有一个是必败态,有结论,必败态的点大小不超过 \(n(\sqrt n+1)\)
考虑一个必败态的点 \(x\),其前面和他同余的肯定都是必胜态,考虑每一个这样的点 \(p\),能通过完全平方转移到它的点中必有必败的,记这个数量为 \(r(p)\),而对于每一个 \(k^2\le n\),能从 \(q-k^2\) 转移到 \(q\) 的必败点的个数至多为 \(1\),其中 \(q\) 与 \(x\) 同余,所以 \(\sum_{p<x,p\equiv x}r(p)\le\sqrt n\),那么这样的 \(p\) 的数量不超过 \(\sqrt n\),于是结论得证
直接从每个必败态往后递推就行了,复杂度 \(\mathcal{O}(n^{1.5})\)
P11058 合并香蕉
最大化 \(\sum a_ik_i^{-c_i}\),有结论,当 \(\left\{c_1,c_2,\cdots,c_n\right\}=\left\{1,2,\cdots,n-1,n-1\right\}\) 时最优
假如不满足上述条件,此时一定存在两个点,其儿子都是叶子,我们取出所有这样的点中次深的那个,记作 \(x\),其儿子为 \(a\) 和 \(b\),由于是次深的,我们一定能再找到一个和他在同一深度的点 \(y\),其中 \(y\) 的儿子分别为 \(c\) 和 \(d\),且 \(c\) 和 \(d\) 中一定有一个叶子,不妨令这个叶子为 \(c\),而 \(a\) 和 \(b\) 和 \(c\) 都在同一层,所以我们可以仍以调换 \(a,b,c\) 的位置,其答案不变,记 \(v_i=a_ik_i^{-c_i}\),所以不妨让 \((1-\frac{1}{k_c})v_c\ge\max((1-\frac{1}{k_a})v_a,(1-\frac{1}{k_b})v_b)\),现在将 \(c\) 和 \(x\) 交换位置,此时 \(d\) 子树的答案不变,\(c\) 的深度加一,\(a\) 和 \(b\) 的深度减一,则答案变化 \(\Delta\) 为 \((k_c-1)v_c-((1-\frac{1}{k_a})v_a+(1-\frac{1}{k_b})v_b)\),而 \((k_c-1)v_c=k_c(1-\frac{1}{k_c})v_c\ge 2(1-\frac{1}{k_c})v_c\ge (1-\frac{1}{k_a})v_a+(1-\frac{1}{k_b})v_b\),所以此时答案一定更优,发现每次调整之后所有叶子的深度之和加一,于是一定能调整到我们想要的局面,得证
直接二分图最大全匹配太唐了,发现 \(c_i\) 太大的时候 \(a_ik_i^{c_i}\) 就没了,所以只保留 \(\mathcal{O}(\log V)\) 个右部点即可,而在 \(k_i\) 相同时,\(a_i\) 较大的一定 \(c_i\) 更小,所以左部点也只需要保留 \(\mathcal{O}(k\log V)\) 个,直接费用流即可
P9818 游戏王
难点在于按照 \(\left\lfloor\frac{v}{i}\right\rfloor\) 划分等价类,直接猫树上做背包,容易合并,复杂度 \(\mathcal{O}(n\sqrt V\log n)\)
P11427 [清华集训 2024] 绝顶之战
考虑如果我们塞了一个段,他会把整个一维空间分成两部分,这两部分互相不影响,所以我们最后放的东西会形成一个二叉树的结构,我们考虑对这个结构进行 dp
先在外层钦定哪些东西不能选,记这个集合为 \(T\),在内层,记 \(f_S\) 为 \(S\) 这个集合最长能到多少,终止条件为 \(f_{\emptyset}=\min_{x\in T}a_x\),记 \(pre_{i}=\min\limits_{0\le j\le i,j\in T}a_j\),那么 dp 的时候,记 \(S\) 中的最小编号为 \(u\),必须 \(\sum_{x\in S}a_x<pre_u\),要不然就寄了,然后把 \(S/\{u\}\) 划分成两个子集,转移 \(f_S\leftarrow f_{T_1}+f_{T_2}+a_u\),最后令 \(f_s\) 对 \(pre_u\) 取 \(\min\) 即可
复杂度 \(\sum_{i=0}^{n}\binom{n}{i}3^i=4^n\)
P11426 [清华集训 2024] 比赛
对于一个环,记 \(w_{R<B},w_{B<R},w_{R>B},w_{B>R}\) 四种相邻位置的情况,最终这个环会贡献到 \(w_{R<B}+w_{B>R}-w_{R>B}\),而有 \(w_{R<B}+w_{R>B}=w_{B<R}+w_{B>R}\),为了方便,我们不如把所有的 \(>\) 都变成 \(<\),也就是贡献到 \(w_{R<B}-2w_{B<R}\),所以我们现在只关心 \(<\) 号了
于是我们可以记 \(f_{x,y}\) 为有 \(x\) 个 \(R<B\),\(y\) 个 \(B<R\) 的方案,这个显然不好做,考虑容斥,可以考虑算钦定 \(x\) 个和 \(y\) 个的答案,然后再两维分别二项式反演,现在考虑如何算钦定 \(x\) 和 \(y\) 的答案
我们可以发现,\(R<B\) 和 \(B<R\) 是互不影响的,所以记 \(g_x\) 为选出 \(x\) 个 \(R<B\) 的方案,\(h_y\) 为选出 \(y\) 个 \(B<R\) 的方案,此时会有 \(n-x-y\) 个连续段,所以 \(f_{x,y}\) 就是 \(g_x\times h_y\times (n-x-y-1)!\),减一是因为要固定 \(1\) 的位置
最后 ntt 做二项式反演即可,复杂度 \(\mathcal{O}(n^2\log n)\)
P8985 [北大集训 2021] 魔塔 OL
考虑如何做子问题,即给定一些 \(a,b\),询问最小的初始生命值,这看起来就很 exchange argument,我们不妨先把所有 \(a_i\le b_i\) 的放到前面并按 \(a_i\) 排序,这个很显然,对于后面 \(a_i>b_i\) 的,按 \(b_i\) 倒叙排序,证明考虑 \(\max(a_1,a_1+a_2-b_1)\) 和 \(\max(a_2,a_1+a_2-b_2)\) 中取更小的那个,分讨一下:
- 对于 \(a_2>b_1,a_1>b_2\),此时前者取到 \(a_1+a_2-b_1\),后者取到 \(a_1+a_2-b_2\),即取到 \(b_1\) 和 \(b_2\) 中更大的
- 对于 \(a_2>b_1,a_1<b_2\),此时前者取到 \(a_1+a_2-b_1\),后者取到 \(a_2\),后者更小,此时有 \(a_2>b_2>a_1>b_1\),即取了 \(b\) 更大的
- 对于 \(a_2<b_1,a_1>b_2\),和上一种情况完全对称
- 对于 \(a_2<b_1,a_1<b_2\),这种情况不可能存在
现在我们会做子问题了,且若 \((a_i,b_i)\) 已经排好序,我们可以线性递推出来答案,还要把这个东西套上四维偏序,感觉很难做
而做高维偏序有一种神奇方法,即对于每一个维度,维护前缀所对应的点的编号集合,用 bitset 存下来,最后把所有维上的 bitset 都与起来,这样可以做 \(\mathcal{O}(\frac{n^2k}{w})\) 的复杂度
那我们也可以考虑高维偏序的方法,先对原序列按 \((a_i,b_i)\) 排好序,每 \(B=\left\lfloor\log n\right\rfloor\) 个数分一块,每一块可以 \(2^B\) 从 highbit 递推出答案,然后对于每一个块,我们扫所有的询问,块内在询问区间内的数可以用刚才做高维偏序的方式查询得到,信息是好合并的,有个细节是有些点时间维的影响是一段区间,不过这个可以块内排序,做差分扫描线就行,反正我们只需要得到那个集合是啥
总复杂度 \(\mathcal{O}(\frac{n(n+V+q)}{\log n})\)
11.6
CTT 和 JOI 一块做吧,一直做 CTT 想吐
P7013 [CERC2013] History course
考虑二分答案,我们从小往大填每一个编号,记 \(sup_x\) 为 \(x\) 这条线段能填的最大值,初始 \(sup_i=n\),我们记 \(cnt_i\) 为 \(sup=i\) 的线段个数,记 \(s_i\) 为 \(cnt\) 的前缀和,假如当前该填 \(i\),如果存在某个 \(j\),满足 \(s_j-s_{i-1}>j-i+1\),这时候 \([i,j]\) 这中间的数完全不够填,直接不合法,如果存在 \(j\),满足 \(s_j-s_{i-1}=j-i+1\),这时候一定只能是 \(sup\) 在 \([i,j]\) 中的数填 \(i\),要不然就不够了,我们找到这个 \(j\),并找到 \(cup\) 在 \([i,j]\) 中的数,我们可以说明,此时选择 \(r\) 最小的线段填上,一定是最优的
结论证明可以考虑归纳,对于 \(i=j\) 的情况,结论显然成立,对于 \(j>i\) 的情况,如果此时存在两个线段 \(x\) 和 \(y\) 满足要求,且 \(R_x<R_y\),对于所有的 \(z\) 满足 \(R_z\ge R_x\),选 \(x\) 能影响到的左端点 \(\le R_x\) 的 \(z\) 肯定比 \(y\) 少,而对于 \(R_z<R_x\),肯定不存在这样的点,所以结论得证,这样我们就得到了 \(\mathcal{O}(n^2\log n)\) 的做法
考虑如何用 ds 去维护,我们把所有线段按照左端点排序,如果选择了 \(x\) 这个线段填上 \(i\),可以直接让一段前缀的 \(sup\) 对 \(i+mid\) 取 \(\min\),这段前缀就是满足 \(L_y<R_x\) 的 \(y\),为啥这样是对的,因为不交的区间,跟据我们的贪心,一定填的编号更小,所以此时不交的区间不会有影响,所以我们发现 \(sup_x\) 具有单调性,这个东西就能用脚维护了,填 \(i\) 的时候我们还要找到对应的 \(j\),可以再开一个线段树维护 \(s_i-i\),线段树上二分就行了
复杂度 \(\mathcal{O}(n\log^2n)\)
#2559. Endless Road
离散化,变成每次修改单点,我们发现如果区间 \(i\) 包含区间 \(j\),那么任意时刻都有 \(t_i>t_j\),因此我们可以把包含关系去掉,现在对于不包含的单调区间,我们称其为好的,每次修改单点时,可以二分出他会影响到的好的区间的范围,直接线段树就行了,如果一个区间被删空了,考虑加入新的好的区间,找到这些新区间可以借助两边的原有的好的区间,复杂度线性对数
#6878. 生不逢时
首先把回文转化一下,我们把每个二进制数腰斩再折起来异或,如果 \(m\) 是奇数就把中间那一位去掉,形式化一下就是一个映射 \(f(S)=\sum_{i=0}^{m/2}(S_i \oplus S_{m-i-1})2^i\),那么 \(S\) 回文当且仅当 \(f(S)=0\)
我们先考虑 \(l_i=0\) 的子问题,考虑把 \([0,x)\) 拆成若干个整区间,每个区间都形如 \([x,x+2^t)\),我们惊奇的发现,每个整区间在做了映射之后就是某个整区间重复若干次,当 \(t\le m/2\) 时,就是一个整区间,若 \(t>m/2\),会变成区间 \([0,2^{m/2})\) 重复 \(2^{t-m/2}\) 遍,于是一个 \([0,x)\) 可以看成若干个整区间的线性组合,而两个区间 \([0,x)\) 和 \([0,y)\) 的答案,就可以看作这些整区间分别做异或卷积再求和在 \(0\) 处的值
由于要对某个前缀求答案,考虑用一个数据结构在线维护,这个东西有天然的分治结构,我们可以用动态开点线段树去维护这些整区间异或卷积的结果,就是假如有两个整区间的线性组合 \((F_1,F_2,\cdots,F_n)\) 和 \((G_1,G_2,\cdots,G_m)\),我们发现 \(F_i\times G_j\) 仍然是一个整区间,如果 \(F\) 和 \(G\) 之间有包含关系,假如是 \(G\subseteq F\),其会贡献到 \(G\) 的大小次 \(F\),没有包含关系则可以直接贡献到 LCA,记 \(val_u\) 为线段树上 \(u\) 这个节点所代表的整区间被贡献了几次,再处理 \(sum_u=val_u\times len_u+sum_{ls}+sum_{rs}\),用于处理不包含区间以及儿子到父亲的贡献,可以在线段树上可以轻松维护
又考虑到异或 \(=0\),所以可以 meet in the middle,我们维护两棵这样的线段树,每次加入一个 \([0,r_i]\) 的时候,将其加入更小的那一颗,最后 dfs 算贡献,具体来说,维护 \(X\) 为 \(u\) 到根链上在第一棵树上 \(val\) 的和,\(Y\) 为 \(u\) 到根链上在第二棵树上 \(val\) 的和,最后如果 \(u\) 是叶子或者扫到了两棵树上都是空的节点,累加 \(X\times Y\times len_u\) 到答案,这样复杂度会就是 \(\mathcal{O}(2^{n/2}m)\)
若 \(l_i\ne 0\),我们可以差分成 \([0,r_i+1)-[0,l_i)\),这个是好处理的
分析一下复杂度,合并会出现 \(2^k\) 个节点,合并的复杂度也是 \(2^k\),不难得到总复杂度 \(\mathcal{O}(m2^{n/2})\)
#6537. One, Two, Three
考虑 \(1,2,3\) 和 \(3,2,1\) 肯定都是取最左边和最右边的 \(1\) 和 \(3\),且对于 \(1,2,3\),对于 \(1133\) 这种情况,肯定是第一个和第三个匹配,第二个和第四个匹配最优,那么如果 \(1,2,3\) 选了 \(x\) 个,\(3,2,1\) 选了 \(y\) 个,其 \(1-3\) 和 \(3-1\) 的形态就能知道了,现在考虑 \(x,y\) 是不是合法
现在就变成了区间和点做匹配的问题,记 \(f(l,r)\) 为完全在 \([l,r]\) 中 \(1-3\) 区间,\(g(l,r)\) 为在 \([l,r]\) 中的 \(3-1\) 区间,记 \(c(x,i)\) 为前 \(i\) 个位置中有多少 \(x\),那么有限制是对于所有的 \(l,r\),有 \(f(l,r)+g(l,r)\le c(2,r)-c(2,l)\)
我们发现 \(f(l,r)=\max(x-c(1,l)-(c(3,n)-c(3,r)),0)\),\(g(l,r)\) 也同理,这样我们能得到分别关于 \(x,y,x+y\) 的三个不等式,算就行了
构造方案直接用脚构造就完了
复杂度线性
P8989 [北大集训 2021] 随机游走
令 \(f_i\) 为从 \(1\) 走到 \(i\) 的期望步数,那么有 \(f_{i+1}=(f_i+1)\times(d_i+1)\),因为期望走 \(d_i+1\) 次才能通过 \(i\rightarrow i+1\) 这条边,于是答案就是
当 \(m<n-1\),此时给 \(n-1\) 到 \(n-m\) 分别连一条到 \(1\) 的边最优
否则,有 \(d_i\) 单调,\(d_1\) 是唯一的最小值,极差不超过 \(2\),这些都不是很好推导,但是我不想再写一遍公式了,当然也可以打表来的更快,知道了 \(d\) 可以直接算答案,复杂度 \(\mathcal{O}(T\log n)\)
P8991 [北大集训 2021] 出题高手
666 没看到数据随机
把前缀和的 localmax 拉出来,答案只可能以这些东西为端点,然后你又发现区间长度不会太长,可以瞎几把取个阈值,最后要做的就是单点修改,2-side 矩形求 \(\max\),分块即能做到 \(\mathcal{O}(n\sqrt n)\)
P8994 [北大集训 2021] 经典游戏
巴巴博弈。
SG 值为子树内的最远距离,查询的就是 \(u\) 的一级邻域以内所有的点中,满足 \(S_u<d_u\) 的个数,其中 \(S_u\) 为以 \(u\) 为根的答案,\(d_u\) 为以 \(u\) 为根的最长链
单点修改时,对 \(S\) 的影响就是子树异或,可以用树状数组维护,而我们又不能时时刻刻维护某个点邻域的答案,但是发现单点修改时,很少的点和父亲的变化是不同步的,所以我们可以考虑维护这个变化量,具体的,每个点开三个数据结构,记录 \(d_v=d_u+1,d_v=d_u,d_v=d_u-1\) 的点的变化,只需要单点修,查询时在树状数组上问出来 \(u\) 的 \(S\),然后就是在每一个数据结构上询问异或上 \(S\) 之后 \(<\) 某个值的数的个数,可以用 01trie 维护
复杂度线性对数
P8986 [北大集训 2021] 基因编辑
一个 \((x,y)\) 合法当且仅当
- \(\not\exists i<y,a_i=a_x\)
- \(\not\exists i>x,a_i=a_y\)
用脚维护,复杂度线性对数
P14382 [JOISC 2017] 开荒者 / Cultivation
发现每个草都会影响一个相同的矩形,且操作顺序无关紧要,所以答案只和这个矩形的 \(l,r,u,d\) 有关,如果两维都枚举就太唐了,我们考虑枚举其中一维,不如枚举所有可能的 \(u,d\),这样每个草都变成了一长列,然后考虑 \(l,r\) 应该取多少,我们从上往下扫每一个本质不同的行,并把能覆盖的这个行上的那些草的列坐标记下来,排序,假如分别是 \(a_1,a_2,\cdots,a_m\),那么有 \(l\ge a_1-1\),还有 \(r\ge C-a_m\) 以及 \(l+r\ge a_{i+1}-a_{i}-1\),这样我们能得到三个不等式,分别是 \(l\ge a,r\ge b\) 和 \(l+r\ge c\),那么这个 \(u,d\) 的答案就是 \(\max(a+b,c)\)。
考虑优化,我们发现,\(u+d\) 相同的图形总能平移得到,什么意思呢,考虑枚举这个 \(u+d\) 的值 \(s\),这样会有一个新的上下长为 \(R+s\) 的图形,我们截取其中任意一段 \(R\) 都能对应到原来的一组 \(u,d\),于是枚举 \(s\),不难发现这样的 \(s\) 只有 \(\mathcal{O}(n^2)\) 种,首先是 \(x_i-1+R-x_j\),另一种是 \(x_i-x_j-1\),因为如果取得是别的,我们可以调整到一个上述的情况,这样一定不劣。
现在就要对于每一个 \(s\),\(\mathcal{O}(n)\) 算出 \(l+r\) 的最小值,我们不妨把所有的点按照 \(x\) 为第一关键字排序,因为我们一个 \(R\) 的方案肯定是选的一段连续区间内的点,把所有本质不同行所对应的断点拉出来,对应了若干个极小段,即所有的 \(x_i\) 和 \(x_i+s+1\),把他们排序,如果你一个方案内选了若干个段,其会对每个段都算一遍贡献,也就是第一段中 \(a,b,c\) 对一个区间取最大值,所以我们扫我们选的段的最左边的那一个,同时双指针扫最右边那个段,使得上下长度能够到 \(R\),这样我们可以用单调队列维护 \(a,b,c\)。
而每一个本质不同的行都是 \(a\) 上一段区间,于是他的 \(a,b,c\) 可以提前预处理出来,记一个 \(f_{l,r,0/1/2}\) 就行了。
做完了,复杂度 \(\mathcal{O}(n^3)\)。
P14383 [JOISC 2017] 港口设施 / Port Facility
搞笑题,不过这是不是数字树来着,直接建图,看一下是不是二分图就完了,计算一下连通块数
P14387 [JOISC 2017] 火车旅行 / Railway Trip
不想管倍增了,感觉太难了
考虑把不停靠任何站能够直接互相到达的点连边,我们连出来的一定是一张平面图,因为这是一个笛卡尔树的结构,考虑三角剖分,做边分治,算 \(\min(\text{dis}(u,A)+\text{dis}(v,A),\text{dis}(u,B)+\text{dis}(v,B))\),最短路可以直接跑 bfs,复杂度线性对数
P14392 [JOISC 2017] 都市 / City
太神了,完全不是人
维护 \(dfn_u\) 和 \(siz_u\),\(dfn\) 我们完整存下来,考虑用较少的数存 \(siz_u\)
我们用一个数列 \(f\) 去逼近 \(siz\),即对每一个点找到第一个满足 \(f_i\ge siz_u\) 的 \(i\),再给 \(u\) 补上 \(f_i-siz_u\) 个虚儿子,这个数列需满足 \(f_{511}\ge 2^{19}\) 且 \(\sum f_i-siz_u\le 2^{19}-n\)
考虑构造一个等比数列,令 \(f_i=\left\lfloor(1+q)^i\right\rfloor\),其中 \(q\) 为一实数,这样每个点加的虚叶子都不超过 \(siz_u\times q\),由于树高小于等于 \(19\),所以总点数不超过 \((1+19q)n\)
可以令 \(f_i=\max(f_{i-1}\times q,1)+f_{i-1}\),这样可以节省一些信息
可以任取 \(q\in[0.022,0.045]\)
11.7
摆烂了一下午
模拟赛
T1
威风极了我看积分微分改哦另外几个人愤怒悲伤的反馈
T2
十六分九二五九开发二人可根据巴尔瓦人口阿尔文日本
T3
考虑枚举排列
T4
有把数拆成 \(a2^k\) 的做法,这样点数是 \(n+\left\lfloor\frac{n}{2}\right\rfloor\),考虑拆成 \(a2^x3^y\),每个 \((a,6)=1\) 的 \(a\) 有一个杨表,我们只需要取杨表中恰好 \(>n\) 的那一些数,串成一条链,这样能构造到所有的数了,比如:
选出来红的就能构造到所有的黑的,由于每一列就一个,所以这样每个 \(a\) 会有 \(\left\lfloor log_2{\frac{n}{a}}\right\rfloor+2\) 个,可以稍微放缩估计到一个上界是 \(\sum_{i=1}^{n}[3\not\mid i]+[(6,i)=1]\),但是我不知道怎么估计到最紧,反正只有在 \(n\equiv 1,5\bmod 6\) 的时候这个值才有可能是 \(n+1\),我们可以找到 \(x,y>\frac{n}{2},\text{lcm}(x,y)\le Y\),然后加入 \(x-\text{lcm}(x,y)-y\),这样最大就是 \(n\) 了
P3665 [USACO17OPEN] Switch Grass P
重构链,可删堆维护即可
P7214 [JOISC 2020] 治療計画
把一个治疗计划丢到二维平面上,其能影响到的范围是一个等腰直角三角形,如果两个治疗计划 \(i\) 和 \(j\) 满足 \(|t_i-t_j|\le r_i-l_j+1\),那么他们能影响到更大的区域,于是考虑从最左边的治疗计划向右扩展,我们发现可以最短路,记 \(dis_i\) 为 \(i\) 这个治疗计划,治好全部 \(1\sim r_i\) 的人的最小代价,用线段树维护点权即可,而每个点只会被松弛一次,复杂度线性对数
P3615 [JOISC 2016] 如厕计划 / Toilets
男的看成 \(-1\),女的看成 \(1\),则需要满足任意后缀和大于等于 \(-1\),每次当然是把一个男的调整到最开头最优,计算最小后缀和即可
P6891 [JOISC 2020] ビルの飾り付け 4
考虑朴素 dp
- \(f_{i,j,0}\rightarrow f_{i+1,j+1,0}\),\(a_{i+1}>a_i\)
- \(f_{i,j,1}\rightarrow f_{i+1,j+1,0}\),\(a_{i+1}>b_i\)
- \(f_{i,j,0}\rightarrow f_{i+1,j,1}\),\(b_{i+1}>a_i\)
- \(f_{i,j,1}\rightarrow f_{i+1,j,1}\),\(b_{i+1}>b_i\)
写成 bitset 的话,发现转移都是取并再位移至多一位,考虑到 \(f_{i,0}\) 和 \(f_{i,1}>>1\) 互相有包含关系,所以可以归纳证明当 \(i\) 固定时,\(j\) 必是一段连续的区间,于是可以线性做了
P7212 [JOISC 2020] ジョイッターで友だちをつくろう
启发式合并,维护所有团
P7213 [JOISC 2020] 最古の遺跡 3
扫值域插数爆了,从前往后扫爆了,考虑从后往前扫,我们惊奇的发现某个点最后的状态只和后面的点的状态有关,且是一个 \(\text{mex}\) 状物,具体的,考虑如果当前在 \(i\),那么 \([i+1,n]\) 中最后如果至少剩下了 \(1\sim x\),那么 \(i\) 填 \(x\) 就被消了,这看起来就是一个需要贡献提前计算的 dp,于是直接记状态 \(f_{i,j}\) 表示考虑了后 \(i\) 个柱子,最后剩下的柱子在后 \(i\) 个中的 \(\text{mex}\) 为 \(j+1\),为了方便,我们可以给每个高度标号,最后除以 \(2^n\),记 \(u\) 为 \([i+1,n]\) 中没了的个数,\(v\) 则反之,考虑转移
若 \(i\) 最后消失了,其高度在 \([1,j]\),直接转移 \(f_{i+1,j}\times (2j-u-j)\rightarrow f_{i,j}\)
若 \(i\) 没消失,且其不会改变 \(\text{mex}\),这个点最后的高度一定 \(>i+1\),直接转移 \(f_{i+1,j}\rightarrow f_{i,j}\),其贡献我们待会再算
若 \(i\) 没消失,且其会改变 \(\text{mex}\),此时的转移较为复杂,这个点最后的高度一定是 \(i+1\),枚举新的 \(\text{mex}\) 为 \(k\),其后面的点的系数为 \(\binom{v-j}{v-k+1}\),而当前的点可以填 \([j+1,k]\) 中的任意一个,则系数为 \(2(k-j)-(k-j-1)=k-j+1\),而后面的点具体的形态,我们发现其只与 \(k-j\) 有关,有 \(k-j-1\) 个这样的点,于是不妨记 \(h_{n}\) 为 \(n\) 个点,最后被消成连续的且都还在方案数,则有转移 \(f_{i+1,j}\times\binom{v-j}{v-k+1}\times(k-j+1)\times g_{k-j-1}\rightarrow f_{i,k}\)
现在考虑算 \(g\),枚举第一个的高度,其实和上面的转移是一样的,则有 \(g_{i-1}\times g_{n-i}\times \binom{n-1}{i-1}\times(n-i+2)\rightarrow g_n\)
复杂度 \(\mathcal{O}(n^3)\)
P7215 [JOISC 2020] 首都
点分治,如果选了当前分治中心的颜色,那么颜色等于分治中心的点,他们到分治中心上所有其他颜色的点都得选上,用队列和树上并查集一直维护这个过程即可,当然也可以建图跑tarjan,如果碰到了某个颜色在子树外面的点直接寄了,复杂度线性对数

浙公网安备 33010602011771号