2025.1/2 做题记录 / 血污染上被斩断的念想 被杀死的愿望

P8349

总量一定的难以做问题可以考虑根号分治。

首先暴力很好做 \(O/q(c_x+c_y)\),那么记忆化之后小块对小块 & 大块对大块就做好了。

大块对大块做好了是因为一个大块最多被 \(O(\sqrt n)\) 个数凑成对,就是 \(\sum_{x 是大块颜色} c_x\times \sqrt n\leq n\sqrt n\) 这样子。

然后还有一个看着很难做的大小块交叉贡献,手腕可以发现可以使得区间相等的区间中的大块点只有 \(O(c_{\min\leq \sqrt n})\) 个。

大概思路是这样,代码还没写,具体的肯定比这个描述困难很多。


P6646

先考虑一种颜色 \(w_1,\dots,w_{len}\) 里面选 \(res\) 个的情况,肯定是要构造搜索小根堆的。不重不漏的秘诀是先移动右边的再移动左边的以及状态那一步是刚动的,那么设计状态 \((i,j,k,ans)\) 表示前 \(i\) 个没有动,正在移动的在 \(j\),当前移动不能超过 \(k\),目前的代价和是 \(ans\),用 \(d(x)\) 表示从 \(x-1\) 移动到 \(x\) 的代价差,特别的 \(add(1)\) 表示放在开头的代价,那么转移有两种,移动现在要移的 \((i,j,k,ans)\to (i,j+1,k,ans+d(j+1))\),或者考虑移动下一个 \((i,j,k,ans)\to (i-1,i+1,j-1,ans+d(i+1))\),这样可以做到不重不漏保序,转移条件是显然的。想要拓展到 \(res\in [L,R]\) 种颜色其实可以直接 \((i-1,i+1,len,ans)\to (i,i+1,len,ans+w_i)\),但这个题目可以不用,直接暴力加入就可以了,但是注意 \(R\gets \min(R,len)\) 这样。

考虑 \(m\) 种颜色每种颜色选一个的情况,还是肯定要构造搜索小根堆的,不重不漏的秘诀是一行一行搜着选,那么设计状态 \((x,y,ans)\) 表示搜到第 \(x\) 种颜色,当前颜色选择第 \(y\) 大,目前代价和是 \(ans\),用 \(add(c,x)\) 表示颜色 \(c\)\(x-1\) 大变成 \(x\) 大的代价差,特别的 \(add(c,1)\) 表示最小代价,转移的话肯定就是 \((x,y,ans)\to (x,y+1,ans+add(x,y+1))\)\((x,y,ans)\to (x+1,2,ans+add(x+1,2))\) 还有 \((x,2,ans)\to (x+1,2,ans+add(x+1,2)-add(x,2))\),为了保证最后一个的保序性应该颜色应该按照 \(add(c,2)\) 升序排序。

前者可以做到 \(O(\log)\) 抓取下一大的,总的抓取次数不超过 \(O(K)\),每次抓取最多多一位,记忆化的话可以直接套入第二种做法,注意特判认真处理 \(L_i/R_i=0\) 的情况。


P11364

真是的真是的真是的。

先考虑怎么快速求 \(dep_{LCA^*(l,r)}\),对于每一个 \(x\) 考虑 \(1\to x\) 的路径序列,\(dep_{LCA^*(l,r)}\) 就是 \(x=l,\dots,r\) 的序列的 lcp。区间 lcp 问题类似 SA 那样,可以求出 \(h_i=lcp(str_{i-1},str_i)=dep_{lca(i-1,i)}\) ,那么要求的这个就是 \(\min_{i=l+1}^r h_i\)。预处理 \(h\) 和其 ST list 之后可以做到 \(O(1)\) 查询 \([l,r]\)\(dep_{LCA^*(l,r)}\)

然后发现有用的贡献答案的 \((x,y)\) 可以并不多,如果 \(ans(x,y)=ans(x-1,y)/ans(x,y+1)\)\(ans(x,y)\) 就没用。对于一个合法区间我们考虑从哪里拓展开来,显然是 \(\min_{i=x+1}^y h_i\) 那里可以转移到。考虑从 \((i-1,i)\) 开始拓展,对应的 \((x,y)\) 唯一,最终有用区间只有 \(O(n)\) 个,这个二分求出即可,复杂度 \(O(n\log n)\)

