2022年三月好题收集
收集一些有启发的题目
题意:有一个抽奖,种奖品,每种奖品出现的概率为,求次抽奖恰好抽到种不同奖品的概率吗,取模 (
很容易想到阶段就是目前已经抽的次数和目前抽出的不同礼物数
假设抽到的可重集是。
为了方便计算,我们钦定这个排列的编号是单调递增的,我们只需要求出每种排列,再乘上这种排列的全排列个数。
全排列的个数为
那么答案就为
发现下边那一坨最后计算不好处理,也不好放进状态里,所以考虑把它的代价放到转移里。
表示前次抽奖(结果均在)抽出了 个礼物的概率除以所有次数的阶乘之积。
然后就有转移
答案即
将不好计算的代价处理到造成它的步骤上
解法2 :
考虑直接表示前种奖励,抽了j次,有k个不同的概率。
其中组合数表示在t次中选择j次(类似插板)
考虑按单增的顺序考虑集合
题意:给出一个的棋盘,求在上面放个白车,个黑车,黑白车不能互相攻击的方案数。
很显然地,每行每列要么只放一种车,要么什么都不放。
枚举哪些行哪些列放黑车,白车,这样黑白车都独立了,
表示在行,列中放置个车的方案数(其中每行、每列至少放置一个车)。
则
则 容斥一下即可(钦定哪些行,列不放)
预处理必要的信息,将子问题独立
题意懒得写。
神仙题 %%%
涉及到区间求和的情况一般都考虑前缀和,又因为只有两次“转弯”,设其位置分别为,
则表示在从1下到2,在从2下到3的答案,可以求出
取出与分别有关项
令 ,
则
不好处理的地方在于走下来,如果没有这个“下来”的过程就比较好处理。
观察接下来将代价拆成两部分:从的代价以及之后的代价
因为走下来一定需要一条线段,所以我们考虑从哪一条线段走下来的。
从该线段中一点走下来,要么是从之前的某一条线段的末端点走到这个点的,要么是在该线段内第一行走下来的。
令表示从的最优的。
容易发现在这样的枚举下需要用到的只有线段末尾的值。
用一个简单的线段树维护即可。
接下来需要求出选择每一个线段走下来的价值。
要么直接从该线段上方的某一个点走下来,要么从之前的某一个满足的线段走来,则答案为
使用线段树分治维护的板子维护即可。
将代价转化为具体与什么相关
题意懒求得写。
考虑起点确定的情况
那么选择路径的代价就是所有点的儿子的代价之和
表示从根节点向点i走,目前丢了j个磁铁的最大价值
显然地:
其中表示点i周围的点的价值之和。
话说这么智障一个dp+随机化能骗80分/kk
考虑不确定起点的情况
像点分治一样,考虑将一条路径拆成(可以为空的)两部分。
令这条路径上的最高点为
那么拆成两部分。
考虑分别计算两部分的代价。
表示从点的子树向上走到的最大价值。
表示从点向下走到的子树的最大价值。
最后一位表示点是否选择。
发现 不好转移,会算重,于是参考分dp做法,钦定只算儿子的代价,最后再加上父亲的代价。
于是有转移
计算答案和许多此类dp一样,都是在合并儿子时计算。
加上是因为本身的代价是没有计算的
减去是因为计算了本身的代价,然而是路径上更靠前的节点,故不能提供代价。
类似题目 : P3565
类似点分治,考虑将路径分为两部分考虑,采取“儿子向父亲合并”的办法统计答案
题意:已知区间 , 序列,对所有异或上序列变为,给出 求.
妙题
由于是由原序列异或得来的,所以必存在一个 (这个性质似乎可以发扬人类智慧)
那么枚举
考虑对于,如何快速检查。
由于性质
所以这些数之间肯定是不同的,所以我们只用考虑和是否恰好对应即可,因为这样对应异或回去恰好是中的每一个数。
使用Trie即可。
人类智慧法:
由于前面的性质,必然存在一个
所以必然是某个
直接随机取10个个数,将他们对的异或取交集后 即可。
题意: 维护序列 , 支持以下操作 :
1.区间加上一个数
2.查询区间异或和的后m位(二进制下)
首先异或和加之间是没有直接性质的(考虑过每一位开一棵线段树,发现不行,因为进位) ,所以难以使用普通的ds维护,因为知道区间异或时整体加是不能 地求出的。
对于普通的ds难以维护的题目,考虑分块,却发现分块也卡在了整体打tag的一步上,即无法整体 地维护区间异或和随加法的改变量。
由于查询是异或的后10位,于是我们大可不必考虑前面的位,即操作是在模 的意义下进行的 。
那么此时模意义下数的种类就只有 种了。
基于元素考虑不现实,考虑基于统计的算法。
有与异或偶数次等于没有异或,所以本质就是查询出现的奇偶性。
加法导致无法按位考虑,所以直接的想法是暴力开1024个桶,统计每个数出现的奇偶性。
然后加就是将桶“旋转”,如下:
假设在模意义下 。
原本在 的值会到达 , 会到达 。
(我甚至去想了splay)
然后发现由于奇偶性是 bool
的,于是直接使用 bitset<1024>
维护!
具体做法就是开一棵线段树,每一个点存一个 bitset
。
区间加时若整个区间被包含,则直接打标记,更改这个点的 bitset
的值,使用位运算优化后 “旋转操作如下” :
s = ( (s << d) | (s >> 1024 - d) ) ;
bitset
左移、右移 多出的位会自动补0 , 很好理解。
区间查询相同,在线段树上把大区间分成很多个小区间,将代表着这些区间的 bitset
异或起来即可得到整个区间出现次数的奇偶性,遍历该 bitset
即可。
时间复杂度 :
其中 。
前半部分是线段树的复杂度计算方式本身复杂度乘上 push_up/down
的复杂度即可。
后半部分是遍历 bitset
的复杂度。
代码较长,放在此处比较占版面,放出关键代码 (线段树) 。
跑的比指令集慢多了
题意: 有一个长为 的01序列, 取个子段 , 使得其长度和为 ,且这些子段的 0总数/1总数 = 原串的 0总数/1总数 。
构造方案使得 或输出无解。
神仙题,正常人绝对不会往这个方向想。
首先先判无解,当0,1的数量整除 化简后的 时一定是有解的,因为只选单个的0、1是可行的。
只用考虑1的个数正确( )即可。
考虑当 时 , 一定有解
证明:
原串即为答案
令从i开头长度为m的串的1的个数为,即需要找到
那么一定存在使得,也存在 使得 。
证明是反证,若不存在,则
矛盾。
因为
又因介值定理,一定存在一个使得
当 时,再循环意义下重复刚刚的证明2,即将原串复制若干遍,同样存在使得,也存在 使得 。
由于现在在循环意义下,所以 或 , 因为有可能是从某个串开头取一段,结尾取一段。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970969,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步