Loading

UOJ NOI Round #6

暴露真实水平了,我该怎么办???

Day1

A

首先注意到面基顺序与答案无关,因为如果提前与某个人面基了,那可以让那个人一直与你走相同的路线,等到轮到他面基时再面基。

所以,我们就是要选一个位置,使得所有人(包括你自己)到这个位置的距离的最大值最小。这个位置可以是一个点,也可以是某条边上的某个位置。

对于在点上会合的情况,直接枚举即可。对于在边上的情况,先枚举一条边 \((u,v,w)\),那么在这条边上会存在 \((k+1)\) 个分界点,每个分界点表示某个人从点 \(u\) 进入这条边更优,变为了从点 \(v\) 进入这条边更优。对于两个分界点间的情况,容易计算其答案。

时间复杂度 \(O(k(n+m)\log m\log k)\)

B

我们令 \(\texttt{0}\to 1,\texttt{1}\to -1\)。设此时得到的原串为 \(S\),新串为 \(T\)

定义合法括号前缀为一个由 \(1\)\(-1\) 组成的数列,且其前缀和总是 \(\ge 0\)

先考虑匹配怎么做,也就是说,我们需要检查是否存在一个合法括号前缀 \(W\),使得 \(W\)\(T\) 的子序列,且去掉 \(T\) 中的某个 \(W\) 后,剩下的部分等于 \(S\)

我们贪心地匹配。假如当前匹配了 \(T\) 的前 \(i\) 位和 \(S\) 的前 \(j\) 位,且括号前缀的总和是 \(k\)。若 \(T_{i+1}=S_{j+1}\),则下一位可以直接匹配。否则,若 \(T_{i+1}=1\)\(k>0\),那么令 \(k\gets k+T_{i+1}\) 即可。

如果 \(T_{i+1}=-1,S_{j+1}\neq -1,k=0\),那么我们需要让 \(j\) 减少一些。我们找到最大的 \(p<j\) 使得 \(S_{p\dots j}\) 之和大于 \(0\),并令 \(j\gets p-1\)。这是对的,因为任意两个合法括号前缀交替拼接起来以后,仍然是合法括号前缀。

对于计数,将上面的 \(i,j,k\) 记入状态,然后直接转移即可。

时间复杂度 \(O(nt(n+t))\)

Day2

A

\(F(S)=\sum_{i\in S} a_i\)

假如能找到两个集合 \(S,T\subseteq [n]\) 使得 \(S\neq T\land F(S)=F(T)\),那么令 \(S\backslash (S\cap T)\) 中的元素为 \(1\)\(T\backslash (S\cap T)\) 中的元素为 \(-1\),其余元素为 \(0\),这样就构造出了一组答案。

由于 \(2^n-1>p\),根据鸽巢原理,总存在一个 \(s\in [0,p)\cap \mathbb{Z}\) 使得有至少两个集合 \(S\) 满足 \(F(S)=s\),所以一定有解。

考虑分治。设 \(\operatorname{solve}(l,r)\) 表示:我们要找一个 \(s\in [l,r]\) 使得存在集合 \(S\neq T\) 满足 \(F(S)=F(T)=s\),且保证 \([l,r]\) 间有解。令 \(mid=\lfloor\frac{l+r}{2}\rfloor\),我们考虑求出有多少个 \(S\) 满足 \(F(S)\in [l,mid]\)。设这个数是 \(cnt\),假如 \(cnt>mid-l+1\),说明 \([l,mid]\) 间一定有解;否则,\((mid,r]\) 间一定有解。

现在我们需要处理 \(O(\log p)\) 次询问,每次问 \(F(S)\) 在某个区间内的 \(S\) 的个数。折半,设 \(t=\lfloor \frac{n}{2} \rfloor\),开始时预处理 \(a_{1\dots t}\)\(a_{(t+1)\dots n}\) 的所有子集和,并从小到大排序,每次询问时,设 \(S=S_1\cup S_2\),有两种情况:\(F(S_1)+F(S_2)\in [l,r]\),以及 \(F(S_1)+F(S_2)-p\in [l,r]\)。对两种情况分别双指针即可。

最后,我们需要对于分治找到的 \(s\),求出两个集合。利用上面折半得到的信息不难求出。

时间复杂度 \(O(2^{\lceil n/2\rceil}\log p)\)代码实现

B

只补了 \(50\) 分做法。

首先,对于两个点 \(x,y\),若存在 \((x,y)\) 这条边,那么 \(x,y\) 连通当且仅当 \((x,y)\) 这条边被选中。

考虑找到一种构造询问的方式,使得对于任意两条不同的边 \((u_i,v_i),(u_j,v_j)\),都存在一个询问满足 \(i\) 被包含在这个询问中,而 \(j\) 不被包含。如果总询问次数为 \(2T(T\in \mathbb{N}^+)\),那么一条边 \((x,y)\) 存在,当且仅当 \(x\)\(y\) 在恰好 \(T\) 次询问中连通。

一种询问次数为 \(2\lceil \log_2 n\rceil\) 的构造:考虑二进制分组,对于每个 \(0\le i<\lceil \log_2 n\rceil\),我们取出所有二进制下第 \(i\) 位为 \(0\) 的边询问;再取出所有二进制下第 \(i\) 位为 \(1\) 的边询问。

一种询问次数为 \(\lceil \log_2 n\rceil(1+o(1))\) 的构造:我们找到 \((n-1)\) 个 popcount 恰好为 \(T\)\(2T\) 位二进制数,令 \((n-1)\) 条边分别对应这些二进制数。每次只需询问第 \(i\) 位为 \(1\) 的所有二进制数对应的边即可。

posted @ 2022-08-07 23:23  Alan_Zhao_2007  阅读(79)  评论(1编辑  收藏  举报