现在问题变成了 \((x,y,ans)\) 在满足 \(|[x,y]\cap[l,r]|\geq k\) 时向 \((l,r,k)\) 贡献,求询问三元组得到的最大贡献。 条件是 \(\min(R,y)-\max(L,l)+1\geq k\),做 4 次三维偏序可以做到 \(O(n\log ^2 n)\)。但是其实可以通过分类讨论做到 \(O(n\log n)\),首先注意到对于 \(x\leq l\) 或者 \(y\geq r\) 的是好做的,以前者为例,因为 \([l,r]\) 一定可以考虑在 \([l,l+k-1]\) 贡献,只要再加上一个限制 \(l+k-1\leq y\) 就能二维偏序了。我们现在应该针对 \([x,y]\subseteq[l,r]\) 的情况想想怎么做到 \(O(n\log n)\),现在有三个要求,\(y-x+1\geq k,l\leq x,r\geq y\),我们寻找联系,\(r\geq y\geq x+k-1\geq l+k-1\),不难发现在满足 \(y-x+1\geq k\)\(l+k-1\leq y\leq r\) 的情况下合法,这个很好扫描线,按照 \(k\) 双指针变成维护动态加入查询,是单点取 \(\max\) 和查询区间 \(\max\) 这样,这个同时也包含了 \(x\leq L\) 的情况,所以做了这组之后只要再做一遍上面说的 \(y\geq R\) 的情况即可,其实也可以扫描线。


AT_cf17_final_j

inf=1e13 调了好久好久,都怪 lyl。

先介绍一种好想无套路的做法,我最开始的思路比较偏 mst 不指向这种所以没想到,所以这里补充一下。直接从贡献入手,计算根到点的距离 \(len\),那么 \(w_x+w_y+dis(x,y)=(w_x+len_x)+(w_y+len_y)-2\times len_{lca(x,y)}\),枚举最好下手的 \(lca\),合并子树的贡献就是 \(val_x=w_x+len_x\)\(x\in L,y\in R\)\(val_x+val_y\uparrow\),明确一点如枚举的祖先是 \(lca\) 的祖先那对答案没有影响不必理会,注意到在 mst 中跨越的边数最多只有 \(\min(|L|,|R|)\) 条边,那么希望 \(|L|,|R|\) 尽量接近,又因为这个相当于合并集合而不关心根,点分治即可。会求出 \(n\log n\) 条边,补做 mst 就是 \(O(n\log^2 n)\) 的。

然后就是可以算套路的做法,普通求 mst 是依次枚举权值最小的边能加就加,这个题目感觉难以直接求出 \(group(x)\neq group(y)\)\(w\) 最小的 \((x,y)\),因为感觉涉及的又多相关性又低,普通求 mst 还有一种办法是维护一个集合不断拓展,每次加入最小边,注意到所有集合一起拓展的话,用集合出边建图,新的联通块个数等于基环数,而基环大小最小为 \(2\),所以联通块数量至少减少一半。你这里要维护的是集合的最小出边,而前面那张要维护的是全局的最小出边,在”全局“没有带来任何好性质的前提下后者肯定是更好的。

我们现在考虑怎么对于联通块求出最好答案,还是\(w_x+w_y+dis(x,y)=(w_x+len_x)+(w_y+len_y)-2\times len_{lca(x,y)}\) 枚举 \(lca\),我们考虑对 \(x\) 查询 \(group(x)\neq group(y)\)\(\min ans(x,y)\),那么我们考虑拆成 \((w_x+len_x)+(w_y+len_y-2\times len_{lca(x,y)})\),那么我们希望对 \(lca(x,y)\) 维护 \(w_y+len_y-2\times len_{lca(x,y)}\) 的最好答案,这样 \(x\) 对应的另一部分就是前缀 \(\min\) 了,为了避免颜色相同我们再维护一个异色次好答案,这样取树上前缀最好答案就可以了。为了求 \(w_y+len_y-2\times len_{lca(x,y)}\) 我们对 \(lca\) 还要预处理一个 \(\min\{w_y+len_y\}\),这个也是维护最大/异色次大。这样子就做完了,想不到 tj 会写的这么长。。。。


