Loading

Codeforces Round 961

B2 Bonquet(Hard Vertion) (CF1995B2)

事实上B1都写挂了(尖叫)

处理花瓣数相差不超过1的花,可以用map存储每种花的数量,顺序遍历即可(其实是不想排序统计,好麻烦);那么如何计算最终答案呢。。。此处省略我赛时乱七八糟的一堆复杂做法,比较简单的写法是先找到一个可行的解:设两种花的价格分别为 $x1,x2, $ 总量为 \(c1,c2,\)(可行)购买数量为 \(cnt1,cnt2,\)\(cnt1=m/x1,cnt2=(m\% x1)/x2\) ;设此时剩余钱数为 \(y\),考虑将尽量多的 \(x1\) 替换为 \(x2\) ,使剩余钱数尽可能小,有 \(ans=m-y+max(y,min(y,c2-cnt2))\) ,最后取 \(max\) 即为最终答案。代码高亮莫名其妙寄了所以没有代码

B1就更简单了,除了这个正解,应该还有一些暴力乱搞能过,只是我没过而已)

C Squaring (CF1995C)

B1 WA之后并不抱太多希望地打开了C,然后发现好像会写?

要求通过最少次数的平方操作使序列单调不降,很明显从头到尾顺序操作即可,但多次平方可能导致数太大、无法直接操作,于是尝试把式子简化一下。设 \(a[i]\) 被操作了 \(x\) 次,即 \(a'[i]=a[i]^{2^x}\),此时若 \(a[i+1]\) 在操作 \(y\) 次后刚好不小于 \(a[i]\) ,则 \(a[i+1]^{2^x}\ge a[i]^{2^y}\) ,化简得 \(a[i+1]^{2^{x-y}}\ge a[i]\)\(a[i+1]\ge a[i]^{2^{y-x}}\),依据原数组中 \(a[i]\)\(a[i+1]\) 大小关系、分类讨论即可。开始打算二分答案做,接着就发现二分答案过程中仍然有超出long long范围的风险,而直接从 \(2^0 = 1\) 开始枚举,时间复杂度足够,且在题目数据范围内 \(a[i]\) 最多算到 \(2\times 10^6\) 就会跳出循环,非常的安全。赛时过了这题就没掉分了,好评()

D Cases (CF1995D)

\(c\le 18\) 想到状压,但这题的状态设计(至少对我这种菜鸡而言)挺抽象的,官方题解给了好些个hint,有一种解谜游戏的美,喜欢()

首先每个单词的类别(?)(暂且这么翻译吧,总比cf better翻译的“大小写”好点)只由最后一个字母决定,且每 \(k\) 个连续字母中必有一个为结尾,故题目可转化为“求一个字符集合,使每 \(k\) 个连续字母内必有该字符集合中的元素”。看上去还是很拗口,但已经初具状压dp的雏形了。

对于每个连续子串中存在哪些字母,用前缀和预处理、可 \(O(cn)\) 得到当前子串的字母集合 \(s\)\(no\) 数组记录答案集合是否合法,与 \(s\) 没有交集的最大集合(即 \(((1 << c)-1)\oplus s\))及其任意子集为不合法情况,标记为1;使用状压dp倒序枚举状态,可 \(O(n)\) 求出所有不合法情况,注意特判 \(s[n]\) 位置的字符必须为结尾字符,因此不包括该字符的集合也不合法。最后遍历所有集合,合法情况中 \(\_\_builtin\_popcount(s)\) 的最小值即答案。

(说起来dp怎么越练越菜了啊,生活不易狸猫叹气)

posted @ 2024-07-26 22:37  Aderose_yr  阅读(19)  评论(0编辑  收藏  举报