2024.7 做题记录 / 多层的命运把我的混沌剥离

mx 19 t4

有一个很抽象的做法,就是贪心选一组,然后重叠的记为 2 不重叠的记录为 1,然后发现 2 在横竖意义连通块中任意移动(跟 1 交换),然后就在能到的地方贪心,这样子贪每一个回合 2 的倍数都会至少 /2,复杂度就很对了。

事实上我还是过于唐了,可以考虑连边,然后发现是一个点需要匹配一条边,是一个很套路的最小基环树森林 /fad


CF1146F

设计状态的时候在思考「已经填了」和「还没有填」,然后发现很难做,所以事实上碰到一些题目如果设计的状态偏过程、不定性强的话,可以考虑仔细分析结果类别,按照最终的形态进行状态设计。

转移不难发现跟根有关,我们考虑一个在最终的图上的一个子树根的类别,显然有无色根和有色根这两种,但是这个有色根有一些不太好的性质,就是子树的染色情况和全局不一定相同,指的是单独一条链爬上去,只能在未来被染色。

所以我们分三类,f/g/h 分别表示子树 根为空/根现在有颜色/根将来有颜色的方案数,然后转移就不太难了,考虑合并 x 的子树 y >w<

  • 对于 f,子树互不相干,所以必须完整:fx=fx×(fy+gy)

  • 对于 g,我们可以考虑有没有用 y 的成分造新:gx=gx×(fy+gy)+hx×(gy+hy)

  • 对于 h,我们可以继承并发扬也可以创新:hx=hx×(fy+gy)+fx×(gy+hy)

蚌,说话都 whk 了。


CF1380F

还是比较普的题目,转移 f[i]=f[i1]×ci+f[i2]×[ci1=1]×(9ci),写成矩阵乘法线段树优化即可。


CF1775F

首先第一问构造比较随便,平方比较优,形式如 x×(x1) 的矩形中挖空即可。

第二问不难发现四个角独立(如果能交的话周长可以更小),所以先 dp 一个单调不降划分数,然后背包合并,具体算答案就枚举在 n×m 里面扣。


CF1767E

不难发现相邻两个必须至少有一个被选择,于是连在图上面,要求求一个最小点集使得任意边链接两点至少有一个被选择,显然这个东西是总代价减去最大独立集。

这个数据范围最大独立集约摸着就是爆搜了,https://www.cnblogs.com/p-b-p-b/p/14200616.html 就过了。


CF323C

考虑一个位置 i 在另一个序列的哪一个位置有贡献,主席树维护即可。


P8906

补一个超级远古的题目,首先肯定时间倒流,变成一个动态加边,这个带小 k 路径长类似于 假期计划 是吧,就是我们可以对 k 进行一个分割再平方的复杂度的意思。

每次枚举一个中转点 i,考虑定下边数的 fi=dis(1,i),gi=dis(i,n)min{fi+gi} 肯定就是答案嘛,求一次这个 O(n) 没什么问题,然后我们雨露均沾的使可以钦定边数 4,显然我们考虑怎么动态这个 f,g

但是这个长度为 4 也有点太多了,f,g 是相对独立子问题,不妨考虑再折半复杂度不会乘起来,动态维护一个 hij 表示 ij 走两条边的最短路,考虑到这个 hij=min{egik+egkj},然后我们发现我们的 egxy 是很屑的,玩一下发现贡献大概是 egxy+egyihxi,egix+egxyhiy 这种很能接受的,直接做进去就好了 >w<

然后再用这个 b 东西更新 f/g,由于做法的等价/偏序性这里只阐述 f 相关的长度为 4 的,考虑到 fi=min{f1j+fji},我们把可能变更的 hhxα,hαy 带进去,然后发现 x=1 的需要做一个 h1α+hαifi,这个总共不超过 O(n3),然后还有三个比较普的情况,h1x+hxαfα, h1y+hyifyh1α+hαyfy,随便更新即可。


AT_arc173_d

首先这个走一圈再回去相当于卷了一个大环,套路的使 (/)1/1 然后要求是找一个环回的路径使得任意前缀和 0 且总和为 0,不难发现这个任意前缀和 0 是假的,因为总和为 0,一定存在一个位置开始满足这个条件,这个和那个 dfs spfa 判负环有点像 >w<

