CF(1400-1400&1300-1500)

CF1863D Two-Colored Dominoes

多米诺骨牌一个会占两个格子,多米诺骨牌的两个部分颜色需要不一致,牌不是重点,颜色不一致才是,然后还有多米诺有两种形式,一种是躺着,一种是站着。说人话就是上下两格和左右两格,我们观察这种排布不难发现,站着的情况下,不会影响这一列的颜色分布情况,躺着的就是不影响一行的颜色分布,观察到这一核心之后题目就变得简单了。为了让每行每列的每种颜色的个数一致,我们先来看行,一行里面我们不用管LR,只用管U,所以通过判断U的个数是否为偶数我们就能知道这个答案是否可以构造,L同理,在列里构造就行,然后我们就可以通过交叉染色构造出漂亮图案了。

CF1838C No Prime Differences

这题我觉得最主要的就是代码了。构造的思路很简单,只需要将横排的差都构造成1,也就是12345......这样,然后再将列构造成合数,为什么这样一定行。如果不改变行之间的顺序,那么第二行第一个数一定是1+m,所以只要调换行之间的顺序,那么就可以构造出差为n/2*m的差,并且可以做到每行之间的差都是这个值,只不过是n/2是向上取整还是向下取整的区别。

(我就卡在怎么的出的n/2*m上)代码部分我们可以将偶数行和奇数行分开构造,偶数行开始加上n/2,奇数行直接*m然后+j+1就行了。(加1是因为我们循环是从0开始的)

CF1837D Bracket Coloring

(被队长装到了,尽然一眼看出要用到栈)要是我能想到用栈那结果是不是就不一样了。先说怎么判断是否可以染色。如果左右括号数量不一致,那么就一定不行,这点很好理解。然后就是什么时候染俩个颜色,什么时候一个,这个我们可以将'('和')'分两种情况来看,如果一(为开头的美丽序列和)为开头的美丽序列同时存在,那么就可以判断要染两种颜色,否则只用染一种颜色。然后就是怎么染色的问题了,正确的思路是使用栈,如果没有匹配的就存入将下标存入栈,如果有那就将这个下标从栈里取出来然后染上色就行了,左右括号都用这思路。

CF2267D Backrooms Hill

我卡在这题的原因很明显,我没发现他的本质,我本以为k只是个摆设,因为当k在两端的时候,只要数组满足单调增或者减就行了,然后我就想着去排序数组,因为我们可以调换i+2位置和i位置的数,我推导出奇数位置和偶数位置都可以自行排列,我想着用排列能否构造递增递减数组来判断是否正确,事实是我完全错误。

这题的推进要从研究hill出发,hill就是题目所说的小山,小山满足的条件是前k个位置递增,后m-k+1个位置递减,我从研究k出发是不明智的选择,因为k本质是未知,只知道在先增后减的图像中,在转折点也就是k的值一定是最大的,然后我们继续往下研究,第二大的一定在最大的附近,那么我们就不难的出前几大的数满足连续这一特征,连续这一特征有一个对这题很关键的性质,奇数位置的数和偶数位置的数的个数相差不超过1,然后我们就可以先存储每个数的位置,然后从n到1遍历,因为每个给出的数组都是个排列,然后判断每个值的位置是奇是偶,要判断个数,可以将两类数的贡献定为相反数+-1,每次加完,判断这个总贡献值有没有超过1即可。

map不能用sort,因为unordered_map的迭代器不是sort所要求的随机访问迭代器(from chatgpt)

。

CF2266D Falling Concrete

这题lz打div3的时候就没做出来,我推进的方向一直是利用高度的变化去构造平地,发现什么有用的推进都没有,啥也观察不到。

没想到真正的核心是将ai-i构造成一个新的东西bi(这谁能想的到)。这样有什么效果,我先说结论,这么构造我们就能发现b数组可以任意排序,然后就能发现只要找到b中连续串的长度就能得出答案。先说前面那个结论,在我们构造出bi等于ai-i后,让我们模拟一次移动,ai到aj,ai的高度变成了aj-(j-i),此时对他进行-i可以发现i位置就变成了aj-j,也就是bj,然后我们模拟j与i之间的变化,发现,在a数组中的移动体现在b中就是将bj移动到bi的位置,然后i到j-1的就往后移一位,也就是说我们可以对b数组任意的重排。那么我们要得出a中平坦的长度,不妨先假设又长度为k并且高度都等于H,写成式子就是al=al+1=......=al+k-1=H,转换到b数组就变成了H-l,H-(l+1),......,H-(l+k-1);可以将H和l看做x,那么就可以得出这个子串满足连续这一关键,那么问题就被我们转化成了找到b数组中连续子串的最长长度。

