首页 > 其他分享 >1.25 两道结论题的解法与思考

1.25 两道结论题的解法与思考

时间:2024-01-25 21:58:10浏览次数:33  
标签:背景 异或 可达性 ge 1.25 oplus 我们 两道 解法

背景 1:今天确实没啥好活可以整。

背景 2:今天确实被两道结论题整破防了。

背景 3:拒绝偷跑!卑力下降!

背景 4:当学校寒假的学科答疑和做题冲突的时候,果断选择做题!

背景 5:背景怎么成碎碎念了。

背景 6:原来是吐槽役。

1. ARC094F Normalization

给定 \(\Sigma=\{a,b,c\}\) 的串,每次可以选择两个相邻的不同的字符,把它们同时都替换成除去这两种字符外的另一种字符。给定串 \(S\),问能通过操作到达多少种不同的串。\(O(n)\)。

首先这种无厘头的操作,先考虑不变量:这是容易的,主要到将 \(a,b,c\) 看作 \(0,1,2\) 后,任何操作都不会改变全串的和模 \(3\) 后的余数。

然后再找一些必要条件,比如一开始的串不能全部相等,最后的串不能任意相邻位置都不同。这都是容易发现的。

然后我们发现 \(n=3\) 的时候形成了一个反例:abc 不能到达 bbb,但能到达 aaaccc。怎么办呢?

答案是,\(n\ge 4\) 的时候就没有反例啦!

实际上,由于题目的操作过于复杂,没法进行限制,所以研究其可达性基本上是唯一解题方法。研究可达性就是很多必要条件拼凑起来的。而对于可达性,验证结论正确性的一个方法是写个暴力玩玩,还有个方法是尝试归纳

尤其是对于这种 \(n=3\) 不行的时候。我们发现 \(n=4\) 的时候自由度更高了。我们尝试归纳,然后发现,我们可以把首字母给任意替换!于是就证明成功了。

但是笔者止步于“怎么办呢”。说明猜测结论正确性和归纳的显然性的功底还远远不够。

2. ARC152E XOR Annihilation

Annihilation 的意思是淫灭,毁灭。学习这个新单词或许比看这篇 blog 更加有用。

有 \(2^n-1\) 个球,每个球上有标号 \(w_i\),标号形成 \(1\) 到 \(2^n-1\) 的排列。每个时刻,每个球如果其左侧的权值异或和 \(\oplus Z\) 大于右侧权值异或和 \(\oplus Z\) 那么就往左走,反之往右,或者相同就不动。两球位置相同会合并,新的权值也为异或和。问有多少个 \(0\le Z<2^n\) 使得最后球能不再运动。

首先注意到是排列,所以全体异或和为 \(0\)。于是,\(x\) 右侧的异或和相当于 \(x\) 的前缀异或和。

一个很重要的一步,是我们用前缀异或和 \(s_i\) 去替代 \(w\),于是每个球运动的依据在于 \(s_i\oplus Z\) 与 \(s_{i-1} \oplus Z\) 的大小关系。令 \(t_i=s_i\oplus Z\)。

这样的好处是,相邻两个球碰撞在一起的时候,实际上造成的后果,是 \(t_i\) 消失了(Annihilation)。这个就变得更清楚了。

这样更好的地方在于,由于我们会在 \(t_{i-1}\le t_i\ge t_{i+1}\) 的时候才能进行合并(如果同时取等那么不行),所以最终的 \(t\) 序列要么全是 \(Z\)(合法情况),要么一定形成一个单谷序列,且 \(t<Z\)(不合法情况)。

于是我们就可以在原先的 \(t\) 序列中考虑最终序列。我们考虑最小的 \(t\),如果 \(\min t< Z\) 那么一定不合法,如果 \(\min t\ge Z\) 那么一定合法。

于是问题就变成了所有的 \(s_i\oplus Z\ge Z\) 了。很神奇吧?

之后就简单了,因为这个条件等价于 \(Z\) 在 \(s_i\) 的最高位处为 \(0\)。

但是笔者止步于“一个很重要的一步”之前。问题出现在哪里呢?我们发现这题的解题过程,在于分析(排列的性质)-发现-转换(用 \(s_i\) 来表示)-分析(变化的条件与结果局面的性质)-发现-转换(\(\min t\ge Z\))-分析-解出。