然后还是一个比较套路的东西,就是无限走考虑环,假设一个初始的平凡构造权值为 c,裴蜀定理要求一个 gcd{lenofcircle}|c 但是你这个 c 不本来就是环凑出来的嘛,所以一定成立,但是还有一个比较唐诗的正整数要求,但是是不是只要有正环和负环就一定能构造了,或者原本的和就为 0,就是正环的存在性要和负环的存在性相同,然后做完了。


mx csp 23 t2 解码

某种 shaber 的字符串匹配,不难发现要求是相同的形态相同,那么不妨对于相等的 ap1,ap2,,apx1,apx 连接 (1,2),(2,3),,(x2,x1),(x1,x) 这样子,对于 (a,b)106a+b 表示,变成数集相同,这个可以平方和哈希,因为动态发现还需要维护一个 和 和一个 边数 就可以递推计算了,然后顺便这两个东西也能拿来加强一下哈希。


mx csp 23 t3 藤蔓

考虑一个藤蔓 (u,v) 什么时候对一个路径 (x,y) 有贡献,先挑出 (u,v)lcacw(x,y)lcaz,然后把藤蔓上的点标成黑点,然后按照 x,ycw 的关系进行一个分讨 >w<

  • x,y 都在 tree(cw) 中,那么 z 是不是黑点跟有没有黑点是等价的。

大体的我们可以根据这个直接取一个 ztag 的贡献这个样子,具体一点可以树上差分再前缀和,但是需要看一下别的贡献:

  • 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,那么对于 mxmx2+1mx 的应该至少有两个,特别的如果 mx 是奇数要求 mx+12 也至少有一个。

然后我们考虑其它的部分可不可以塞进去,太小的不行,具体而言要求 2(min1)+1max,然后中间的(mx+12)也赛进不去,别的可以塞成菊花,然后就没了。


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 种,总共有 2x1 种,不贡献连通块,我们可以得到下面这个很好求的东西

f(0,x,0)=12x1(f(0,x1,0)+1)+2x2x1f(0,x1,0)=f(0,x1,0)+12x1=i=1x12i1

  • 对于 f(A,0,A),经过推导我们发现这个 0 不是一个很有用的要求,我们直接拓展到 f(A,x,B)(A=B),具体而言我们先钦定顺序,如果钦定先选 11/00 会变得非常诡异,我们考虑保留这个环意义下的 A=B 的东西,不妨钦定先接 10,有接到 10 的自己,接到 10 但不是自己,接到 11,接到 00,贡献很好写,只有第一种贡献连通块,第一种是 f(A,x1,B)+1,别的都是 f(A,x1,B),但是这个概率怎么写呢,好像分别是 1/x1/2A/2B 种呢,但是注意到后面两种有一个一一对应的关系,所以这个整体需要 ÷2,然后概率就分别是 1/x1/x/(A+B)x 了,不妨认为 x=A 因为反正等价,然后我们也可以写柿子啦 qwq

f(A,x,B)=1A+x+B(f(A,x1,B)+1)+x1A+x+Bf(A,x1,B)+AA+x+Bf(A,x1,B)+BA+x+Bf(A,x1,B)=f(A,x1,B)+1A+x+B=f(A,0,B)+i=1x12x+i

然后就做完了嘻嘻,就,转移要学会钦定顺序,然后每次转移一点点就行了不要太贪,然后要钦定转移顺序,然后要选择正确的转移顺序。


[炼石计划--NOIP模拟一]--T2--小朋友

首先有一个比较唐诗的贪心的 idea,就是我们不难发现单调栈一个 s 上面的不降子序列,s 一定是这个子序列的一个前缀,我们考虑枚举一个前缀的长度然后拼出后缀取 max 即可。

然后我们就考虑怎么求出一个枚举了的前缀的对应 tmax,假设这个前缀是 c...wzzzz(这里的假设主要是想表达我们最后一种的那一串单独出来表达),那么对于 c...w 这部分的 t 肯定没办法了嘛,就必须老老实实全部都要,然后对于 zzzz 这些,我们是在所有的 z...z 中选择一个 zzzz 对应的 t 让它最大,这个很好 dp 嘛,就设 f[i] 表示长度为 i 的最优 string,然后顺次更新即可,复杂度 O(n3),dp 之后暴力合并就可以啦 qwq