P11363

在考场上分析出了所有性质想到了做法在写代码的时候犯唐莫名觉得“树=链”遗憾离场,感觉这个脑抽还是过于离谱了,好崩溃哦。

这种比较冗长的题目先简单理解一下题目在干什么,首先容易分析出了出题人的良知没有完全丧失,在边上画方点方便看,你发现给定的图对于方点的表达就已经是一个长得不能更好看的方圆树了,形态不太必要再做转换。

考虑定根之后手玩的形态,首先因为搜索顺序同层连接,圆点旁边的连成一条链,然后链的一端必须接上父亲,相当于除去根向的那一个点之后随机排列,按照排列顺序连边,现在可以做 \(k=1\) 的乐。

然后考虑 \(k>1\) 的情况,比如 \(k=2\),那么窝们应该先知道什么时候会重,阔以自己画一下发现链上的点都应该串在一起,就是靠向两边的点钦定了开头或者结尾。对于链,那么窝们希望最顶端处贡献,那么对点应该有合并下面的链 / 拼接链贡献答案 / 新加一条链 三种需要做的事情,尝试设计的时候容易发现对于非叶子无法新加一条链,因为总有一个儿子可以等价,那么一种生成树其实在根在一条叶子到叶子的链上时候是会重的且这个链唯一(脑抽的点,但是前面分析过了只在链上相同,所以真的好唐),现在关心链上有黑边的链的答案,子树里面的贡献直接 \(f[x][0/1]\) 表示有没有黑边的答案,然后乘上子树外的贡献即可。

