给定序列 和 ,要求交换 中的两个元素,最小化 。
设 且 ,则有:。
我们把上述不等式拆成 和 、、 来处理。
:将序列按照 排序从大到小扫一遍。
和 :在扫描的时候判断一下,若 则在线段树里查询;否则执行插入操作。
:这个可以是线段树里维护的东西。
于是,一个对的贡献就是 ,分类讨论一下:
:直接在一维线段树中查找 的最大的 并与 取 。
且 :也就是在二维线段树中查询 的最小值。
其他:同样也是在二维线段树中查询即可。。
评测链接:AC submission.
问一个 的网格图,每个格子染成蓝色或者黄色,要求每列必须有且仅有一段连续的蓝,每行必须有且仅有一段连续的黄,问方案数,021。
经过一系列的思考,我们发现一个方案合法,几乎当且仅当:
一种颜色被另一种颜色分成了两部分,并且这种被分开的颜色,会存在一条垂直于这种颜色对应方向的分界线,使得这个上方的峰值恰好到达分界线,下方的峰值刚好到达分界线;并且上下的这种颜色的部分都是单峰的;两边的峰值段不相交。
然后我们发现,单峰形状的这种面接我们可以用 来计算;对于一个指定的 ,我们可以得到它的方案数为:( 是分界线, 是下方峰值的左右端点, 是上方的)。
统计的时候我们只需统一枚举 ,并使用前缀和优化一下;对行和列各算一遍,这时就可以得到粗略答案。
但是有一种情况会被忽略:就是两种颜色各自分成两块,一共四块的情况;这种情况我们直接枚举这个中间的分界点,四个方向分别用组合数算一遍。。
评测链接:AC submission.
给定一个可重集合 ,求:(不同元素个数小于等于 )
首先做一个转化:
莫比乌斯反演一波:
这时,左边的部分可以 计算,只需考虑右边这部分如何计算;我们分类讨论一下:
一个元素自己乘以自己,贡献系数为 ;一个元素乘以另一个元素,贡献系数为 。于是原式就可以 计算了。
评测链接:AC submission.
给定一个长度为 的数组 (), 次询问,每次询问给定 ,请判断:
是否为 ,如果不为 请输出
A
;否则输出B
。。
假设我们知道一个区间的答案,那么,右移右端点就是插入一个数,左移左端点就是全体加一并插入 ,这些操作在省选联考的《树》这一题中已经有所使用,因此不再赘述。
于是加上莫队,就可以有一个 的做法,几乎可以草过去。然后如何卡常?
1.奇偶位排序。
2.用非递归写法实现 Trie
和整体加一操作(真的不好写)///
3.若询问的长度小于 则暴力求解;否咋再加入莫队;这样可以大大减小常数。
评测链接:AC submission.
桌面上有 张扑克,扑克的正反两面分别写着 。翻转尽可能少的扑克,使得这些扑克可以排成正面递增反面递减的一列。。
一个 到 间的数,要么属于正面序列的一个前缀,要么属于反面序列的一个后缀;于是可以得出: 的牌,一旦存在则无解。
设 表示 对应的那个在 间的数,我们要把这个 序列划分成两个分别递减的序列并且最小化花费。
于是我们可以按照每一处 来分段,每一段内的取值方案只有互反的两种。证明:
return 0*puts("-1")
。评测链接:AC submission.
给一张 的
Excel
,每次可以按照一列为关键值来排序,求构造一个操作序列使 变为 。.
首先有一个显然的暴力的从后向前枚举操作序列的 dfs
:设当前需要区分的连续的子区间有这一些,选择一个没有选择过的、满足在这些关键位置的值都满足大于等于的关系的列,按它排序一下,然后更新一下没有区分开的这些关键段,往下递归……
但是这时,我们发现,倘若当前可选的列集合是 ,我们先选哪个其实没有影响,因为每一次选择结果仅仅是把条件放宽,大不了在更深层我再选择那个落选的嘛……
于是这时就不是 dfs
了,而是直接递归判断,复杂度 ,利用 bitset
优化即可草过去。
评测链接:AC submission. (论滥用 STL 的最高境界)。
给定一棵树,求有多少个边集使得割掉它们之后分出的每个连通块的直径都小于等于 。
,对 取模。
俄国人是不是不会 树形DP
啊,这题多简单啊!(bushi)。设 表示 号点、向下最长链长度 的方案数。
于是有转移方程
根据子树大小优化,这个 DP
是小于 的。
评测链接:AC submission.
数组 由 个正整数构成。你需要将它们分割成最小数量的连续子段,使得每一个子段中的任意两个数(不同位置)的乘积不为完全平方数。
除此之外,你被允许在分割之前进行最多 次修改操作。
在一次修改操作中,你可以选择数组中的某个位置的数,将该位置的数变为任意正整数。
请问连续子段的最小数量是多少(在最多 次操作后)?,。
将每个数的完全平方因子全部除掉,只剩下出现奇数次的质因子的乘积,问题就变成了分成若干段使得一段中没有相同的两个数。
于是乎,设 表示前 个数中修改了 个数的最小段数,于是有状态转移方程:
由于 ,考虑暴力维护当前 的前 个增长点,每次 DP
取每个区间的左端点(DP
数组递增)。
如何暴力维护呢?我们对于每个数维护一个指向左边第一个等于它的数的指针,当我们扫到 点时,相当于插入了一个新增长点 ,于是直接使用 vector
插入即可。。
评测链接:AC submission.
个问题从 到 编号,第 个问题给出 ,,;解决问题 后能解决问题 的条件是: 且 。在解决完 后解决了 ,你的 变为 ,同时获得 分。
问题解决的次数和顺序不受限制。一开始 ,求最高可获得的分数。。
一个重要的结论是,当往左跳了一步后,就不能再往左跳了。
设 表示上一步从 跳到 的最大收获。当 小于等于 的时候,我可以向 转移,转移可以用前缀 优化;对于所有的 ,均可以向右转移,这个转移可以先用桶 来存一下,然后扫到 时直接扫描 得出 的值。
至于 的限制,直接 一下就行了。复杂度:。
评测链接:AC submission.