[炼石计划--NOIP模拟一]--T3--列表

这个原本的 Game 很屑,过程性太强了,我们不妨对其进行一个强行性理解,不难发现就是每一轮,比方说中间为 n,那么 n1/n+1 必须保留一个,保留的代价就是删除 n 另一边的任意一个,所以我们考虑左边右边一一匹配然后保留对应的就可以,因为个数肯定没问题嘛,但是为什么还有对一个集合的不合法呢?我们发现就不如 x,v,x 这种就不可以了嘛(v/x 表示保留/不保留),然后我们发现瓶颈大概是一个对于前 i 轮时候,必须保留 i 个至少,所以我们有一个相对唐诗的 O(n2logn) 的暴力,就是我们可以枚举一个左端点,然后每一轮对应的都加入堆重新贪心,然后每轮取一个 l 的最小的,最后取得一个答案。

我们尝试优化这个基于贪心的暴力,发现变化次数只能在最多 O(n) 且难以优化,因为做的太直接了喵。我们考虑一点别的,不难发现对于 L=1,,m,对应的 R,于是我们考虑双指针,那么现在有两个操作,删除 L,尝试加入 R+1,判定是否合法,我做的时候感觉定式思维稍微在这里卡了一下,就其实这个东西不一定要从一个依赖性很强的东西递推过来修正,反而直接取最优的角度去思考会便利很多......?很多现有的东西不一定是全面充足的,会增加不必要的转移。

对于一个区间 [L,R] 其合法性怎么判定?首先 x[L,R] 都要保留,然后还需要保留 δ=n+1(RL+1) 这么多的东西凑数,贪心的想,我们肯定直接选那些距离 n+1 尽量近的东西看其合法性就可以了。

  • 对于尝试加入 R,如果 R 原本是凑数的,那就直接让祂变成非凑数保留,如果 R 原本是没有保留的,让祂变成非凑数保留,然后去掉一个凑数的,具体一点去掉距离 n+1 最远的那个凑数的。

  • 对于删除 L,如果 L=a[n+1] 不能动啊,不然先把 L 变成不保留的,那么现在缺一个凑数的,从不保留集合里面选一个最好的变成凑数保留的,具体而言,选距离 n+1 最近的那个。

快速选取显然可以使用优先队列快速维护(实现的时候可以打懒标记),然后现在还有一个问题就是说,删除加入要快速判定一个合法性问题,然后这个是一个区间加+查询区间最小值的问题,线段树优化即可,然后就做完了,稍微有一点点难写我 代码 能力不是很好的说,感觉是那种平凡的 stl 题目代码的好像很好写但是又要调嗯嗯 >w<


CF1228E

是不是不太能直接做嘛,那么考虑容斥,考虑钦定集合 S 不合法去计数,x|S|,那么总方案数就是 ((k1)xknx(k1)n)n,容斥就行了。


CF425E

这种 dp 首先应该钦定顺序嘛,普通的平凡的好像不太能不重不漏,我们不妨思考怎么钦定一个确定最优集合的方式先,RL 合法就取,这是一个经典的贪心。

考虑一个集合按照上述方式生成的方案数,首先对于集合的右端点不妨设其为 x,然后设上一个右端点为 k,那么左端点的要求是只要有连到 >k 的就行了,容斥一下不难发现方案数是 2x2k,对于非右端点只能忘 k 的连,方案数是一个 2k 的贡献。

状态设计就比较能写了,不妨设 f[i][j][k] 表示前 i 个数用了 j 条线段最后一条线段在 k,转移的话枚举更新 f[i][j][k] 的那个不产生右端点的贡献 ×2,然后用 f[i1][j1][k] 更新 f[i][j][i],系数是上面提到的那个 2i2k,然后空间开不下滚动一下就行了。


CF93E