代码最好是不要用set的好,因为很容易超时。

CF2266E Prime Destruction

先来解释一下素除是啥,我也不知道有没有这个词,我只知道除数只能是质数并且是被除数的因子,所以一次操作就可以看成将一个数x分成p个x/p,题目就是让我们求出将数组中所有书变得小于等于k所需要的最小操作数。本来lz是想着贪心能不能做,就是每次操作都用x的最小质因数,因为这样会产生较小的分支,比如说x=12的时候,p选2,那么12就会被两个6替换,如果我们用3,那么12会被3个4替换,分支就变多了,这么看贪心好像真的可以。

但是因为我不知如何统计质因数,索性放弃了,看了题解才发现这是一道动态规划,也就是说并不是所有数选最小质因数都是最优解。举个例子,x=6、k=2,选2的话操作步数就来到了3,而选3操作次数只需要1步。既然知道贪心做不了,那为什么用dp就能做呢?模拟一种情况12变成2,这个时候第一步可以有多个选择:2、3,并且两种选择会导致第二步不同的结果,所以这就是动态规划的特征。现在明确了动态规划的方向,可是我们还有一点不知道,就是动态规划的方程。不妨先模拟一遍12,k=2;第一步选2,两个6,第二步要将6往2靠近,可以选2,两个3,并且还有一个6需要操作,也就是2步操作,模拟完我们可以发现一个规律,f(x)=1+p*f(x/p),f的含义是将x变为小于k需要几步,这个式子就和状态转移方程很像了,然后我们就可以愉快的写代码了。

(不对!质因数怎么筛选)可以使用模拟,维护一个数组,然后用双重循环,i代表因数,j代表i的倍数,所以内层循环要j+=i,然后让aj=j的都替换成i,即可。

CF1800E1 Unforgivable Curse (easy version)

lz一开始还是太急了,我直接将问题看成每次只进行i和i+3或i和i+4之间的交换。

我的思路显然存在问题,因为i也可以和i+3+3交换,也就是在这一条距离为3的边上都能交换,根据这一点我们可以观察出一个结论,就是这条边上的字母可以任意排列,那么问题就转到了统计个数上,如果直接统计边再统计每条边的字母数会非常复杂以及难以存储和统计,那么如果有一个头领当作这条边的代表是不是会好很多,所以这里想到了并查集,将i定为根,i+3为子节点,i+4也作为子节点,然后我们就比较好统计了。

具体怎么操作我在这里侧重讲一下这个字母的个数该怎么统计,现在我们已经存储好了每一个集合,每个集合里面有一个根,我们可以通过根来统计这条边的字母数,可以存在一个二维数组里,行是根,然后列是si或ti,他俩的差别就是遇到si++,遇到ti--。这样只要再维护一个bool变量,然后遍历根,再遍历根下字母数量,如果有不为零的,就输出no,反之yes。这个遍历根,我们可以通过当find(i)!=i的时候跳过就好了。

CF2245C MEXOR

真是没想到可以这么构造,太精妙了,我不看题解一点思路都没有。

我们从mex开始研究,我们不难发现不管怎么排f(n-1)只能是n,也就是说前面的异或可以写成n^k,只要等式两边同时异或n,我们将这个值定为x,那么很明显,x就是这题构造的关键,我们可以想办法构造出前几个全是0,然后最后再x和n,深入构造思路之前,我们要先研究一下什么情况下无法构造,即输出NO,先说结论:x的最高位不能高于n-1,则输出no。接着我们来深入研究一下这个构造,可以将x分为三类,当x=0的时候,这个时候直接将数组第一个存零(为什么是第一个?),当x小于等于n-1的情况下,我们可以构造数组前三个数为x、0,当x大于等于n-1的情况下,不能像上面那样构造了(为什么?)我们不妨定义一个数y=(n-1)^x,我觉得这是思路中非常精妙的一点。然后前三个数这么构造,n-1、y、0,然后存完这几个数后,我们将一个数组a先等于这个数组,然后把没用过的数从小到大放入数组a,然后翻转a。先说第一种情况,翻转完之后我们可以发现,数组变成了1234......0,这样我们会发现前面f变成了所有0,最后变成n,又因为x=0所以k一定等于n,所以这样构造没毛病,然后x小于等于n-1的思路与0的一致,同样是前面全变成0。构造出x^n就行,因为x等于的是k^n,也就是说我们要构造x^n。

