CF1461

难得的一场简单div2...

A,让你构造一个长为n的最长回文子串长度不超过t的串,只能用abc。

显然我们按顺序输出abc,就没有长度大于1的回文串了...

B,给你个500的方阵,问里面有多少个云杉。

枚举每个位置作为云杉的顶点,然后往下扫,用前缀和来判断,n³

C,给你个1e5的排列,有pi的概率把[1,ri]排序,求最终有序的概率。

发现后面如果排序了,前面的就没影响,所以从后往前考虑,后面排了的概率+后面没排*前面排了的概率即可。

注意如果本身就有序,答案是1。如果某两个排序位置之间有个ai ≠ i,就跳出。因为前面即使排了也做不到有序了。

D,给你个序列1e5, 你每次可以选择(min+max)/2为分界,把序列分成大于/不大于两部分,并取其中一部分继续操作。多次问能不能得到某个和为k的序列。

注意到是个二叉树形状,并且复杂度不会太高(如果一个序列里所有数都一样,就停)。于是我们把所有可能序列的和提取出来放到set里,直接查询。

E,饮水机里的水量任意时刻都要在[l,r],初始为k,每天固定用掉x,每天开始前可以加上y,问能不能t天内保持水量合法,1e18,x<=1e6

傻逼大分类讨论。x==y的情况很简单。x>y的情况也很简单。主要是x<y的时候,我们发现有两个关键界限lx=l+x-1和ry=r-y。

如果水量在ry及以下,就可以加水。并且水量减少的时候,一定会路过[l,lx]这个区间。

于是如果lx<=ry,那一定可以维持t天。否则找循环节。我们设计一个函数,O(1)求水量从now第一次跳到ry及以下的天数。如果这一下跳出了l,那就不可。否则就会跳到[l,ry]里面,我们用set或者数组记一下。

如果两次跳到同一个地方,就有循环节,就可以了。

实现的时候注意一下 。。。

F,给你个1e5的0~9序列,给你+-*中的几个操作符,你要填充n-1个操作符,使得表达式总值最大。

只需考虑包含+*的情况。

显然以0分段,考虑每一段内,如果乘积大于某个值,显然直接全乘起来最优。否则的非1数个数很少,可以直接DP。

我一开始想的是区间DP,一直莫名其妙WA。但是可以普通序列DP,O(n²)。实现上注意一下。

posted @ 2020-12-17 11:20  huyufeifei  阅读(62)  评论(0编辑  收藏