今天早上的模拟赛…难到一种境界啊QAQ…
菜菜的我只拿了50分(20+30+0)TAT…
T1
题意是有两个人A和B在做游戏,还有一个在旁边捣乱的pupil(雾qwq)。一共有a张黑牌和b张白牌。由A先拿牌,B后拿牌,之后是捣乱的pupil。除了pupil之外的A和B,谁先拿到黑的牌谁就获胜。给定两个整数a,b(a,b<=10000),求先手的A和后手的B分别获胜的概率,输出概率在模1004535809意义下的数。
思路:我拿到这题之后…一脸懵逼,想了一个小时没有想到什么正确的算法。于是就在之后打了个20分的暴力,就是暴力枚举每个人会拿到什么牌,时间复杂度O((aa+b)),然后直接算先手赢的有几次,后手赢的有几次和平局的有几次就行了。
题解:考虑二维的DP,通过观察可以发现真正对答案有贡献的方案只有13⋅a⋅b种,所以可以设dp[i][j]表示取牌时还剩i张黑色牌,
j 张白色牌时获胜的概率。(这里只讨论先手的情况)
考虑这一轮的情况:
取到黑色牌,直接获胜。
取到白色牌,对手取到黑色牌,对手获胜。
取到白色牌,对手也取到白色牌,pupil也取到白色牌,进入下一轮。
取到白色牌,对手也取到白色牌,pupil取到黑色牌,进入下一轮。
可以推出以下式子:
dp[i][j]=ii+j+dp[i][j−3]⋅ji+j⋅j−1i+j−1⋅j−2i+j−2+dp[i−1][j−2]⋅ji+j⋅j−1i+j−1⋅j−2i+j−2
则dp[a][b]即为答案。
T2
给你一个字符串,在其中取出两个子串a,
b ,求a+b能构成不同字符串的个数。并求出其中字典序最大的字符串。
思路:刚拿到这题我想试试通过统计每个字母出现的个数,然后一顿乱搞…但是最终发现搞不出来。于是就打了个O(|S|4)的暴力,拿了30..QAQ(我得的分也就这么多了)….
题解:我们考虑得到的a+b的串被记录当且仅当串a的长度最长时记录它。
于是我们容易证明:被计算的方案数满足a+b[0] 不为S的子串(不然b[0]就应该在a后面了)。
定义head(u) 为串S中以字母u 开头的不同非空子串的个数,tail(u)为串S中加上字母u 后不为S的子串的不同非空子串的个数。
又因x,y 均可为空,所以最终答案为∑uhead(u)⋅(tail(u)+1)。
对于求head(u)和tail(u),可以将S的所有子串插入到一个trie树中去重,然后直接判断一下就行了。
第二问..你只用找字母最大且最长的位置就行了..
T3
给你
n,m ,再给你n个二元组(a,b) ,让你求
∑nc=1∑nd=1∑ne=1∑nf=1[⌊ac+ad+ae+afbc+bd+be+bf⌋≥k]≥m
中的最小正整数k满足这个式子。
思路:对于这题我束手无策,只好爆零QAQ…..惨啊
题解:(40分解法)可以先二分答案
mid ,然后算出ti=ai−bi⋅mid。
如果mid符合条件,则
∑nc=1∑nd=1∑ne=1∑nf=1[tc+td+te+tf≥0]≥m
即满足
tc+td≥−(te+tf)
的(c,d,e,f)的个数不小于m。
那么可以算出所有ti+tj的值,求出每个值出现的个数,然后再乘一乘就行了。时间复杂度为O(n2log2maxa)。
(另外30分解法)因为另有30%的数据bi全相等,要求最大的一个x,满足
∑nc=1∑nd=1∑ne=1∑nf=1[⌊ac+ad+ae+af4⋅b⌋≥x]≥m
可以注意到,ai≤1000。
那么可以算出每个值的出现次数cnti。
原问题可以转化为
∑maxac=1∑maxad=1∑maxae=1∑maxaf=1[⌊ac+ad+ae+af4⋅b⌋≥x]⋅cntc⋅cntd⋅cnte⋅cntf≥m
c+d+e+f4⋅b不会超过1000,所以把每个值的个数算出来再求个后缀就行了。
(c+d+e+f)的出现次数同样可以分两边算。时间复杂度O(maxa2)。
(100分解法)结合以上40分解法和另30分解法,先二分再用权值算,就可以了。时间复杂度O(maxa2log2maxa)。
=======我是萌萌的分割线QWQ=======
下午的讲课,是关于二分图的,而我对这一部分知识还是不是很懂,所以下决心要快点学习一下各种关于二分图的知识,例如KM,匈牙利等等…我要继续奋斗!!