CF1111 刷题记录

日期:2024/11/12

内容:CF1111

A

tag:水题

题意

给出两个字符串 \(s\)\(t\) ,两个字符可相互转换当且仅当它们要么都为元音,要么都为辅音。
如果 \(s\) 经过有限次转换可以变成 \(t\) ,输出Yes否则输出no
\(1\le len_s,len_t\le1000\)

题解

如果长度不同或者有元辅不对应,那么输出No,否则输出Yes

B

tag:水题;贪心

题意

给出 \(n,k,m\)\(n\) 个数,表示每个人的能力值。进行 \(m\) 次操作,每次操作可以删掉一个人(至少有两个人)或者给一个人的能力值 \(+1\) ,且每个人能力值加的次数不能超过 \(k\) 。问最后所有剩下的人的能力值的平均的最大值。

题解

(这题有蓝!?)

注意到加法加在哪里对结果都没有影响,所以两种操作的先后顺序没有影响。我们枚举要删除几个点,然后根据预处理的信息 \(O(1)\) 判断答案,最后取max即可。注意添加操作有上限。

C

tag:类线段树;二分

题意

灭霸要摧毁复仇者们的基地!

我们可以将复仇者的基地看成一个序列,每个位置都有可能有多个复仇者;但是每个复仇者只能占据一个位置。
他们基地的长度刚好是\(2\)的整数幂,灭霸想要用最少的能量摧毁它们。他在摧毁过程中,可以选择:

  • 如果这段基地长度\(\ge 2\),他可以将其分为相等长度的两半。
  • 烧掉这段基地。如果这段基地中没有复仇者,他需要消耗\(A\)的能量;如果有,则需要消耗\(B\times x\times l\)的能量。其中\(l\)是这段基地长度,\(x\)是这段中的复仇者数量。

输出一个整数,表示他摧毁全部基地需要的最少能量。
对于全部数据:
\(1\le n \le 30\)
\(1\le k \le 10^5\)
\(1\le A,B \le 10^4\)
\(1\le a_i \le 2^n\)

题解

注意到最初的序列长度为 \(2^n\) ,自然地联想到二分。但是 \(1\le n\le 30\),显然基地的长度在 \(10^9\) 量级,那么我们就得从 \(1\le k\le 10^5\) 上做文章。

一种显然的思路是,对于每一段,比较分开它和不分开它的代价取最小值,即 \(price_{l,r}=\min(price_{l,mid}+price_{mid+1,r}\ ,不分开的代价)\) 。可以看出这是一个类似线段树的做法。我们发现这样做会超时,但是我们注意到,如果 \([l,r]\) 内没有复仇者,我们一定不选择把它分开(因为分开了要花 \(2\times A\) 以上代价,而不分开只会花 \(A\) 代价),因此可以直接剪枝。这样一来,由于每一层同时只有 \(k\) 个区间在往下递归,时间复杂度就是 \(O(k\log n)\) 的了(类似线段树的复杂度分析)。

细节上需要统计区间的复仇者数量,不过这个乱搞就行。

总结来说,这种方法的一种可能的思考路径是,从线段树出发,联想到 lazy_tag 剪枝,从而发现这一种剪枝方法。

D

tag:dp(背包,删除背包);组合数;复杂题面转化

题意

有一个恶棍的聚居地由几个排成一排的洞穴组成,每一个洞穴恰好住着一个恶棍。

每种聚居地的分配方案可以记作一个长为偶数的字符串,第 \(i\) 个字符代表第 \(i\) 个洞里的恶棍的类型。

如果一个聚居地的分配方案满足对于所有类型,该类型的所有恶棍都住在它的前一半或后一半,那么钢铁侠可以摧毁这个聚居地。

钢铁侠的助手贾维斯有不同寻常的能力。他可以交换任意两个洞里的野蛮人(即交换字符串中的任意两个字符)。并且,他可以交换任意次。

现在钢铁侠会问贾维斯 \(q\) 个问题。每个问题,他会给贾维斯两个数 \(x\)\(y\) 。贾维斯要告诉钢铁侠,从当前的聚居地分配方案开始,他可以用他的能力创造多少种不同的方案,使得与原来住在第 \(x\) 个洞或第 \(y\) 个洞中的恶棍类型相同的所有恶棍都被分配到聚居地的同一半,同时满足钢铁侠可以摧毁这个聚居地。答案对 \(10^9+7\) 取模。

如果某一个洞里的恶棍在两种方案中类型不同,则这两种方案是不同的。

\(1\le |s|,q\le 10^5\)

题解

这题有点难度,但是我觉得顶多评蓝吧。虽然我没做出来而且懒得写了

任意交换两个元素任意次......这不就是随意排序吗?注意到这里要求的就是,xy所属种类在同一半,前后两半交界处没有跨越的种类的情况。注意到答案至多只有 \(52^2\) 种,所以先把答案离散化/预处理出所有答案,然后再加即可。

如果已经知道了哪些元素排在前半部分,设每个字母有 \(c_i\) 个,那么我们可以得到 \(C=(\frac{n}{2})!^2\prod\limits_{i=1}^{n}c_i\) 。然后我们钦定 \(x,y\) 排在前半部分,情况为 \(g_{x,y}\) 种,答案就是 \(2g_{x,y}C\)

我们使用背包求出 \(f_i\) 表示选出一个字符集合 \(S\) 使得 \(\sum\limits_{j\in S}c_j=i\) 。然后我们对于每个询问用“背包删除”删掉 \(x,y\) 得到 \(f'\) ,那么 \(g_{x,y}=f'_{\frac{|s|}{2}-c_x-c_y}\) 。还要特判 \(x=y\)

参考资料[1]

posted @ 2024-11-12 15:23  Luke_li  阅读(102)  评论(0)    收藏  举报