已经是条只会签到全靠补题的咸鱼了
A.Game
题意
两方轮流删最大、最小的数,求最后剩下的值。
代码
1 |
|
B. Minesweeper
题意
给一张扫雷地图,判断标记数字有没有出现错误。
代码
1 |
|
C. Finite or not?
题意
给出三个整数p,q,b,判断p/q在b进制下是否是一个有限小数。
解法
数论题。
首先在10进制下,一个分数在化为最简分数的情况下,如果它的分母只含有2和5两个质因数,这个分数就能化简为有限小数。
推广得在b进制下,如果化简后的p/q中的分母只含有b的质因数,那么该分数是一个有限小数。即q在与b的公因数的不断整除下,q能否被化简为1.
需要注意这里如果每步直接取tmp=gcd(q,b)
则会导致tle,由$$gcd(\frac{p}{gcd(b,p)},b)=gcd(\frac{p}{gcd(b,p)},gcd(b,p))$$,则只需要取tmp=gcd(q,tmp)
并不断整除q,tmp的公因数直到q=1(p/q为有限小数)或tmp=1(p≠1且不能继续化简,p/q为无限小数)即可
代码
1 |
|
D. XOR-pyramid
题意
对于长度为m的数组b,定义函数$$f$$如下
$$f(b) = \begin{cases} b[1] & \quad \text{if } m = 1 \ f(b[1] \oplus b[2],b[2] \oplus b[3],\dots,b[m-1] \oplus b[m]) & \quad \text{otherwise,} \end{cases}$$
其中⊕为异或运算,例:
$f(1,2,4,8)=f(1\oplus2,2\oplus4,4\oplus8)=f(3,6,12)=f(3\oplus6,6\oplus12)=f(5,10)=f(5\oplus10)=f(15)=15$
给定一个数组和一系列询问,求区间$$[l,r]$$内$$f$$的最大值。
解法
打表记录左右区间为$$[l,r]$$的$$f$$值dp[l][r],i=l=r的值即为a[i]本身,通过dp[l][r]=dp[l][r-1]^dp[l+1][r]
依次求出区间长度为1~n的f值(区间长度为k=r-l),再通过dp[l][r]=max(dp[l+1][r],dp[l][r],dp[l][r-1])
逐步更新最大值。
其实就是个数塔形式的dp,计算过程中取左下方和右下方的值求异或和并记录,dp更新过程中取三者的最大值更新就可以了,如下
$f(1,2,4,8)=f(1\oplus2,2\oplus4,4\oplus8)=f(3,6,12)=f(3\oplus6,6\oplus12)=f(5,10)=f(5\oplus10)=f(15)=15$
$$15$$
$$5\qquad10$$
$$3\qquad6\qquad12$$
$$1\qquad2\qquad4\qquad8$$
与下方左右两数比较并更新后
$$15$$
$$[6]\qquad[12]$$
$$3\qquad6\qquad12$$
$$1\qquad2\qquad4\qquad8$$
代码
1 |
|
E. Elevator
那我哪会