251119 模拟赛
T1
签
T2
拆贡献后反射容斥即可。
T3
给你一个长为 \(n\) 的正整数序列 \(a_{1\sim n}\)。称一个有序三元组 \((x,y,z)\) 是合法的,当且仅当 \(1\le x<y<z\le n\) 且 \(y-x\le z-y\)。有 \(q\) 次询问,每次询问给定区间 \([l,r]\),询问满足 \(l\le x\wedge z\le r\) 的三元组中,\(a_x+a_y+a_z\) 的最大值是多少。
\(n,q\le 5\times 10^5,~1\le a_i\le 10^8\)
考虑什么样的三元组一定不会成为答案。发现如果开区间 \((x,y)\) 存在一个比 \(a_x\) 或 \(a_y\) 更大的数字,那么将 \(a_x\) 或 \(a_y\) 替换为那个更大的数字一定不劣。因此 \((x,y)\) 支配对只有 \(O(n)\) 种。
从右向左对 \(l\) 和支配对的 \(x\) 进行扫描线,问题转化为后缀 ckmax 以及后缀加一个序列的最大值。可以直接用线段树维护。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | |
T4
给你一个长为 \(n\) 的序列 \(a_{1\sim n}\)。有 \(q\) 次询问,每次询问给定两个正整数 \(k_1,k_2\),你需要选择 \(\le k_1\) 个第一类区间,以及 \(\le k_2\) 个第二类区间,满足所有区间两两不交,每个第一类区间的贡献为其所有 \(len\ge 2\) 的子区间的平均数的最大值,每个第二类区间的贡献为其所有 \(len\ge 2\) 的子区间的平均数的第 \(P\) 小(\(P\) 是给定的常数,若不存在第 \(P\) 小则取最大值),最大化贡献和。
\(n\le 10^5,~q\le 5\times 10^5,~3\le P\le n^2,~a_i\le 10^9\)
对于一个区间,如果其存在一个子区间的平均数不小于整个区间的平均数,那么将原区间调整为平均数更大的子区间显然不劣;对于一个第二类区间,如果平均数第 \(P\) 小的区间不是其本身,那么可以调整为第 \(P\) 小的那个区间。因此每一个第二类区间都满足 \(\frac{1}{2}len(len-1)\le P\),每一个选出的区间都满足其平均数比所有子区间的平均数严格大。
由第二个性质可以得到:区间的长度只能为 \(2\) 或 \(3\),否则将它拆成两个区间,一定有一个区间的平均数不小于本身。又由于 \(P\ge 3\),因此答案只和 \(k_1+k_2\) 有关。至此我们去掉了所有诈骗的部分。
记 \(k=k_1+k_2\),转化后的问题显然可以 \(O(n\max k)\) 做。考虑优化,合理猜测答案关于 \(k\) 具有凸性,然后 wqs 二分可以做到 \(O(n\log n)\) 回答单次询问,用闵可夫斯基和优化可以做到 \(O(n\log n)\)。具体的,对序列进行分治,两部分的 dp 数组都具有凸性,合并的过程形如一个 \((\max,+)\) 卷积。跨过分治中心的 \(O(1)\) 个区间分讨一下,只需要记一下区间左右端点各扣掉 \(0/1/2\) 点个即可。
卡常:由于传参部分是瓶颈,因此改成数组显然比 vector 快,这样可以快过 std。