CF2190B1 Sub-RBS (Easy Version)

首先我们先把判断更好的两个条件去掉一个,因为我们要判断的就是s的子序列,肯定有可能是s的前缀,所以第一个条件是无法满足的,然后我的思路就变成了去掉第一次出现的连续右括号的长度的两倍,思路半对吧。

因为我没考虑到不是第一次出现也可以作为t的转折点,然后我判断是否可行也存在失误,我并没有判断要删掉的右括号的右边是否存在足够的左括号去匹配,还有我统计连续右括号长度的方法也不到位,我是直接遍历,更加合理的思路应该是找到第一个左括号的下标,然后j-i就是我们要找的长度了。然后可以用一个后缀和来统计左括号的长度来配合j检测这个位置是否可行。

代码有个地方挺好的,就是思路里怎么找右边第一个左括号的位置,直接用while的话复杂度就到了n方,在第十个测试的地方就超时了,所以我们可以用后缀和一样的思路,从右往左遍历,存第一次遇到的左括号,然后假如这个位置不是左括号,那么就让这个位置等于右边一个的值。这样我们只需要用下标j就能直接找到j右边最近的左括号的位置。那么时间复杂度就被我们压缩到了n。

CF1790E Vlad and a Pair of Numbers

什么叫你很自然就能想到构造b等于x/2。虽然我没找到核心吧。

a+b=(a^b)+a&b,这是这题最初的钥匙,(要记住的,以后也能用到,叫做xor恒等式)然后我们带入和化简就能得出a&b=x/2,从这个式子我们就能看出x不能是奇数,然后竟然告诉我你很自然得想到b=y=x/2,我想这和x/2&3x/2=x/2有关系,此时a就等于2x-y,并且我们为了保证a异或b等于x,x和y不能同位置的0,因为这个时候要满足a异或b等于x,也就是(x+y)^y=x,并且满足x+y=(x^y)+2(x&y),我们看前面的式子,什么情况下能得出x,是不是当括号里变成x异或y,而后面那个式子正好提供了这一途径,就是当x&y等于0的时候,那么就是当x和y没有公共0的时候。所以我们只需要排除x为奇数并且x&y=1的情况然后输出3x/2和x/2就行了。

CF1772D Absolute Sorting

我一开始全部同时考虑,只找到了一些比较好发现的性质,比如说只要单调肯定能输出结果,然后我的研究方向就开始往单调性走了,我研究了先增后减的情况和先减后增的情况,并没有发现什么。然后就卡住了。

正确的研究方向应该是相邻两个数研究,因为相邻两个数可以写出一个式子,|ai-x|<=|ai+1-x|,就是为了满足题目的要求所得出的等式。在我思路里也写到了,只不过我写的是一串a1,a2,a3,等等,这么研究得不出什么规律,最重要的变形就是将等式两边进行平方(下次做到绝对值这样的题目希望我可以敏感的想到平方),然后我们化简式子可以得到ai^2-ai+1^2<=2*x*(ai-ai+1),这个式子其实可以同时除以ai-ai+1)*2,然后就得到了有关x的等式,而我们要构造的就是x,但是这里有个痛点,因为我们不知道ai与ai+1的大小,所以这时候我们分类讨论,当ai<ai+1,这个时候除不等号要变号,也就是x<=(ai+ai+1)/2,然后ai>ai+1的情况同理,得到x>=(1+ai+ai+1)/2(这里为什么要向上取整?)当他俩相等的时候,直接跳过就好了。然后我们就得到了x的两个限制,也就是说只要遍历完,左端点小于等于右端点就满足否则-1。

为什么左边界要向上取整?如果这个时候本来应该大于4.5的x没有向上取整那么就会大于等于4,不满足,所以我们为了满足大于4.5有要是整数,所以这个时候向上取整。

CF1771B Hossam and Friends

这道题怎么说呢,其实感觉和上面一题有点像(但是我就是没想出来),都是统计所有限制,只不过这道题需要模拟。

核心思路就是找到这个位置的最左边区间使得左边区间到这个位置的区间是个好子区间,也就是说我们要固定右边。所以我们需要统计每个位置的限制,一个数组来存储,遍历题目给的数据,但是需要注意的是我们需要将两个数据排好序,例如xy两数,需要让小的在前面, 如果不是用一个swap,然后需要取limity=max(x,limity),这里要取最大值因为这里会用多重限制条件,我们要严格符合当r>y时l>x,然后我们就可以模拟每个位置然后去求这个位置的子数组最大长度,left=max(left,limitr+1),ans+=r-left+1。这里取最大值我认为是让这个left满足最小左侧区间。

