一堆比赛题
T1
题意简述:给定一个序列 \(a\),每次将当前 \(a\) 的第一个元素加入 \(b\) 的末尾然后翻转 \(b\),然后删除 \(a\) 的第一个元素,求最后的 \(b\) 是什么。\(n\le 10^6\)。
考虑模拟一下这个过程,发现就是奇数次向最后添加,偶数次向开头添加,最后再翻转 \(n\bmod 2\) 次,时间复杂度 \(O(n)\)。
T2
题意简述:定义两点的距离为 \(|x_i-x_j|^3+|y_i-y_j|^3\)。现在给定 \(n\) 个点,保证坐标两两不同。接下来添加 \(q\) 条边,每条边连接 \(a,b\) 长度为 \(c\)。现在求初始状态和添加每条边后图的最小生成树。\(n\le 3000,q\le 5000,-50000\le x_i,y_i\le 50000,c\le 2\times 10^{15}\),保证添加的边合法且不会构成自环。
首先发现带个 \(\log\) 复杂度会很危险。于是我们先使用朴素 \(prim\) 求出原图最小生成树并找出最小生成树上的边。接下来对于每条添加的边,用 \(bfs\) 找出两点间的边权的最大值,并看加上这条新边断掉这条最长的边是否更优,如果是就把原来的那条边替换掉,否则维持原状。时间复杂度 \(O(n^2+nq)\)。
T3
题意简述:定义两个序列 \(a,b\) 的权值为 \(\displaystyle\sum_{i=1}^{n}(a_i-b_i)^2\)。现在可以任意次数交换 \(a\) 中的两个元素。求 \(a,b\) 的最小权值以及达到最小权值的最小交换次数。\(n\le 3\times 10^5,1\le a_i,b_i\le 10^9\),保证 \(a\) 中元素两两不同,\(b\) 中元素两两不同。
考虑一对 \((i,j)\) 满足 \(a_i>a_j\) 且 \(b_i<b_j\),考虑交换前后的贡献分别为 \(a_i^2+b_i^2-2a_ib_i+a_j^2+b_j^2-2a_jb_j\),\(a_i^2+b_j^2-2a_ib_j+a_j^2+b_i^2-2a_jb_i\),做差得到:\(2a_i(b_j-b_i)-2a_j(b_j-b_i)=2(a_i-a_j)(b_j-b_i)>0\),故交换后更优,于是把 \(a\) 按照 \(b\) 的顺序放置即可。接下来我们把要交换的数分成两类:一个是两个数放反,另一个是不满足第一类的。显然后一类的每次交换至多归位 \(1\) 个。于是我们按照顺序尝试交换,如果这个数正好跟交换对象是反的,那么交换了 \(2\) 个,显然优;否则每次归位了 \(1\) 个,达到了上界,也是优的。于是我们直接按顺序交换就是对的,时间复杂度 \(O(n\log n)\)。
T4
题意简述:对于一个 \(k\times k\) 的方阵,其中 \(k\) 可能是任意正整数,\(a_{i,j}\) 代表 \((i,j)\) 上的数。如果其满足以下要求,则称其为魔法阵:\(a_{i,j}\ge m\);方阵两条对角线上的数的和不超过 \(n\);从方阵中选出 \(k\) 个格子,这些格子两两不同列且两两不同行,所有选法的 \(a_{i,j}\) 之和相同。求有多少个魔法阵。\(T\) 组测试数据,\(1\le T\le 50,1\le n,m\le 10^5\)。
结论:考虑对第 \(i\) 行赋值一个自然数 \(x_i\),第 \(j\) 列赋值一个自然数 \(y_j\),令 \(a_{i,j}=x_i+y_j\),那么 \(a\) 构成的方阵一定是魔法阵。接下来我们只需考虑对这个东西计数。不难发现对于一个状态,如果 \(x\) 全部减去 \(1\),\(y\) 全部加上 \(1\),构成的方阵完全相同,也就是计算会重复。所以我们要求 \(\min(x_i)=0\) 即可,因为减去 \(1\) 导致出现负数不合法,加上 \(1\) 最小值不是 \(0\) 不合法。此时 \(a_{i,j}\ge m\) 就是 \(\min(y_j)\ge m\),然后将所有 \(y_j\) 减去 \(m\)。就变成了将至多 \(n-k\times m\) 个石头分成 \(2\times k\) 个部分,且前 \(k\) 个部分至少有一个为空的方案数。先不考虑后面这部分的要求,方案数即为 \(\binom {n-k\times m+2\times k}{2\times k}\),因为 \(\binom {n-k\times m+2\times k-1}{2\times k-1}\) 代表恰好 \(n-k\times m\) 个石头分成 \(2\times k\) 个部分,我们多用一个板,代表把这个板左边的东西扔掉。然后只需要减掉 \(\binom {n-k\times m+k}{2\times k}\),其实就是先拿 \(k\) 个填到前面,然后对剩下的东西分组。最后的答案就是 \(\displaystyle\sum_{k=1}^{n}\binom {n-k\times m+2\times k}{2\times k}-\binom {n-k\times m+k}{2\times k}\)。时间复杂度 \(O(Tn)\)。

浙公网安备 33010602011771号