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个数即可。做法也很简单,我们知道(其中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))
题解:这边介绍两种解法:
首先声明一点,我们将第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数组的第四个位置,显然选择这个数组满足题目的要求)
,如果将bt[0]向右移动一个位置,那么
,发现st[0],st[1]的2号位相同,那么我们将st[0], st[1]都向右移动一个位置,
,发现st[0], st[1], st[2]位置的1号为相同,那么我们将st[0], st[1], st[2]都向右移动一个位置,
,发现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。
将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
其中差值用线段树或其他维护即可
K. Keyboard Free
题意:给你一个同心圆,有三个半径r1, r2, r3, 现在告诉你有三个点A, B, C分别在半径为r1, r2, r3的圆上,问你三角形ABC的期望面积。
题解:
A(r1, 0)
B(r2cosβ, r2sinβ)
C(r3cosγ, r3sinγ)
设∠OJA = ε
我们先固定A为x坐标上的一点,BA垂直于X轴,那么我们易发现C到AB的距离为|cosγ - cosβ|,所以高的期望为
现在我们要知道AB的长度,AB:(r2cosβ - r1, r2sinβ)
现在我们要将β和ε 联系起来,这样就只有一个变量了
设OL垂直于AB且焦点为L
我们知道AB的斜率为,所以∠JAI = ∠OAL =
,所以
把ε带进去,然后我们用自适应辛普森积分做就行了,精度1e-5内没问题
关于自适应辛普森积分,左拐百度。
其他题目就不想写题解了,我太懒了~~~~