2017.8.13 总结

今天早上的模拟赛…难到一种境界啊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,通过观察可以发现真正对答案有贡献的方案只有13ab种,所以可以设dp[i][j]表示取牌时还剩i张黑色牌,j张白色牌时获胜的概率。(这里只讨论先手的情况)
考虑这一轮的情况:
取到黑色牌,直接获胜。
取到白色牌,对手取到黑色牌,对手获胜。
取到白色牌,对手也取到白色牌,pupil也取到白色牌,进入下一轮。
取到白色牌,对手也取到白色牌,pupil取到黑色牌,进入下一轮。
可以推出以下式子:
dp[i][j]=ii+j+dp[i][j3]ji+jj1i+j1j2i+j2+dp[i1][j2]ji+jj1i+j1j2i+j2
dp[a][b]即为答案。

T2

给你一个字符串,在其中取出两个子串ab,求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=1nd=1ne=1nf=1[ac+ad+ae+afbc+bd+be+bfk]m
中的最小正整数k满足这个式子。

思路:对于这题我束手无策,只好爆零QAQ…..惨啊

题解:(40分解法)可以先二分答案mid,然后算出ti=aibimid
如果mid符合条件,则
nc=1nd=1ne=1nf=1[tc+td+te+tf0]m
即满足
tc+td(te+tf)
(c,d,e,f)的个数不小于m。
那么可以算出所有ti+tj的值,求出每个值出现的个数,然后再乘一乘就行了。时间复杂度为O(n2log2maxa)
(另外30分解法)因为另有30%的数据bi全相等,要求最大的一个x,满足
nc=1nd=1ne=1nf=1[ac+ad+ae+af4bx]m
可以注意到,ai1000
那么可以算出每个值的出现次数cnti
原问题可以转化为
maxac=1maxad=1maxae=1maxaf=1[ac+ad+ae+af4bx]cntccntdcntecntfm
c+d+e+f4b不会超过1000,所以把每个值的个数算出来再求个后缀就行了。
(c+d+e+f)的出现次数同样可以分两边算。时间复杂度O(maxa2)
(100分解法)结合以上40分解法和另30分解法,先二分再用权值算,就可以了。时间复杂度O(maxa2log2maxa)

=======我是萌萌的分割线QWQ=======

下午的讲课,是关于二分图的,而我对这一部分知识还是不是很懂,所以下决心要快点学习一下各种关于二分图的知识,例如KM,匈牙利等等…我要继续奋斗!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值