CF2247D1 XOR Sorting (Easy Version)

这题如果思维能到达那里那就简单了,可是我感觉这思维太跳跃了,感觉是我的思维不过集中和熟练,我建议自己下次刷题的时候超过30分钟没有头绪就去看题解的第一个关键观察然后继续推到,如果还是没有就看完整篇题解,然后自己证明一遍,第二天不看代码说出这题的关键观察(来自chatgpt)。

我一开始觉得通过已排序列找到哪些位置需要交换,然后找到怎么样交换才能使异或最小,但是我不会找,所以就问了ai,发现其实并不是这样的,我们先来模拟k比较小的情况,k=1,此时01可交换23可交换45可交换,因为她们两个的异或都小于等于1;接着来模拟2,沿着上面的思路,我们可以发现,02、13可交换,46、57可交换(我认为后面没有继续模拟也是失败原因之一)。根据两次模拟我们就可以发现,我们可以将数组划分为几个区域,长度为2*k,但是这里还差一点,因为模拟每个k可能会超时,当k=3的时候,模拟一遍会发现与2的结果一致,此时相当于增加了0^3,而这个恰好在k=2中存在,所以k因该就是2的j次的间隔,我们模拟k=4也能证明。所以k*=2就不会超时了。

CF2218F The 67th Tree Problem

*n=x+y

这是一道1500的构造,现在觉得其实没有这么难,但是没看题解之前,还是感觉好难(理解题目就花了我好一会儿,条件多了就是容易搞混)。先来理解题目吧,首先x和y分别代表树的大小为偶数的根节点的个数,以及大小为奇数的。比如说1-2-3这个数,y的个数就是2,x的个数是1,分别是1,3&2。理解了之后该开始构造了,该怎么构造呢,先判断什么情况下不成立吧,斯~,搞不懂~。

核心观察:这个节点的大小可以表示为1加上子节点的大小,此时还不够明显,我们尝试带入奇偶性,当有奇数个子节点并且大小均为奇数时,那么这个节点的大小就为偶数;当有偶数个子节点并且大小为奇数时,那么这个节点的大小就是奇数。从这个观察我们可以推出x要小于等于y,为什么?假设我们要构造大小为偶数的节点,最直接的方式是给他接一个大小为奇数的树,也就是说y的数量至少要和x一致。然后我们观察1这个根节点,也会发现一个限制条件,就是当x+y为偶数时,那么1这个节点大小一定会是偶数,所以这个时候x就不能等于0至少要是1(就是这个1)。所以我们就得出了在条件x>y||(n%2==0&&x==0)下输出no。

关于构造,最直接的方式:当x==0时,直接将n-1个数挂在1下面,叫星形树。当n为奇数时,此时1为奇数,所以我们可以让y-x-1个数挂在1下,x个树(大小为2)挂在1下。当n为偶数时,此时1的大小为偶数,所以我们可以让x-1个树(大小为2)挂在1下,然后让y-x+1个数挂在1下。

相关推荐
爱刷碗的苏泓舒1 小时前
泰勒级数与泰勒展开:GNSS卫地距线性化、Jacobian矩阵与Hessian矩阵
线性代数·算法·矩阵·gnss·雅可比矩阵·卫地距线性化·海森矩阵
垆边人似月.1 小时前
华为题:每日温度
数据结构·c++·算法
Sylvia-girl1 小时前
堆排序算法
算法·排序算法·c
Peregrine91 小时前
数据结构 - > 树和二叉树
数据结构·算法
我是人✓2 小时前
Java面向对象核心特性深度解析
java·前端·算法
j7~2 小时前
【算法】专题四.前缀和:一维二维模板,配套 LeetCode 真题,结合同余定理、哈希前缀和,搞定子数组与子矩阵区间求和问题。
数据结构·c++·算法·前缀和·优选算法
看浪的路人2 小时前
第1讲:2026 大模型应用开发全景——Prompt / RAG / 微调 / Agent 到底先用哪个
人工智能·算法
怕浪猫2 小时前
AI Agent 的安全怎么保障?面试最后一关的终极问题
算法·面试·github
晓德2 小时前
7、LLM 模型是怎么训练生成的?(4)指令微调
人工智能·学习·算法·信息安全