2024.7 做题记录 / 多层的命运把我的混沌剥离
mx 19 t4
有一个很抽象的做法,就是贪心选一组,然后重叠的记为 \(2\) 不重叠的记录为 \(1\),然后发现 \(2\) 在横竖意义连通块中任意移动(跟 \(1\) 交换),然后就在能到的地方贪心,这样子贪每一个回合 \(2\) 的倍数都会至少 \(/2\),复杂度就很对了。
事实上我还是过于唐了,可以考虑连边,然后发现是一个点需要匹配一条边,是一个很套路的最小基环树森林 /fad
CF1146F
设计状态的时候在思考「已经填了」和「还没有填」,然后发现很难做,所以事实上碰到一些题目如果设计的状态偏过程、不定性强的话,可以考虑仔细分析结果类别,按照最终的形态进行状态设计。
转移不难发现跟根有关,我们考虑一个在最终的图上的一个子树根的类别,显然有无色根和有色根这两种,但是这个有色根有一些不太好的性质,就是子树的染色情况和全局不一定相同,指的是单独一条链爬上去,只能在未来被染色。
所以我们分三类,\(f/g/h\) 分别表示子树 根为空/根现在有颜色/根将来有颜色的方案数,然后转移就不太难了,考虑合并 \(x\) 的子树 \(y\) >w<
-
对于 \(f\),子树互不相干,所以必须完整:\(f’_x=f_x\times (f_y+g_y)\)
-
对于 \(g\),我们可以考虑有没有用 \(y\) 的成分造新:$g'_x=g_x\times(f_y+g_y)+h_x\times(g_y+h_y) $
-
对于 \(h\),我们可以继承并发扬也可以创新:\(h'_x=h_x\times(f_y+g_y)+f_x\times(g_y+h_y)\)
蚌,说话都 whk 了。
CF1380F
还是比较普的题目,转移 \(f[i]=f[i-1]\times c_i+f[i-2]\times [c_{i-1}=1]\times (9-c_i)\),写成矩阵乘法线段树优化即可。
CF1775F
首先第一问构造比较随便,平方比较优,形式如 \(x\times (x-1)\) 的矩形中挖空即可。
第二问不难发现四个角独立(如果能交的话周长可以更小),所以先 dp 一个单调不降划分数,然后背包合并,具体算答案就枚举在 \(n\times m\) 里面扣。
CF1767E
不难发现相邻两个必须至少有一个被选择,于是连在图上面,要求求一个最小点集使得任意边链接两点至少有一个被选择,显然这个东西是总代价减去最大独立集。
这个数据范围最大独立集约摸着就是爆搜了,https://www.cnblogs.com/p-b-p-b/p/14200616.html 就过了。
CF323C
考虑一个位置 \(i\) 在另一个序列的哪一个位置有贡献,主席树维护即可。
P8906
补一个超级远古的题目,首先肯定时间倒流,变成一个动态加边,这个带小 \(k\) 路径长类似于 假期计划 是吧,就是我们可以对 \(k\) 进行一个分割再平方的复杂度的意思。
每次枚举一个中转点 \(i\),考虑定下边数的 \(f_i=dis(1,i),g_i=dis(i,n)\) 的 \(\min\{f_i+g_i\}\) 肯定就是答案嘛,求一次这个 \(O(n)\) 没什么问题,然后我们雨露均沾的使可以钦定边数 \(\leq 4\),显然我们考虑怎么动态这个 \(f,g\)。
但是这个长度为 \(4\) 也有点太多了,\(f,g\) 是相对独立子问题,不妨考虑再折半复杂度不会乘起来,动态维护一个 \(h_{i\to j}\) 表示 \(i\to j\) 走两条边的最短路,考虑到这个 \(h_{i\to j}=\min\{eg_{i\to k}+eg_{k\to j}\}\),然后我们发现我们的 \(eg_{x\to y}\) 是很屑的,玩一下发现贡献大概是 \(eg_{x\to y}+eg_{y\to i}\to h_{x\to i},eg_{i\to x}+eg_{x\to y}\to h_{i\to y}\) 这种很能接受的,直接做进去就好了 >w<
然后再用这个 b 东西更新 \(f/g\),由于做法的等价/偏序性这里只阐述 \(f\) 相关的长度为 \(4\) 的,考虑到 \(f_i=\min\{f_{1\to j}+f_{j\to i}\}\),我们把可能变更的 \(h\) 即 \(h_{x\to \alpha},h_{\alpha\to y}\) 带进去,然后发现 \(x=1\) 的需要做一个 \(h_{1\to\alpha}+h_{\alpha\to i}\to f_i\),这个总共不超过 \(O(n^3)\),然后还有三个比较普的情况,\(h_{1\to x}+h_{x\to\alpha}\to f_{\alpha},\) \(h_{1\to y}+h_{y\to i}\to f_y\) 和 \(h_{1\to\alpha}+h_{\alpha\to y}\to f_y\),随便更新即可。
AT_arc173_d
首先这个走一圈再回去相当于卷了一个大环,套路的使 (/)
为 \(1/-1\) 然后要求是找一个环回的路径使得任意前缀和 \(\geq 0\) 且总和为 \(0\),不难发现这个任意前缀和 \(\geq 0\) 是假的,因为总和为 \(0\),一定存在一个位置开始满足这个条件,这个和那个 dfs spfa 判负环有点像 >w<
然后还是一个比较套路的东西,就是无限走考虑环,假设一个初始的平凡构造权值为 \(c\),裴蜀定理要求一个 \(\gcd\{len_{of circle}\}|c\) 但是你这个 \(c\) 不本来就是环凑出来的嘛,所以一定成立,但是还有一个比较唐诗的正整数要求,但是是不是只要有正环和负环就一定能构造了,或者原本的和就为 \(0\),就是正环的存在性要和负环的存在性相同,然后做完了。
mx csp 23 t2 解码
某种 shaber 的字符串匹配,不难发现要求是相同的形态相同,那么不妨对于相等的 \(a_{p_1},a_{p_2},\dots,a_{p_{x-1}},a_{p_x}\) 连接 \((1,2),(2,3),\dots,(x-2,x-1),(x-1,x)\) 这样子,对于 \((a,b)\) 用 \(10^6a+b\) 表示,变成数集相同,这个可以平方和哈希,因为动态发现还需要维护一个 和 和一个 边数 就可以递推计算了,然后顺便这两个东西也能拿来加强一下哈希。
mx csp 23 t3 藤蔓
考虑一个藤蔓 \((u,v)\) 什么时候对一个路径 \((x,y)\) 有贡献,先挑出 \((u,v)\) 的 \(lca\) 为 \(cw\),\((x,y)\) 的 \(lca\) 为 \(z\),然后把藤蔓上的点标成黑点,然后按照 \(x,y\) 跟 \(cw\) 的关系进行一个分讨 >w<
- \(x,y\) 都在 \(tree(cw)\) 中,那么 \(z\) 是不是黑点跟有没有黑点是等价的。
大体的我们可以根据这个直接取一个 \(z\) 的 \(\text{tag}\) 的贡献这个样子,具体一点可以树上差分再前缀和,但是需要看一下别的贡献:
-
\(x,y\) 都不在 \(tree(cw)\) 中,那么 \(z\) 肯定是白点,且一定没有贡献,很不影响。
-
\(x,y\) 一个在 \(tree(cw)\) 中一个不在,那么 \(z\) 肯定是白点,且一定有贡献,我们单独算出这部分的贡献就不影响啦。
所以现在的问题是怎么对一对 \((x,y)\) 算出 \(sub(cw)\) 割开祂们的贡献,不难发现最正义的切割一定在 \(cw\) 上,然后路径 \((x,y)\) 上面的点除了 \(z\) 都是合法的 \(cw\) 的位置,然后别的全都不可以作为合法的 \(cw\),对于所有的 \(cw\) 直接根在树上差分前缀和就可以了。
mx csp 23 t4 山路改造
比较 shaber 的题目,对于 \(k=1\) 直接用一个超级原点随便连接,对于 \(k=-1\) 我们发现只要控制一下流动方向就好了,我们可以直接构造一个超级链,然后跑模板最短路就可以了喵。
AGC005C
首先我们会往直径上面考虑,最远的距离一定要是直径,然后必须有距离可以填满直径,不妨设最大距离(这里统一更改为点数的定义)为 \(cw\),那么对于 \(mx-\lfloor\frac{mx}{2}\rfloor+1\to mx\) 的应该至少有两个,特别的如果 \(mx\) 是奇数要求 \(\frac{mx+1}{2}\) 也至少有一个。
然后我们考虑其它的部分可不可以塞进去,太小的不行,具体而言要求 \(2(\min -1)+1\geq \max\),然后中间的(\(\lceil\frac{mx+1}{2}\rceil\))也赛进不去,别的可以塞成菊花,然后就没了。
mx [炼石计划--NOIP模拟一]--T1--岛屿
感觉比较吃 dp 基本功,所以显得我很没有基本功。
首先有一些自己能卷出来的结论:所谓的连通块一定是环,连边会变成子问题,设 \(11/10/00\) 的对的个数分别为 \(A/x/B\),那么永远有 \(A=B\),换句话说 \(11/00\) 交替套环, \(10\) 可以任意塞入也可以独立成环,基于这些我对 tj 可能理解的顺序不一定广泛滴好。
不难想到先做一个 \(A=B=0\) 的或者 \(x=0,A=B\) 的方案数,不妨设方案数叫做 \(f(A,x,B)(A=B)\),然后这种连通块顺序我们为了不重不漏应该钦定一个加边顺序,为了方便每次应该只加一条边 >w<
- 对于 \(f(0,x,0)\),我们可以自己接自己或者自己接别人,接自己有 \(1\) 种,贡献 \(1\) 个连通块,接别人可以用 \(0/1\) 去接有 \(2\) 种,总共有 \(2x-1\) 种,不贡献连通块,我们可以得到下面这个很好求的东西
- 对于 \(f(A,0,A)\),经过推导我们发现这个 \(0\) 不是一个很有用的要求,我们直接拓展到 \(f(A,x,B)(A=B)\),具体而言我们先钦定顺序,如果钦定先选 \(11/00\) 会变得非常诡异,我们考虑保留这个环意义下的 \(A=B\) 的东西,不妨钦定先接 \(10\),有接到 \(10\) 的自己,接到 \(10\) 但不是自己,接到 \(11\),接到 \(00\),贡献很好写,只有第一种贡献连通块,第一种是 \(f(A,x-1,B)+1\),别的都是 \(f(A,x-1,B)\),但是这个概率怎么写呢,好像分别是 \(1/x-1/2A/2B\) 种呢,但是注意到后面两种有一个一一对应的关系,所以这个整体需要 \(\div 2\),然后概率就分别是 \(1/x-1/x/(A+B)-x\) 了,不妨认为 \(x=A\) 因为反正等价,然后我们也可以写柿子啦 qwq
然后就做完了嘻嘻,就,转移要学会钦定顺序,然后每次转移一点点就行了不要太贪,然后要钦定转移顺序,然后要选择正确的转移顺序。
[炼石计划--NOIP模拟一]--T2--小朋友
首先有一个比较唐诗的贪心的 idea,就是我们不难发现单调栈一个 \(s\) 上面的不降子序列,\(s\) 一定是这个子序列的一个前缀,我们考虑枚举一个前缀的长度然后拼出后缀取 \(\max\) 即可。
然后我们就考虑怎么求出一个枚举了的前缀的对应 \(t\) 的 \(\max\),假设这个前缀是 \(c...wzzzz\)(这里的假设主要是想表达我们最后一种的那一串单独出来表达),那么对于 \(c...w\) 这部分的 \(t\) 肯定没办法了嘛,就必须老老实实全部都要,然后对于 \(zzzz\) 这些,我们是在所有的 \(z...z\) 中选择一个 \(zzzz\) 对应的 \(t\) 让它最大,这个很好 dp 嘛,就设 \(f[i]\) 表示长度为 \(i\) 的最优 string,然后顺次更新即可,复杂度 \(O(n^3)\),dp 之后暴力合并就可以啦 qwq
[炼石计划--NOIP模拟一]--T3--列表
这个原本的 Game 很屑,过程性太强了,我们不妨对其进行一个强行性理解,不难发现就是每一轮,比方说中间为 \(n'\),那么 \(n'-1/n'+1\) 必须保留一个,保留的代价就是删除 \(n'\) 另一边的任意一个,所以我们考虑左边右边一一匹配然后保留对应的就可以,因为个数肯定没问题嘛,但是为什么还有对一个集合的不合法呢?我们发现就不如 \(x,v,x\) 这种就不可以了嘛(\(v/x\) 表示保留/不保留),然后我们发现瓶颈大概是一个对于前 \(i\) 轮时候,必须保留 \(i\) 个至少,所以我们有一个相对唐诗的 \(O(n^2\log n)\) 的暴力,就是我们可以枚举一个左端点,然后每一轮对应的都加入堆重新贪心,然后每轮取一个 \(\geq l\) 的最小的,最后取得一个答案。
我们尝试优化这个基于贪心的暴力,发现变化次数只能在最多 \(O(n)\) 且难以优化,因为做的太直接了喵。我们考虑一点别的,不难发现对于 \(L=1,\dots,m\),对应的 \(R\uparrow\),于是我们考虑双指针,那么现在有两个操作,删除 \(L\),尝试加入 \(R+1\),判定是否合法,我做的时候感觉定式思维稍微在这里卡了一下,就其实这个东西不一定要从一个依赖性很强的东西递推过来修正,反而直接取最优的角度去思考会便利很多......?很多现有的东西不一定是全面充足的,会增加不必要的转移。
对于一个区间 \([L,R]\) 其合法性怎么判定?首先 \(x\in[L,R]\) 都要保留,然后还需要保留 \(\delta = n+1-(R-L+1)\) 这么多的东西凑数,贪心的想,我们肯定直接选那些距离 \(n+1\) 尽量近的东西看其合法性就可以了。
-
对于尝试加入 \(R\),如果 \(R\) 原本是凑数的,那就直接让祂变成非凑数保留,如果 \(R\) 原本是没有保留的,让祂变成非凑数保留,然后去掉一个凑数的,具体一点去掉距离 \(n+1\) 最远的那个凑数的。
-
对于删除 \(L\),如果 \(L=a[n+1]\) 不能动啊,不然先把 \(L\) 变成不保留的,那么现在缺一个凑数的,从不保留集合里面选一个最好的变成凑数保留的,具体而言,选距离 \(n+1\) 最近的那个。
快速选取显然可以使用优先队列快速维护(实现的时候可以打懒标记),然后现在还有一个问题就是说,删除加入要快速判定一个合法性问题,然后这个是一个区间加+查询区间最小值的问题,线段树优化即可,然后就做完了,稍微有一点点难写我 代码 能力不是很好的说,感觉是那种平凡的 stl 题目代码的好像很好写但是又要调嗯嗯 >w<
CF1228E
是不是不太能直接做嘛,那么考虑容斥,考虑钦定集合 \(S\) 不合法去计数,\(x\gets |S|\),那么总方案数就是 \(((k-1)^xk^{n-x}-(k-1)^n)^n\),容斥就行了。
CF425E
这种 dp 首先应该钦定顺序嘛,普通的平凡的好像不太能不重不漏,我们不妨思考怎么钦定一个确定最优集合的方式先,\(R\uparrow\),\(L\) 合法就取,这是一个经典的贪心。
考虑一个集合按照上述方式生成的方案数,首先对于集合的右端点不妨设其为 \(x\),然后设上一个右端点为 \(k\),那么左端点的要求是只要有连到 \(>k\) 的就行了,容斥一下不难发现方案数是 \(2^x-2^k\),对于非右端点只能忘 \(\leq k\) 的连,方案数是一个 \(2^k\) 的贡献。
状态设计就比较能写了,不妨设 \(f[i][j][k]\) 表示前 \(i\) 个数用了 \(j\) 条线段最后一条线段在 \(k\),转移的话枚举更新 \(f[i][j][k]\) 的那个不产生右端点的贡献 \(\times 2\),然后用 \(f[i-1][j-1][k]\) 更新 \(f[i][j][i]\),系数是上面提到的那个 \(2^i-2^k\),然后空间开不下滚动一下就行了。
CF93E
正常的做法只有容斥,然后有一些数据范围比较诡异,正常容斥算一个 \(\sum_{S}\lfloor\frac{n}{\prod -a_i}\rfloor\),这个东西很多无效为 \(0\),所以考虑一个比较典的 \(a\geq b\) 转化成 \(\lfloor\frac{a}{b}\rfloor\geq 1\),不妨考虑设 \(f[i][j]\) 表示除剩 \(i\) 使用了 \(a_{j},\dots,a_n\) 的方案数,因为互质,比较显然的有 \(f[i][j]=\lfloor\frac{i}{a_j}\rfloor+f[i][j+1]-f[\lfloor\frac{i}{a_j}\rfloor][j+1]\),也是一个小容斥,这样子复杂度就是 \(O(k\sqrt n)\),但是 (unordered_)map
狂暴超时,数组也不可能开的下,经过学习可以 \(i\) 小的部分记忆化别的直接调用,这个题目狂暴卡常。
CF1371F
一眼题,写了整整 100 行,好久没写过上百行的题目了。我们不妨直接线段树,需要维护区间前缀/后缀 \(0/1/01/10\),区间最长 \(01/10\) 串,合并就维护后缀 \(0/01\) 还有 \(Ans\),没什么细节挺好写的,难度主要在代码有点长。
CF379D
本人在精神极差的时候强行理解这个题目出 4 个意思并且每一版都写了代码然后发现第 4 版才过太逆天了。
首先我们考虑固定了 \(s_1,s_2\) 怎么求 \(s_k\) 的答案,不妨设 \(s_i\) 有 \(f_i\) 个 AC
,那么转移首先有一个 \(f_i\gets f_{i-2}+f_{i-1}\),但是拼接处可能还会产生一个 AC
,所以我们还关心 \(L_i/R_i\) 表示 \(s_i\) 的第一个/最后一个字符是 A/C/非A非C
,然后就很好转移了。
这个东西显然只跟 \(L_1/R_1/L_2/R_2/f_1/f_2\) 相关,那我们不妨枚举这个,总共有 \(3\times 3\times3\times3*\frac{n}{2}\times\frac{m}{2}\) 种,每次花 \(O(k)\) 验证是否等于 \(k\) 就行了。
然后还有一个问题就是我们需要判一个\(L_1/R_1/L_2/R_2/f_1/f_2\) 的合法性,直接贪心狂暴构造然后随便判定一下就行了,具体的,首尾确定了,然后尽量在前面放需要的 AC
,剩下的部分就放 C
。
CF906C
看数据范围肯定是状压 dp,不妨设 \(f[s]\) 表示 \(s\) 成团的最小代价,考虑向后递推,使用 \(i\),可以用 \(+1\) 的代价往 \(f[s|st_i]\) 转移,然后就做完了喵。
CF757D
首先数字 \(\leq 20\),考虑状压 dp,每次往后刷表即可。
ARC171D
首先反转序列没有影响,于是变成 \(hash(X)=\sum_{i=1}^{|X|}x_i\times B^i\),然后去考虑做一个哈希前缀和,之后 \(L,R\) 的要求实质性变为 \(\frac{sum(R)-sum(L-1)}{B^{L-1}}\neq 0\pmod P\),因为 \(P\) 是素数,所以就是 \(sum(L-1)\neq sum(R)\pmod P\),考虑怎么求出最少需要多少种数值跟 \(P\) 进行比较即可。
注意到数据范围 \(n\leq 16\),考虑状压 dp,设 \(f[s]\) 表示集合 \(s\) 都染色最少需要多少种颜色,预处理 \(cw[s]\) 表示集合 \(s\) 是不是独立集,初始化显然是 \(f[s]=(1-cw[s])\times \infty+1\),转移的话在预处理一个 \(out[s]\) 表示 \(s\) 能到达的地方,枚举 \(s\) 的子集中的独立集,用该独立集和其补集转移,用是否有连边判断是否需要 \(+1\) 即可,复杂度 \(O(n^3)\)。
P4359
首先对于 \(p_k\) 和 \(k\) 不同的叉在一起考虑感觉比较容易麻烦,加上合法 \((p_k,k)\) 的种类并不很多,我们对于每一类单独考虑,然后注意到 \(k\) 不是很大,这种取大的题目估计就是像超级钢琴之类的放堆里面一次一次取了。
一次一次取需要什么,需要偏序关系和不重不漏,形式化一点就是对于 \((p_k,k)\) 对应出的每一个集合,我们要找到一种连边的方式使其成为一个大根堆形态的东西。一个集合的本质是什么,去掉一个 \(p_k\) 的固有部分之后就是在 \(p_i\leq p_k\) 种任意选择 \(k-1\) 个,选择方案之间是一个无序化后不同的要求,那我们可以想想这种选择如何 dfs 可以满足条件,是不是还是有点不够明显,考虑到一类中最大的肯定是 \(p_k^k\),那我们不妨将 \(p_k 的指数 -1\) 看作 剩下的没有放的个数,然后就好做了,普通 dfs,我们考虑搜出来嘛,\(dfs(x,sy,cw)\) 表示现在在状态 \(x\),还剩下 \(sy\) 个没有放出去,目前选择最后一个放到 \(p_{cw}\) 的情况,这个往 \(dfs(\frac{x\times p_{i|\geq cw}}{p_k},sy-1,i)\) 搜出去就行了,然后这个东西显然是个大根堆。