如果我们发现了性质,但是没有进行进一步的转换:将操作表示成我们更容易接受的形式,那么一切都是白搭。要时刻记得要下笔去尝试进行转换,并进行进一步的分析。

标签:背景,异或,可达性,ge,1.25,oplus,我们,两道,解法
From: https://www.cnblogs.com/TetrisCandy/p/17988261

相关文章

  • 闲话1.25
    我想放假啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊写一天题,越来越难受了,想回家。周日还有模拟赛,没法打CF然后好好睡觉,妈的我想放假我想回家。我他妈想回家妈的。......
  • 1.25
    不知不觉已经回家12天了 and 啥也没干 是时候重新计划一下了!!!距离开学还有正好一个月30天 今天腊月15 估计腊月二十九之前要除去几天 2526272829 五天+2天与朋友亲戚之类的聚会 7年后 正月1234515+1天走亲戚之类的活动730-14=16±2 也就是......
  • 1.25学习进度
    1.rdd的数据是过程数据rdd之间进行相互迭代计算,当执行开启后,新rdd的产生,代表老rdd的消失rdd的数据是过程数据,只在处理的过程中存在,一旦处理完成,就不见了这样可以最大化的利用资源2.rdd的缓存sparkt提供了缓存api,可以让我们通过调用api,将指定的rdd数据保留在内存或者硬盘上缓存特点......
  • 1.24 两道树上问题的解法与思考
    内容过于简单,勿喷。1.1P6072Path(双log)选择两条简单路径,满足没有重合的点,且边权异或和之和最大。\(n\le10^5\)。我们可以把问题转化为选出一个\(u\),令在子树内选出两个点的异或和最大为\(f_u\),子树外为\(g_u\),那么我们需要求\(f_u+g_u\)的最大值。首先,通过DSUont......
  • python 有效的数独 多种解法
    解法一:暴力枚举法最简单的方法是对于每一行、每一列和每一个3x3的九宫格,分别判断其中是否有重复的数字。具体实现如下:classSolution:defisValidSudoku(self,board:List[List[str]])->bool:#检查行foriinrange(9):nums=set()......
  • python 在排序数组中查找元素的第一个和最后一个位置 多种解法
    二分查找:基于二分查找的算法可以在O(logn)的时间复杂度内解决该问题。具体实现方式是,先使用二分查找找到该元素的位置,然后向左和向右扩展,直到找到第一个和最后一个位置。代码如下:defsearchRange(nums,target):defbinarySearch(nums,target,lower):left,righ......
  • python 搜索旋转排序数组 多种解法
    二分查找:旋转排序数组中仍然可以应用二分查找算法。首先,我们找到数组中最小的元素的索引,也就是旋转点的位置。然后,我们根据目标值与旋转点的大小关系,在旋转点的左侧或右侧进行常规的二分查找。defsearch(nums,target):#寻找旋转点left,right=0,len(nums)-1......
  • 面对AI革新时,Soul App等社交应用的“出圈”解法是什么?
    2023年初,ChatGPT掀开海内外互联网“AI革新”的序幕。公众在惊讶于ChatGPT对于海量信息富有逻辑的整合归纳、帮助大家提升工作及学习效率之余,更为期待的莫过于有一天人工智能的“意识觉醒”。十余年前由斯派克·琼斯(SpikeJonze)编剧并执导,讲述人类与人工智能“萨曼莎(Samantha)......
  • python 最长有效括号 多种解法
    使用栈:遍历字符串,当遇到左括号时,将其下标压入栈中;当遇到右括号时,如果栈为空,则将当前右括号下标作为新的起始点,否则将栈顶元素出栈,并计算当前有效括号的长度。Python代码示例:deflongest_valid_parentheses(s):stack=[-1]#栈中始终保持一个起始位置max_length=0......
  • python 下一个排列 多种解法
    方法一:使用内置函数Python提供了一个内置函数next_permutation,可以直接用来求解下一个排列。你可以通过导入itertools模块来使用该函数。示例代码如下:importitertoolsnums=[1,2,3]perms=list(itertools.permutations(nums))next_perm=perms[perms.index(tuple(nu......