UOJ NOI Round 6
作者:互联网
再次体验到了挂分的乐趣。。。
Day 0
按理来说应该是要参加 笔试 的,结果和同学踢球错过了报名。。。于是咕了。。。
队友极假,三颗单刀一颗没进,无脑致敬斯特林,体验极差。。
Day 1
T1 面基之路
首先注意到 hehe 是肯定不会走回头路的,因为所有人速度都相同,走回头路不如站在一个地方等其他人过来,所以最终一定是所有人都走到一个地方。所谓面基,就是走到某个约定好的地点罚站,等最后一个人过来。。。
于是对 \(k\) 个点中的每个点跑一次最段路,要求的就是点上或边上的一点使得所有人到这个点的最大距离最小,点上的很好求,边上的只要将这 \(k\) 个点排序或二分答案即可,不加以赘述。貌似只有我写了二分答案,常数大的离谱。。。
T2 机器人表演
与官方题解不同,这是取自评论区的一种做法。不知道为何被点了十几个踩。。。
首先这肯定是一个 \(dp\) ,于是考虑设计状态。不要看到括号就去想区间 \(dp\) ,因为给出的串 \(s\) 并不满足括号匹配。。。考虑是否存在一种方法将一个 \(01\) 序列 \(t\) 唯一的表示出来,不难想到先找出最长的 \(s\) 的前缀满足它是 \(t\) 的一个子序列,那么剩下的括号就是新加入的 \(t\) 对 \(01\) 。
于是设状态 \(f_{i, j, k}\) 表示 \(s\) 中最长能与 \(t\) 匹配的长度为 \(i\) ,剩下的序列中有 \(j\) 个 \(0\), \(k\) 个 \(1\) 的方案数,因为每个合法 \(01\) 序列可以被唯一表示,所以只要转移正确就一定不会出现被算重或少算的情况。
接下来考虑转移,先按照长度枚举所有的状态 \(f_{i, j, k}\) ,转移就是枚举下一个位置要添 \(0\) 还是 \(1\):
若要添的数其好等于 \(s_{i + 1}\) ,那么只能转移到 \(f_{i + 1, j, k}\) ;
否则对 \(0\) 和 \(1\) 分类讨论,若要添 \(0\) 显然是没有限制的,可以直接转移到 \(f_{i, j + 1, k}\) ;
若要添 \(1\) ,注意到为了满足括号匹配,只有在 \(j > k\) 的时候可以直接转移到 \(f_{i, j, k + 1}\) ;
否则无法直接转移,但并不代表这种情况一定不合法,注意到可能存在一个位置 \(pre_i\) 满足 \(s_{pre_i} = 0\) ,且 \(s_{pre_i + 1, i}\) 是合法括号序,那么将 \(s_{pre_i, i}\) 归类到新加入的括号,记这一段的长度为 \(len\) ,即可转移到状态 \(f_{pre_i - 1, j + \frac{len}{2} + 1, k + \frac{len}{2} + 1}\) 。
T3 稳健型选手
乍一看没有什么思路,于是先从暴力想起。
直接求最大的贡献很困难,于是正难则反,考虑算另一个人最小的贡献。注意到两人是轮流选取的,且我们考虑的这个人只选最左边的数,那么进行到第 \(2i\) 轮的时候,选了 \(i\) 个数,因此选择的第 \(i\) 个数,一定是在第 \(2i\) 轮之前,于是一种贪心的策略是每次加入两个数,选出此时还没选的最小的数,用堆维护即可,时间复杂度 \(O(nq \log n), 40pts\) 。
考虑另一种贪心,之前是从左向右枚举的,如果从右向左枚举可以吗?显然也是可以的,每次向左加入两个数,因为第 \(i\) 个数是在的 \(2i\) 轮之前选择的,所以新加入的两个数中,较小的那个必须选择,较大的数如果比已经选择的数中最大的小,就选择它(类似于反悔贪心)。这样便实现了同时向两边扩展,可以用两个堆,分别维护选择的数和为选择的数,用不删除莫队即可做到 \(O(n \sqrt(n) \log n), 70pts\) 。然而我写的太丑 TLE 了。。。只是徒增了罚时。。\kk
此时这个做法离正解已经很接近了,将上面两种贪心的规则规范化,就是对于前 \(2i\) 个数中,一定会选择 \(\ge i\) 个数,对于后 \(2i\) 个数中,一定选择 \(\le i\) 个数。不难通过看题解等方法想到可以用分治解决这个问题,对于每个询问,只在第一个它跨过分治中心的区间计算它,由上述贪心可得,对于分治中心的左边,有一些数是必须选的,而对于分治中心的右边,有一些数是一定不会选的,于是用两棵主席树,分别维护左边和右边可能选择的数,每次相当于在两棵主席数中求一个前 \(k\) 大的和。
Day 2
还没改完/kk
标签:pre,NOI,个数,Round,选择,括号,UOJ,2i,贪心 来源: https://www.cnblogs.com/CTcode/p/UNR6.html