一堆比赛题

T1

题意简述:给定一个序列 a,每次将当前 a 的第一个元素加入 b 的末尾然后翻转 b,然后删除 a 的第一个元素,求最后的 b 是什么。n106

考虑模拟一下这个过程,发现就是奇数次向最后添加,偶数次向开头添加,最后再翻转 nmod2 次,时间复杂度 O(n)

T2

题意简述:定义两点的距离为 |xixj|3+|yiyj|3。现在给定 n 个点,保证坐标两两不同。接下来添加 q 条边,每条边连接 a,b 长度为 c。现在求初始状态和添加每条边后图的最小生成树。n3000,q5000,50000xi,yi50000,c2×1015,保证添加的边合法且不会构成自环。

首先发现带个 log 复杂度会很危险。于是我们先使用朴素 prim 求出原图最小生成树并找出最小生成树上的边。接下来对于每条添加的边,用 bfs 找出两点间的边权的最大值,并看加上这条新边断掉这条最长的边是否更优,如果是就把原来的那条边替换掉,否则维持原状。时间复杂度 O(n2+nq)

T3

题意简述:定义两个序列 a,b 的权值为 i=1n(aibi)2。现在可以任意次数交换 a 中的两个元素。求 a,b 的最小权值以及达到最小权值的最小交换次数。n3×105,1aibi109,保证 a 中元素两两不同,b 中元素两两不同。

考虑一对 (i,j) 满足 ai>ajbi<bj,考虑交换前后的贡献分别为 ai2+bi22aibi+aj2+bj22ajbjai2+bj22aibj+aj2+bi22ajbi,做差得到:2ai(bjbi)2aj(bjbi)=2(aiaj)(bjbi)>0,故交换后更优,于是把 a 按照 b 的顺序放置即可。接下来我们把要交换的数分成两类:一个是两个数放反,另一个是不满足第一类的。显然后一类的每次交换至多归位 1 个。于是我们按照顺序尝试交换,如果这个数正好跟交换对象是反的,那么交换了 2 个,显然优;否则每次归位了 1 个,达到了上界,也是优的。于是我们直接按顺序交换就是对的,时间复杂度 O(nlogn)

T4

题意简述:对于一个 k×k 的方阵,其中 k 可能是任意正整数,ai,j 代表 (i,j) 上的数。如果其满足以下要求,则称其为魔法阵:ai,jm;方阵两条对角线上的数的和不超过 n;从方阵中选出 k 个格子,这些格子两两不同列且两两不同行,所有选法的 ai,j 之和相同。求有多少个魔法阵。T 组测试数据,1T50,1n,m105

结论:考虑对第 i 行赋值一个自然数 xi,第 j 列赋值一个自然数 yj,令 ai,j=xi+yj,那么 a 构成的方阵一定是魔法阵。接下来我们只需考虑对这个东西计数。不难发现对于一个状态,如果 x 全部减去 1y 全部加上 1,构成的方阵完全相同,也就是计算会重复。所以我们要求 min(xi)=0 即可,因为减去 1 导致出现负数不合法,加上 1 最小值不是 0 不合法。此时 ai,jm 就是 min(yj)m,然后将所有 yj 减去 m。就变成了将至多 nk×m 个石头分成 2×k 个部分,且前 k 个部分至少有一个为空的方案数。先不考虑后面这部分的要求,方案数即为 (nk×m+2×k2×k),因为 (nk×m+2×k12×k1) 代表恰好 nk×m 个石头分成 2×k 个部分,我们多用一个板,代表把这个板左边的东西扔掉。然后只需要减掉 (nk×m+k2×k),其实就是先拿 k 个填到前面,然后对剩下的东西分组。最后的答案就是 k=1n(nk×m+2×k2×k)(nk×m+k2×k)。时间复杂度 O(Tn)

posted @   zxh923  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示