正常的做法只有容斥,然后有一些数据范围比较诡异,正常容斥算一个 Snai,这个东西很多无效为 0,所以考虑一个比较典的 ab 转化成 ab1,不妨考虑设 f[i][j] 表示除剩 i 使用了 aj,,an 的方案数,因为互质,比较显然的有 f[i][j]=iaj+f[i][j+1]f[iaj][j+1],也是一个小容斥,这样子复杂度就是 O(kn),但是 (unordered_)map 狂暴超时,数组也不可能开的下,经过学习可以 i 小的部分记忆化别的直接调用,这个题目狂暴卡常。


CF1371F

一眼题,写了整整 100 行,好久没写过上百行的题目了。我们不妨直接线段树,需要维护区间前缀/后缀 0/1/01/10,区间最长 01/10 串,合并就维护后缀 0/01 还有 Ans,没什么细节挺好写的,难度主要在代码有点长。


CF379D

本人在精神极差的时候强行理解这个题目出 4 个意思并且每一版都写了代码然后发现第 4 版才过太逆天了。

首先我们考虑固定了 s1,s2 怎么求 sk 的答案,不妨设 sifiAC,那么转移首先有一个 fifi2+fi1,但是拼接处可能还会产生一个 AC,所以我们还关心 Li/Ri 表示 si 的第一个/最后一个字符是 A/C/非A非C,然后就很好转移了。

这个东西显然只跟 L1/R1/L2/R2/f1/f2 相关,那我们不妨枚举这个,总共有 3×3×3×3n2×m2 种,每次花 O(k) 验证是否等于 k 就行了。

然后还有一个问题就是我们需要判一个L1/R1/L2/R2/f1/f2 的合法性,直接贪心狂暴构造然后随便判定一下就行了,具体的,首尾确定了,然后尽量在前面放需要的 AC,剩下的部分就放 C


CF906C

看数据范围肯定是状压 dp,不妨设 f[s] 表示 s 成团的最小代价,考虑向后递推,使用 i,可以用 +1 的代价往 f[s|sti] 转移,然后就做完了喵。


CF757D

首先数字 20,考虑状压 dp,每次往后刷表即可。


ARC171D

首先反转序列没有影响,于是变成 hash(X)=i=1|X|xi×Bi,然后去考虑做一个哈希前缀和,之后 L,R 的要求实质性变为 sum(R)sum(L1)BL10(modP),因为 P 是素数,所以就是 sum(L1)sum(R)(modP),考虑怎么求出最少需要多少种数值跟 P 进行比较即可。

注意到数据范围 n16,考虑状压 dp,设 f[s] 表示集合 s 都染色最少需要多少种颜色,预处理 cw[s] 表示集合 s 是不是独立集,初始化显然是 f[s]=(1cw[s])×+1,转移的话在预处理一个 out[s] 表示 s 能到达的地方,枚举 s 的子集中的独立集,用该独立集和其补集转移,用是否有连边判断是否需要 +1 即可,复杂度 O(n3)


P4359

首先对于 pkk 不同的叉在一起考虑感觉比较容易麻烦,加上合法 (pk,k) 的种类并不很多,我们对于每一类单独考虑,然后注意到 k 不是很大,这种取大的题目估计就是像超级钢琴之类的放堆里面一次一次取了。

一次一次取需要什么,需要偏序关系和不重不漏,形式化一点就是对于 (pk,k) 对应出的每一个集合,我们要找到一种连边的方式使其成为一个大根堆形态的东西。一个集合的本质是什么,去掉一个 pk 的固有部分之后就是在 pipk 种任意选择 k1 个,选择方案之间是一个无序化后不同的要求,那我们可以想想这种选择如何 dfs 可以满足条件,是不是还是有点不够明显,考虑到一类中最大的肯定是 pkk,那我们不妨将 pk1 看作 剩下的没有放的个数,然后就好做了,普通 dfs,我们考虑搜出来嘛,dfs(x,sy,cw) 表示现在在状态 x,还剩下 sy 个没有放出去,目前选择最后一个放到 pcw 的情况,这个往 dfs(x×pi|cwpk,sy1,i) 搜出去就行了,然后这个东西显然是个大根堆。

posted @   Hypoxia571  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
点击右上角即可分享
微信分享提示