事实上贡献简单可以先写出来,\(\sum\frac{\prod (dep_i-1)!}{\prod (dep_i-1)}\),可以算一个有黑边的链的 \(\sum (dep_i-1)^{-1}\),这样子就不用 dp 合并答案的时候关心子树外的贡献了(虽然是简单的。


P10220

谁能浇浇窝题目太长怎么办(?

字典序最小的话考虑一位一位钦定,窝们先考虑第一位应该放什么,发现至少是一个树形 dp,我们用 \(f_u(i)\) 表示在子树 \(u\) 里面第一位是 \(i\) 的最小代价,本文做不到的我们认为要花 \(+\infty\) 代价,状态数是 \(O(n\times 2^n)\) 的还行。转移的话,设 \(l/r\)\(u\) 的左右子树,\(Q(u,i)\) 表示子树 \(u\) 第一位是 \(\geq i\) 的数字的最小代价,转移显然是 \(f_l(i)+\min\{Q(r,i),w_u\}\to f_u(i),f_r(i)+Q(l,i)\to f_u(i)\),说句闲话我看数据范围的时候内心默念“log^2 应该能过吧除非这个题半秒”,看了一眼还真是半秒......?但是问题不大,我们转移之后做归并排序即可。

窝们确定了第一位之后会把树剖成好多好多的子问题,因为字典序显然直接从下往上做就好了。但是我们发现这个还有一些细节问题,直接贪心下面的树将剩余费用扔上去可能会导致上面费用不够影响第一位答案,所以我们应该一直保证剩余费用够用到不影响当前位答案,设第一位数字是 \(o\),具体而言容易发现预留 \(f_{rt}(o)-f_{cur}(o)\) 即可,dfs 下去是解法相同的子问题嘛,只是要维护一个 \(res\) 表示剩余代价来返回。发现还有一个钦定问题,就是要不要用 \(w_u\),显然只有可用费用不能天然满足的时候需要用,这个很好判定。然后因为每个点遍历常数次暴力做就是 \(O(n\times 2^n)\),况且不需要画蛇添足的东西就已经又长又臭乐。


CF407E

首先等差数列中的数模 \(d\) 一定同余,我们划开这些段分别处理,然后 \(a_i\gets \lfloor\frac{a_i}{d}\rfloor\) 转化成连续段问题。

那么区间 \([l,r]\) 合法有以下要求:不存在 \(i,j\in[l,r],i\neq j\) 满足 \(a_i=a_j\)\(\max_{i\in[l,r]}a_i-\min_{i\in[l,r]}+1\leq r-l+1+k\) 也就是 \(\max_{i\in[l,r]}a_i-\min_{i\in[l,r]}+l\leq r+k\)。扫描线枚举 \(r\),容易用单调栈把 \(rmq\) 转化成区间加减,之后维护后缀 \(\max-\min+l\) 即可,再写一个线段树上二分。


P10218

下面是对做题有效的思路,其实做这个题目的时候很容易有很多无效的思考。跟这个题目激战了一个晚修+上午, __int128 << -1/2 这种东西会导致 ans 会是一个很小的负数,但是 (long long)v 这样子输出正确答案,因为这个鬼东西我调了半个上午 /kk/kk

题目都这么二进制求最大了那么非常套路的按位 \(o\) 考虑 \(Ans\),初始 \(Ans=0\) 问题变成将 \((Ans)_o\) 调成 \(1\) 之后判定合法性,我们考虑一下 \(x\) 的合法条件,使用一个小贪心,如果 \(a_i\oplus x\geq Ans\) 那么一定用异或不劣:

  • 对于任意 \(i\) 都有 \(a_i+x\geq Ans\) 或者 \(a_i\oplus x\geq Ans\),因为 \(a_i+x\geq a_i\oplus Ans\) 所以这个条件相当于 \(\min\{a_i\}+x\geq Ans\)

  • 使用加法/异或的 \(a\) 放到集合 \(S_{+}/S_{\oplus}\) 中,根据只有满足 \(a_i\oplus x<Ans\) 的才会放到 \(S_+\) 里面。要满足 \(\sum_{i\in S_+}b_i\leq m\)

这里面最重要的条件和代价肯定是 \(a_i\oplus x<Ans\) 以及 \(\sum b\),别的看上去都是简单表示。因为 \(Ans\) 的后缀都是 \(0\),所以这个 \(<\) 一定是在 \([k,o]\) 位出现的,其实我们只关心 \(a_i/x\) 的前缀,那么 \(x\) 看上去应该递推的考虑。我们现在考虑怎么做 \(\{x\}_{o+1}\to \{x'\}_o\),应该以 \(x\to x'\) 为例想想怎么做。

先考虑 \(Ans\uparrow\) 对于 \(x\)\(S_+/S_{\oplus}\) 的影响:

  • \(S_+\)
  1. \(\sum b_i\leq m\)

  2. \(a_i+x\geq Ans\),可能导致一些 \(i\) 不再满足,但是这个在前面已经转化成了全局的 \(\min_{i\in U}\{a_i\}+x\geq Ans\) 可以简单处理。

  3. \(a_i\oplus x<Ans\),注意到分析过 \(<\) 来自前缀,所以仍然满足。

  • \(S_{\oplus}\)
  1. \(a_i\oplus x\geq Ans\),可能导致一些 \(i\) 不再满足,这种满足 \(lcp(a_i\oplus x,Ans)\) 刚好到 \(o+1\),这部分要改扔到 \(S_+\) 里面。

综上我们可以发现, \(Ans\to Ans+2^o\) 导致的需要调整 \(x\to x'\) 的过程只会导致 \([k,o)\) 位上 \(a_i\oplus x=Ans\)\((a)_i\neq (Ans)_o\) 的部分转化贡献方式,这个其实就只是 01trie 上的一个子树和,甚至直接用桶都可以算了好吧,那枚举 \((x)_o\) 之后判定一下可不可以有 \(1\),显然只用再判 \(m\)\(rmq\) 的限制,往可以最好的那一边递推求解即可。现在唯一的问题是状态数,你需要往下做的 \(x\oplus Ans\) 一定满足其异或是 \(a_i\) 的前缀,总的状态数不超过 \(O(nk)\),可以通过此题。

posted @ 2025-01-12 22:05  Hypoxia571  阅读(12)  评论(0)    收藏  举报