2020牛客暑期多校训练营(第二场)

E. Exclusive OR

     题意:给你一个长度为n的数组a,求选择一个的最大异或和,两个的最大异或和,三个的最大异或和,....,n个的最大异或和,

每一个数可以选择多次(1 <= n <= 200000, 0 <= a[i] < 2^18)

   题解:首先我们知道极限情况下选择2^0, 2^1, 2^2, 2^3, 2^4, 2^5, ...... , 2^17共18个数,所以选择18个数必能到达最大值,同时在这个极限情况下,选择19个数应该在18个数的基础上异或(2^0),20个数可以选择两次2^0异或,答案等于18时候的值,也就是说第i(i >= 20)时答案等于i-2时的答案,类推到所有情况可以发现,最多只要求出前19个数即可。做法也很简单,我们知道\sum_{i=x\bigoplus y}A[x]*B[y](其中A数组表示原数组,B数组表示答案数组),一开始B数组只有0是1,那么我们卷积一次,可以得到所有出现过的数,此时找出最大的答案即可,第二次卷时可以得出选择两个数的所有答案,同理找最大,总共卷19次即可。

异或卷积左拐百度

 

G. Greater and Greater

    题意:给你一个长度为n的数组a,并给你一个长度为m的数组b,现在问你有多少种选择方法使得从a数组中选择连续的长度为m的子数组a'使得a'[i] >= b[i](1 <= i <= m)(1 <= n <= 150000, 1 <= m <= min(40000, n))

   题解:这边介绍两种解法:

  1.空间复杂度O(m*m),时间复杂度O(n*(\frac{m}{w} + logm))(其中w=32或者64)

     首先声明一点,我们将第m位设为bitset的第0位,第m-1位设为bitset的第1位....

     将b数组从小到大排序,并且记录原来每个值的位置

     我们定义bitset<40001> bt[40001],其中bt[i]表示到i位置出现数的原始位置的状态

     比如第一个数在原本的最后一个出现,那么bt[1] = 000.....001, 只有第0位为1

    预处理下bt

    现在我们看以下的一个长度为4的st[4](表示的是a'数组的第一个位置>=b数组的第一个位置, a'数组的第二个位置>=b数组的第二个位置, a'数组的第三个位置>=b数组的第三个位置, a'数组的第四个位置>=b数组的第四个位置,显然选择这个数组满足题目的要求)

     2020牛客暑期多校训练营(第二场)_第1张图片,如果将bt[0]向右移动一个位置,那么2020牛客暑期多校训练营(第二场)_第2张图片,发现st[0],st[1]的2号位相同,那么我们将st[0], st[1]都向右移动一个位置,2020牛客暑期多校训练营(第二场)_第3张图片,发现st[0], st[1], st[2]位置的1号为相同,那么我们将st[0], st[1], st[2]都向右移动一个位置,2020牛客暑期多校训练营(第二场)_第4张图片,发现st[0], st[1], st[2], st[3]0号位置都是相同的是1,我们同时发现第i次移动的结果只需要将st[i - 1]的结果&st[i]的结果赋给st[i]即可(即st[i] &= st[i - 1]),但是O(nm)的空间复杂度我们是接受不了的,所以我们对于每一个位置i对应的st[i]可以用bt来表示,通过二分我们可以在b数组中找到最后一个不比a[i]大的,那么st[i]就解决了。这边说明下st是什么:st[i]记录的是所有不比a[i]大的b数组出现的下标位置的状态,上面的例子仅供参考(不具备真实性)。因为一次次的右移并且是&操作,就像上面的例子一样,只要进行m-1次移动并且bitset中0的位置为1时满足题目要求。所以,在遍历数组a之前开一个bitset<40001>ans, 将第m-1位赋上1,然后与上a[1]时的st[1],.......。注意看我上面的列子,选择长度为m的子数组,都是从选择第一个开始,那么第i个必选(不用管对应的st中是否为1,因为是&操作,如果是0还是0),所以m-1位置都要赋值为1。

2.空间复杂度O(n), 时间复杂度O(m*\frac{n}{w})

将b数组从大到小排序

将a数组从大到小排序

初始状态a数组每一个位置都可以作为满足条件的最后一个位置(即第m个位置),设置一个biset<1500001> ans[m + 1] (ans[0]每一位为1, 这边先开ans[m+1],便于解释,最后只需要ans[0]就行了,ans[1]可以通过与上ans[0]实现, .......)

设置一个biset<1500001> tmp(每一位为0) 遍历m数组,将比b[i]大的a数组的位置存进tmp中,设当前b[i]对应的位置为x,那么如果向右移动x位置后对应与ans[i - 1]的1位置还是1那么说明a'数组的第i + 1位置(因为是从大到小,顺序倒过来的)存在解, 即ans[i] = ans[i - 1] & tmp, 到最后m个位置遍历完之后,ans[m]中剩下的1的个数就是答案,因为存在1, 2, 3, ..., m位置满足条件。

我个人感觉第二种比较简单,代码也简单。

H. Happy Triangle

题意:有q(<=200000)次操作,

          如果op = 1,插入一个x,

          如果op = 2,删除一个x,

          如果op = 3,查询集合中是否存在两个数y,z,使得x,y,z能构成三角形

          x <= 10^9

其中差值用线段树或其他维护即可

2020牛客暑期多校训练营(第二场)_第5张图片

2020牛客暑期多校训练营(第二场)_第6张图片

2020牛客暑期多校训练营(第二场)_第7张图片

K. Keyboard Free

题意:给你一个同心圆,有三个半径r1, r2, r3, 现在告诉你有三个点A, B, C分别在半径为r1, r2, r3的圆上,问你三角形ABC的期望面积。

题解:

      2020牛客暑期多校训练营(第二场)_第8张图片

A(r1, 0)

B(r2cosβ, r2sinβ)

C(r3cosγ, r3sinγ)

设∠OJA = ε 

我们先固定A为x坐标上的一点,BA垂直于X轴,那么我们易发现C到AB的距离为|cosγ - cosβ|,所以高的期望为

2020牛客暑期多校训练营(第二场)_第9张图片

现在我们要知道AB的长度,AB:(r2cosβ - r1, r2sinβ)

现在我们要将β和ε 联系起来,这样就只有一个变量了

设OL垂直于AB且焦点为L

2020牛客暑期多校训练营(第二场)_第10张图片

我们知道AB的斜率为,所以∠JAI = ∠OAL = ,所以

,所以2020牛客暑期多校训练营(第二场)_第11张图片

最终我们要求的面积期望是

把ε带进去,然后我们用自适应辛普森积分做就行了,精度1e-5内没问题

关于自适应辛普森积分,左拐百度。

 

其他题目就不想写题解了,我太懒了~~~~

你可能感兴趣的:(2020牛客暑期多校训练营(第二场))