做题笔记24
11.13
P14002 [eJOI 2025] Navigation
如果是一棵树,可以用 \(2\) 标记父亲,用 \(1\) 标记已经遍历过的点
如果是仙人掌,考虑一个 \(8\) 字,在两个环交点处,会有两个父亲供你返回,如果返回了错误的节点就会使得另一个环上的子树无法被遍历,现在我们要处理的就是多个父亲的问题,而由于是仙人掌,每个点邻域中 \(2\) 最多有两个
假如在 \(u\) 的邻域中有两个 \(2\),\(v\) 是对的父亲,你观察一下他的俩父亲有什么特征,我们发现错的那个父亲的邻域中会有两个标记为 \(2\) 的点,而正确的只会有一个,所以我们可以走到其中一个点,判断是不是正确的父亲,再把信息传回来,由于我们想要走回来,可以先给 \(u\) 的颜色设置成 \(3\),此时 \(u\) 的邻域中应该有 \(2\) 有 \(1\),所以可以给那个点的颜色设置成 \(0\),否则设置成 \(2\),这样不会影响其他点的信息,接下来我们要走另一个颜色为 \(2\) 的点,如何和前一个点区分?可以在 \(u\) 的颜色不是 \(3\) 的时候,从前往后找 \(2\),否则从后往前找 \(2\),这用到了邻域点顺序不变的条件,这样我们就能找到父亲了
但是当起点在环上怎么办,其也可能作为那个错误的父亲被经过,但是走到他那儿也是没问题的,最多就会再走一遍 \(u\rightarrow v\) 的环
P14450 [ICPC 2025 Xi'an R] Directed Acyclic Graph
有一个想法是构造两排点 \([1,k]\) 和 \([k+1,2k]\),使用前后缀优化建图使得 \(i\) 不能到达 \(k+i\),即可以到达 \([k+1,k+i)\cup (k+i,2k]\)
把原来两排的点分裂成三个,上面的是 \(A,B,C\),下面的是 \(a,b,c\),使得存在可达关系
- \(a_i\rightarrow b_i\rightarrow c_i\)
- \(A_i\rightarrow B_i\rightarrow C_i\)
- \(A_i\rightarrow b_{k+i}\)
- \(B_i\rightarrow c_{k+i}\)
- \(C_i\rightarrow a_{[k+1,k+i)\cup (k+i,2k]}\)
默认选了 \(1\),那么对于第 \(i\) 组
- 选中 \(A_i\) 会导致 \(l+i\) 只有两个点可达
- 选中 \(B_i\) 会导致 \(l+i\) 只有最后一个点可达
- 选中 \(C_i\) 会导致 \(l+i\) 没有点可达
- 不选点则 \(l+i\) 所有点均可达
这样大概可以构造 \(\mathcal{O}(n+4^{\frac{m-n}{5}})\)
Topcoder-12703 LittleElephantAndBoard
我其实没看懂题解在说什么
发现只有 \((RG,GB,BR)\) 和 \((GR,RB,BG)\) 两种情况,每种情况三种状态之间可以互相转移,考虑第一种情况最后给答案乘二,可以解方程把三个状态的个数解出来,唯一的限制就是不能相邻,用脚算就完了
AT_arc188_d [ARC188D] Mirror and Order
首先稍微观察一下,最终排序之后,每个长度为 \(3\) 的数组的开头肯定是 \(1,1,2,2,3,3,\cdots\),而且如果满足了每一位都取满了 \(1\sim n\),肯定不存在 \(s_i=s_j\) 或者 \(t_i=t_j\),对于 \(s_i=t_j\),其应当有 \(s_{i,1}=t_{j,1}=s_{j,3}\),那么首先不能有 \(s_i=t_j\),也就是不能存在 \(s_{i,1}=s_{i,3}\),而且肯定不可能存在这种情况:\(s_{i,1}=t_{j,1}=s_{j,3}\),此时 \(i\ne j\) 了,所以 \(s_{i,2}\ne t_{j,2}\),也就是说,对于开头不同的串,其可以直接通过开头来比大小,对于开头不同的串,一定可以用第二位比了
那考虑如果给定了一个 \(a\) 和 \(b\),如何判断他是否合法,跟据上面的推理,首先不能存在 \(a_x=2i-1\) 和 \(a_y=2i-1\),那就考虑 \(a_{x}=2i-1\),\(b_{y}=2i\) 的情况,我们不妨令 \(c_i=s_{i,2}\),那么对于这样的一堆 \((x,y)\),一定有 \(c_x<c_y\),那么我们将大小关系建图,如果出现了环就寄了,反之我们能通过拓扑排序构造全序集,于是这就是一个充要条件
现在去考虑这张图的形态,一个重要的观察是,这张图上所有点的度数都为 \(2\),也就是说如果忽略掉边的方向,所有的连通块都是环,考察一下边是怎么连的,每个 \(2i-1\) 和 \(2i\) 对应了一条边,于是我们不妨令 \(\left\lceil\frac{a_j}{2}\right\rceil\) 为 \(j\) 这个东西的新编号,\(p_j=\left\lceil\frac{b_j}{2}\right\rceil\),那么每一条边就是 \(j\) 和 \(p_j\) 之间的边,这条边的方向取决于啥呢,仅取决于 \(a_{p_j}\) 膜 \(2\) 的值,也就是当 \(a_{p_j}\equiv 0\bmod 2\) 的时候,有 \(j\rightarrow p_j\),否则就是 \(p_j\rightarrow j\) 了
那什么情况是不合法的呢,也就是某个环上所有边的方向都相同,即这个环上的 \(a_i \bmod 2\) 全都相同,这个条件足够简单,可以考虑计数了,现在有些 \(p_i\) 没有确定,于是有若干个环和链,环不用管,其中 \(\bmod 2\) 全是 \(1\) 的链的个数记作 \(c_1\),全是 \(0\) 的记作 \(c_0\),否则记作 \(c_2\),考虑容斥,枚举全是 \(1\) 和全是 \(0\) 的链各自组成环的方案,剩下的随便,则有
其中 \(g_{i,j}\) 为 \(i\) 个链选出 \(j\) 个环的方案,\(\text{cyc}_n\) 为 \(n\) 个链组合成若干个环的方案,其实 \(\text{cyc}_n\) 就是 \(n!\),这个推导放到最后再说,你发现 \(k\) 和 \(l\) 之和 \(i\) 和 \(j\) 有关,所以考虑算
直接递推啊,有 \(f_{n}=-\sum_{i=1}^{n}A(n-1,i-1)\times f_{n-i}\),那么原式就是
这样就能 \(\mathcal{O}(n^2)\) 计算了,但其实当 \(n\ge 2\) 时,有 \(f_n=0\),当然你可以归纳证明这个东西,但是更有道理的说法是,因为当 \(n\ge 2\) 的所有置换中,偶数个环的方案和奇数个环的方案是相等的,交换 \(p_1,p_2\) 即可构造双射
那么可以 \(\mathcal{O}(1)\) 计算答案,复杂度线性
记 \(C(x)=\sum_{i\ge 0}\text{cyc}_i\frac{x^i}{i!},B(x)=\sum_{i\ge 1}(i-1)!\frac{x^i}{i!}=\sum_{i\ge 1}\frac{x^i}{i}=-\ln(1-x)\),于是有 \(\text{cyc}_n=[\frac{x^n}{n!}]\exp(B(x))=[\frac{x^n}{n!}]\frac{1}{1-x}=n!\),当然也可以直接是每次要么塞到一个数的末尾,要么新开一个环
P12558 [UOI 2024] Heroes and Monsters
先将 \(a,b\) 分别排序
如果确定了 \(a\) 中选了 \(k\) 个,\(b\) 中肯定是前 \(k\) 小的和 \(a\) 的被选了的一一匹配,后面的和 \(a\) 中没被选的一一匹配,这样可以做一个 \(\mathcal{O}(n^3)\) 的 dp,即记录 \(f_{i,j,k}\) 为对于给定的 \(k\),前 \(i\) 个数里面匹配上了 \(j\) 个
但是你发现,如果最终确实有 \(k\) 个匹配上了,那么 \(a_i>b_k\) 选不选是不会矛盾的,于是可以直接记 \(f_{i,j}\) 为考虑了前 \(i\) 个,匹配了 \(j\) 个,\(g_{i,j}\) 为考虑了后 \(i\) 个,没匹配 \(j\) 个,那么有 \(ans_k=\sum_{x=0}^{k}f_{p,x}\times g_{n-p,x+n-p-k}\),其中 \(p\) 为最大的 \(i\) 满足 \(a_i<b_k\)
复杂度 \(\mathcal{O}(n^2+q)\)
P14473 [集训队互测 2025] 少年汹涌
首先考虑 \(n=1\) 怎么做,由于每一次走的都很少,这样对大的位影响比较小,所以你肯定是每一个进位去分段,那么这时候肯定会考虑到,每一次进位的时候,都是形如 10...000xxxxxx 的东西,也就是只有后 \(6\) 位有东西,如果是进位到 \(i\),那么 \(7\sim i-1\) 位上全是 \(0\),于是你可以记转移数组 \(f(i,j,k)\) 表示进位到 \(i\),前面的 popcount 是 \(j\),后 \(6\) 位为 \(k\),进位之后后六位的值,记 \(g(i,j,k)\) 为他需要走多少步,我们不考虑 \(i<6\) 的,对于 \(i=6\) 可以暴力预处理,则有转移:
- \(f(i,j,k)=f(i-1,j+1,f(i-1,j,k))\)
- \(g(i,j,k)=g(i-1,j,k)+g(i-1,j+1,f(i-1,j,k))\)
现在考虑 \(n>1\),考虑建树,要求的就是虚树的节点个数,于是考虑用 \(f\) 和 \(g\) 数组去做这个过程,建虚树要做什么呢,一是求 LCA,而是求 dfn 序,先考虑怎么求 LCA,我们当然可以直接模拟倍增的过程做,求深度就是 \(n=1\) 的答案,但是这样复杂度就太高了,因为你预处理 \(2^k\) 这个东西实在是太唐了,我们预处理出来的东西本身就有很好的倍增结构,我们可以给两个数同时从低往高做,使得这两个数在某一位和更高的位上都一样,然后在从高到低做,和倍增差不多
比较 dfn 序,可以求出 LCA 后,找到 \(x\) 跳到最大的小于 LCA 的那个数,这个东西在树上就是 LCA 在 \(x\) 那个子树方向上的儿子,可以比较这样的儿子的编号,即可比较 dfn 序
视 \(w\) 和 \(\log L\) 同阶,则预处理复杂度 \(\mathcal{O}(\log^3 L)\),排序复杂度 \(\mathcal{O}(n\log n\log L)\),总复杂度 \(\mathcal{O}(n\log n\log L+\log^3 L)\)
#160. 树形背包
本来想做互测题来着,但是似乎把这个技巧忘了,记 \(f_{i,j}\) 表示考虑了 dfn 在 \([1,i]\) 中的,体积为 \(j\),那么有转移
- \(f_{i,j}\leftarrow f_{i-1,j-w_i}+v_i\)
- \(f_{i,j}\leftarrow f_{i-siz_i,j}\)
复杂度 \(\mathcal{O}(nm)\)
P14471 [集训队互测 2025] 火花
考虑 \(t=0\) 怎么做,发现就是一个树上依赖背包,记 \(f_{i,j}\) 表示 \(i\) 子树内选了 \(j\) 个,那么有转移:
- \(f_{i,j}\rightarrow f_{i+siz_i,j}\)
- \(f_{i,j}+k\times v_i\rightarrow f_{i+1,j-k}\),其中 \(k\in [1,\min(j,c_i)]\)
第二种转移可以用单调队列维护,复杂度 \(\mathcal{O}(nk)\)
我们受到上面的启发,从 欧拉序 考虑 dp,我们想要同时决策每个点是不是在第一部分的 \(t\) 个点中,记这个东西为 \(g_i\in\left\{0,1\right\}\),以及每个点到选了几个第二部分 \(k\) 中的物品,记欧拉序序列为 \(e_{1\sim 2n}\),\(i\) 的第一个欧拉序为 \(l_i\),\(i\) 的第二个为 \(r_i\),那么我们可以考虑在 \(l_{e_i}\) 处决策第二部分,在 \(r_{e_i}\) 处决策第一部分
但是有一个问题,我们在决策第二部分的时候,其选择的物品的数量的上界是受子树 \(g\) 的和影响的,这太报了!但是我们充分利用欧拉序的优势,直接记 \(t'\) 为 \(i\) 后面所有点的 \(g\) 的和,这样,当前点能选的第二部分的个数的上界就是 \(\min(c_{e_i}-t',j)\),如果 \(u\) 不选物品,其实际上还可以决策其子树内的 \(g\),于是可以记 \(s_i\) 为 \(i\) 到根链的 \(v\) 的和,记 \(S(u,i)\) 为 \(u\) 子树内前 \(i\) 大的 \(v_i\) 的和,记 \(f_{i,j,k}\) 为考虑了欧拉序前 \(i\) 的,第二部分选了 \(j\) 个,当前的 \(t'\) 为 \(k\),于是有转移:
- 当 \(l_{e_i}=i\)
- \(f_{i,j,k}+S(e_i,x)\rightarrow f_{r_{e_i}+1,j,k-x}\),其中 \(x\in[0,k]\)
- \(f_{i,j,k}+xv_{e_i}\rightarrow f_{i+1,j-x,k}\),其中 \(x\in [1,\min(j,c_i-k)]\)
- 当 \(r_{e_i}=i\)
- \(f_{i,j,k}+xv_{e_i}\rightarrow f_{i+1,j-x,k}\),其中 \(x\in [0,\min(j,k)]\)
- \(f_{i,j,k}+xv_{e_i}+s_{e_i}\rightarrow f_{i+1,j-x,k-1}\),其中 \(x\in [0,\min(j,k-1)]\)
只有第一种转移不能用单调队列优化,预处理 \(S(u,i)\) 直接做就是 \(\mathcal{O}(nt)\) 的,于是这样可以直接做到 \(\mathcal{O}(nkt^2)\)
你发现这种转移在固定 \(i,j\) 的情况下,可以把贡献函数写成 \(w(l,r)=S(e_i,r-l)\) 的形式,这样你发现可以直接决策单调性优化,分治转移即可,复杂度 \(\mathcal{O}(nkt\log t)\),可以直接通过
当然这题还有和 \(\mathcal{O}(nk^2t)\) 平衡到 \(\mathcal{O}\left((nkt)^{\frac{4}{3}}\right)\) 的做法,不愿意去想了
11.14
棍母
棍母棍母棍母,棍母棍母棍母棍母棍母
棍母
棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母
棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母
棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母
棍母棍母棍母棍母棍母
棍母
棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母
棍母
棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母,棍母棍母,棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母,棍母棍母 棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母
棍母
棍母棍母棍母棍母棍母棍母棍母棍母,棍母棍母棍母棍母棍母棍母棍母棍母
棍母
棍母棍母棍母棍母棍母
11.15
P9523 [JOIST 2022] 复制粘贴 3 / Copy and Paste 3
记 \(dp_{l,r}\) 为凑出 \([l,r]\) 的答案,枚举 \(k\),然后找到最大的一个 \(p\),使得 \([l,r]\) 在 \([p,r]\) 中不重复地出现了 \(k\) 次,那么有转移
以及
转移复杂度 \(\mathcal{O}(n^2\log n)\)
怎么找 \(p\),预处理出来两个后缀的 lcp,然后一直跳就完了
AT_jsc2019_qual_f Candy Retribution
首先差分一下变成 \([0,R]-[0,L-1]\),考虑枚举中间那个数是 \(x\),那么你的限制就是有 \(n-m\) 个数 \(< x\),\(m\) 个数 \(\ge x\),且存在一个数 \(=x\),存在一个数 \(=x\) 可以直接差分,那么考虑数有 \(n-m\) 个数 \(< b\),\(m\) 个数 \(\ge a\) 的方案,记作 \(f(a,b)\),经典的,考虑把前面那个小于号容了,有
答案即为 \(\sum f(x,x)-f(x+1,x)\),里面的求和有个调和级数的玩意,总复杂度 \(\mathcal{O}(R\log R)\)
AT_agc068_c [AGC068C] Ball Redistribution
点击洛谷标签发现有基环树,那么每次操作相当于把基环树上一个点的入度全都断开,然后把他们连成任意的环,你发现这个操作实在太多了,于是倒序考虑,每次操作就相当于把一个环拆掉,都接到一个入度为 \(0\) 的点上,或者每次拆掉一个环,接到一个环上入度为 \(1\) 的点上
于是 \(u:n\sim 1\),考虑每次拆掉哪个环,你发现把 \(u\) 所在的连通块上的环拆了是最优的,因为此时其他点的策略都不变,为啥呢,因为你考虑到此时只会影响 \(u\) 和那个环上的,本来那个环上的就只有入度为 \(1\) 的能操作,而且肯定也是拆掉那个环,且你操作之后入度就是 \(0\) 了,那个环上其他的点本来就不能操作,你操作 \(u\) 之后肯定变得更能操作了,于是你直接这样做就完了
直接全都暴力做可以分析到一个上界是 \(\mathcal{O}(n\sqrt n)\), 只要能分析环长总和就行了,其复杂度为 \(\mathcal{O}(\sum L)\),记一个势能函数 \(\phi(S)=\sum d_i^2\),考虑每次操作的时候环上所有点的度数减一,所以势能减小至多 \(2n\),同时 \(u\) 度数增加环长,势能增加至少 \(L^2\)
势能上界为 \(n^2\),总减小量 \(\le 2n^2\),那么势能增加量 \(\le 3n^2\),则有 \(\sum L^2\le 3n^2\),可以柯西不等式得到 \(\sum L\) 是 \(n\sqrt n\) 级别的
但是你进一步观察这个题,很难发现有充要条件:若存在一个点 \(u\),其不在环上的入点 \(v\) 的子树中所有点都 \(<u\),那么无解,必要性显然,充分性你感受一下也是每次断开其所在连通块的环,这样可以做到线性了
CF2084H Turtle and Nediam 2
完全没迈出第一步
缩连续段,段数为 \(m\),考虑每次操作对于连续段的修改
- 选择一个 \(i\in [1,m]\),且 \(a_i\ge 2\),操作 \(a_i\leftarrow a_i-1\)
- 选择一个 \(i\in[3,m]\),且 \(a_i=a_{i-1}=1\),删除 \(a_{i-1}\),操作 \(a_{i-2}\leftarrow a_{i-2}+1\)
- 若 \(a_{2}=a_{1}=1\),删除 \(a_1\)
你发现 \(a_m\) 只会进行第一种操作,于是可以只管前 \(m-1\) 个 \(a\),最后给答案乘上 \(a_m\),dp,要数本质不同的子序列 \(b\),考虑在最小的能构造到 \(b\) 的前缀计数,我们先考虑 \(b\) 的开头和 \(a\) 开头一样的,于是记 \(f_i\) 为 \(b\) 末尾最后匹配到 \(a_i\) 的方案,转移的话考虑每次新开一个连续段,于是枚举 \(i\),记录一个变量 \(x\),表示能开的连续段的上界,然后枚举 \(j:i+1\sim m-1\),每次先 \(f_j\leftarrow f_i\times (\max(a_j,x+1)-x)\),然后 \(x\leftarrow \max(a_j,x+1)\),这样做就是 \(\mathcal{O}(m^2)\) 的,最后答案即为 \(a_m\sum [(m-i)\equiv 1\bmod 2]f_i\),初值 \(f_1=a_1\),\(f_{2k+1}=1\)
优化这个转移,单调栈出来 \(nxt_i\) 表示最小满足 \(\equiv i\bmod 2\) 的 \(j\),且 \(a_j-\frac{j}{2}>a_i-\frac{i}{2}\),两个 \(nxt\) 之间的转移系数是一样的,于是可以暴力跳 \(nxt\) 然后做差分,复杂度是 \(\mathcal{O}(n)\) 的,因为每个 \(a_i\) 至多被之前的 \(a_i\) 个数跳到
CF1477F Nezzar and Chocolate Bars
考虑算 \(\sum_{k\ge 0}P(x> k)=\sum_{k\ge 0}(1-P(x\le k))\),如果 \(n=1\),我们可以考虑计算把 \([0,L]\) 这个区间分成 \(m+1\) 段,每一段都 \(\le k\) 的概率,这个就是 \(P(x\le m)\),那你考虑可以把他写成一个生成函数 \(F_i(x)\),最后你把所有的生成函数都乘起来就能算出来答案了,经典的,我们考虑容斥,那么 \(m\) 段的答案就是
那么生成函数写出来就是
后面那个东西很好看,单拉出来耍耍
带回原式:
记 \(G=\prod F_i\),最后你要求的是 \(\sum_{i\ge 0}(1-i![x^i]G(x))\),你发现 \(G\) 一定能被标示成一堆 \(x^*\left(e^{x}\right)^{*}\) 的线性组合,但是前面那个 \(1\) 贼犯人,但是你观察到当 \(l=0\) 的时,所有的 \(F_i\) 都只剩 \(\exp\left(\frac{L_i-kl}{L}x\right)\),你把他们全乘起来就是 \(e^x\) 了,正好和前面的 \(1\) 相抵消,于是你只需要算 \(x^{i}(e^x)^j\),\(i,j\ne 0\) 的贡献就行了,其贡献为
直接把系数暴力 dp 出来就完蛋了,但是 \(j=L-kt\),此时 \(i\in [t-n,t]\),所以状态数是 \(\mathcal{O}(\frac{n\sum a_i}{k})\) 的,总复杂度 \(\mathcal{O}(n\left(\frac{\sum a_i}{k}\right)^2)\)
P10433 [JOIST 2024] 棋盘游戏 / Board Game
你发现 \(2\sim k\) 的决策都是独立的,而且你直觉上有两个决策,一个是从一个点走到一个 \(1\),然后 101010...,另一个是走到一个和 \(1\) 相邻的 \(1\),然后 111111...,于是不妨记 \(s(v,i)\) 为 \(v\) 这个点,经过 \(i\) 个黑点的最小代价,你把他画到二维平面上,就是一个从 \((1,\text{dis0}(v))\) 开始,斜率为 \(2\) 的,和一些乱七八糟的折线,然后一个斜率为 \(1\) 的,其中 \(\text{dis0}(v)\) 是和 \(v\) 最近的黑点的距离,然后你发现那些乱七八糟折线都是不优的,于是只需要保留斜率为 \(2\) 和斜率为 \(1\) 的那俩玩意,那么 \(s(v,i)\) 肯定能写成 \(\min(i+f_1,2i+f_2)\) 的形式,这俩常数也是好求的,你可能需要求 “从 \(u\) 开始到最近的相邻黑色点对的最短距离”,这个可以 01bfs(我怎么把这个玩意忘了,维护双端队列,\(1\) 放队尾,\(0\) 放队首,每次访问队首)
那么你现在可以得到一个 \(S(i)=\sum s(v,i)\),那么有 \(ans_T=\min_{i\ge0}(S(i)+\text{dis}(T,i))\),其中 \(\text{dis}(T,i)\) 为从 \(1\) 开始走到 \(T\) 经过 \(i\) 个黑色点的最短路,你求这个玩意需要 \(\mathcal{O}(n^2)\),你发现有 \(K\le 300\) 的部分分,而且 \(N\le 5\times 10^4\),考虑阈值分治
先考虑 \(K\) 在因子上怎么做,你考虑到 \(S(i)\) 是 \(\mathcal{O}(K)\) 段的,那不妨枚举每一段直线,你发现这时候 \(S(i)\) 的贡献很舒服,就是经过一个黑点就加上斜率的贡献,那么这样就可以直接跑 dij 了,复杂度 \(\mathcal{O}(NK\log N)\)
\(K\) 在分母上没有什么直接的做法,接着发掘一些性质,很难发现有 \(S(i)-S(i-1)\ge K-1\),那么对于一个 \(ans_T\),有一个上界 \(S(c)+N\),其中 \(c\) 是从 \(1\) 走到 \(T\) 经过黑点的最小数量,如果最后是取到了 \(S(c+\Delta c)\),那么肯定有 \(S(c+\Delta c)\le ans_T\le S(c)+N\),那么有 \(\Delta c\le\frac{N}{K-1}\),于是你可以直接记 \(\text{minc}_u\) 为走到 \(u\) 经过的黑点的最小数量,那么我们只需要维护 \(\text{dis}_{u,i-\text{minc}_u}\) 了,直接 bfs 就行,复杂度 \(\mathcal{O}(\frac{N^2}{K})\)
平衡一下得到总复杂度 \(\mathcal{O}(N\sqrt {N\log N})\)
P14424 [JOISC 2014] 邮戳收集 / Collecting Stamps
先直接从左往右走完了,然后你发现可以在某个地方往上走,往左走,中间可以上下横跳一下,最后再下来,你发现这个是一个匹配状物,于是可以 dp,记 \(f_{i,j}\) 表示考虑了前 \(i\) 个,从上面往下走了多少个,则有转移
- \(f_{i,j}\leftarrow f_{i-1,j}+u+v\)
- \(f_{i,j}\leftarrow f_{i-1,j}+e+d\),其中 \(j>0\)
- \(f_{i,j}\leftarrow f_{i-1,j+1},u+e\)
- \(f_{i,j}\leftarrow f_{i-1,j-1}+d+v\)
最后 \(f_{i,j}\leftarrow f_{i,j}+2jT\),你发现其实每次可以匹配不止一个,同层直接顺序转移即可,复杂度 \(\mathcal{O}(n^2)\)
AT_abc418_g [ABC418G] Binary Operation
建自动机
AT_agc052_e [AGC052E] 3 Letters
在膜 \(3\) 意义下考虑,那么需满足 \(a_{i}\equiv a_{i-1}\pm 1\pmod 3\),于是可以刻画出来一个这样的 \(a\) 序列,每一次操作就是给某个位置加二或者减二,那么首先需要满足 \(a_i\equiv b_i\bmod 2\),那么答案大概就是 \(\sum\frac{|a_i-b_i|}{2}\),你发现这时候 \(a_i\) 和 \(b_i\) 都是差分数组,并不知道 \(a_1\) 和 \(b_1\),那么我们不妨令 \(a\) 的初值就是 \(s_1\),\(b_1\) 不知道,但是他得满足和 \(a_1\) 奇偶性相同,而且其应该和 \(a_1\) 膜 \(3\) 相同,也就是 \(b_1=a_1+6k\),那么答案就是
那么你取一个 \(|a_i-b_i|\) 的中位数就能取到最小值
AT_agc069_a [AGC069A] Schedule Optimization
你发现一场比赛的胜者一定是 \(r\) 最大的,记 \(R_u\) 为 \(u\) 子树内 \(r\) 的最大值,记 \(f_{u,i}\) 为 \(u\) 子树内在 \(i\) 天处比赛的代价,不妨设 \(R_v>R_u\),那么有转移, \(f_{u,i}+f_{v,j}+\max(j-R_u,0)\rightarrow f_{w,k\ge \max(i,j)}\),就是直接拐点合并,复杂度 \(\mathcal{O}(n2^n)\)
AT_agc068_a [AGC068A] Circular Distance
考虑钦定选中 \(0\) 号点,最后给答案乘上 \(\frac{L}{n}\),因为你每个点会在每个方案中被钦定 \(1\) 次,观察一些性质,首先考虑枚举 \(d\) 为那个距离,数合法的太难受了,直接数 \(\le d\) 的方案就完了,那么你每个被选的点会有一个马蹄形的合法区间,即若选了 \(x\),其他的点必须在其对应的区间中
到这就不好想了,你考虑选中了 \(0\),那么所有的点不能在 \([d+1,L-d-1]\) 中,你难以发现,能选的点恰好被划分到了两个区间,且这两个区间内的点都是互相满足限制的,于是只需要考虑不同侧的点的限制,我们考虑 \([L-d,L-1]\) 那一部分的点,如果我们选了 \(x\),\([x+d+1,x+L-d-1]\) 就寄了,此时我们进行一个魔法操作,将 \(x\) 往正方向平移直接 \([d+1]\) 个单位,令 \(len=L-2d-2\),那么如果选了 \(x\),本来在另一侧的点就不能选在 \([x,x+len]\) 这一段区间里的了,那么你现在就把原问题转化成了,给你一个区间 \([1,d]\),你可以选中一些点并黑白染色,要求每个黑色点往后 \(len\) 个位置都不能填白的
那我们的限制只对某两个相邻的连续段有作用,于是考虑枚举有多少个黑接白,设为 \(i\),那么 \(d\) 的答案就是
第二个系数是为啥来着,有 \(i\) 个黑接白,那至少有 \(2i+1\) 个连续段(\(0\) 的颜色是白的),最后还可以有一个任意长的黑段,于是可以补上一个点,然后选出 \(2i+2\) 个段
枚举 \(d\) 的时候有个调和级数,所以总复杂度 \(\mathcal{O}(L\log L)\)

浙公网安备 33010602011771号