省选题选做

P9170 [省选联考 2023] 填数游戏

打 zr 遇到的某题加强版。

首先 \(|S|,|T|=1\) 的情况可以拆成在两个相同的数选一个,这样就都是两个数的情况了。

考虑 check 合法。显然可以转化为 \(T_{i,1}\to T_{i,2}\) 连边,然后翻转一些边使得每个点度数 \(\le 1\),显然联通块只能形如基环树或者树,并查集判下就好。

接下来考虑求解,分两种情况:

  • 基环树

首先非环边是确定方向的,所以这部分能匹配就匹配。接下来考虑环边,有两种定向方法,设这两种的答案分别为 \(A,B\),那么目的是要最大化 \(\min(A,B)\)。考察一条环边,发现确定其对应的 \(a_i\) 时会有五种情况:无论如何也不匹配,只能在 \(A\) 中匹配,只能在 \(B\) 中匹配,\(A,B\) 都能匹配(自环),只能在 \(A,B\) 选一个匹配。显然前四种选了不会更劣,用完之后再用第五种操作尽量填平最小值,容易 \(O(1)\) 计算。

此题真正难点。

首先将 \(|S\cap T|\le 1\) 的位置都选了。

然后考虑剩下部分,可以看做给边“定向”。具体来说,若 \(T\)\(u,v\) 中选了 \(v\),就可以看做定向 \(u\to v\)。这里的定向是相对 Alice 而言的,和 Bob 无关。

Bob 显然是选一个根,形成一棵外向树。设 \(w_i\) 表示将根定为 \(i\) 的价值。那么可以发现,定向 \(fa\to u\) 相当于将 \(u\) 子树外 \(w\) 值集体 \(+1\),反之则为 \(u\) 子树内集体 \(+1\),最终要确定一种操作方案,使得 \(\min w\) 最大化。

显然暴力考虑每种方案是指数级的,这启发我们减少状态数。具体而言,如果我们发现,如果两条边 \(+1\) 的点集无交,那么会有的点没有被加到,显然翻转一下某条边更优,这样每个点至少加一次。然后可以发现这样最终的方案一定形如选一个根,每条边都是根向边。需要注意的是,这里的根是相对 Alice 的方案而言,并不是 Bob 的。

因此考虑换根,对于每个 Alice 根,用一个 DS 维护所有 Bob 根的答案。那么可以发现 \(u\to v\) 就把这条边翻转一下就行。拍到 dfs 序上就相当于支持:区间加,全局最小值。线段树维护即可。

于是我们以 \(O(n\log n)\) 的时间复杂度解决了此题。

P10217 [省选联考 2024] 季风

约定:令 \(a_i,b_i\) 代替原来的 \(x_i,y_i\),避免变量重名。

显然地,考虑按 \(m\bmod n\) 的值分类,那么每一类都相当于若干个整段 \(+\) 一段前缀。

假设加上的是 \([1,i]\) 前缀,选了 \(m'\) 个整段,那么 \(a\) 的和可以表示为\(m'\times suma_n+suma_i\)\(b\) 同理。现在考虑如何对于一个 \(m'\) check,注意到 \(a',b'\)实数,于是不难猜测,有解当且仅当:

\[|m'\times suma_n+suma_i-x|+|m'\times sumb_n+sumb_i-y|\le (m'n+i) \]

注:\(m'n+i\) 是实际的 \(m\)

于是做一点转化,令 \(x\to x-suma_i,y\to y-sumb_i\),那么不难发现此时绝对值内的 \(suma_i,sumb_i\) 消失了。于是只需要分四段大力分讨即可。

注意到答案实际上相当于维护 \(\le 3\) 个形如 \(ax\le b\) 的不等式的解集。这个随便做就行,我赛时写繁了,用了一个 pair<int,int>array<int,3> 存储最终的解集(可以直接维护左右端点,比较好写),同时细节也很多,比如我就挂了 \(60\text{pts}\)

复杂度 \(O(n)\),可以通过。

Code

P10218 [省选联考 2024] 魔法手杖

看到异或这种东西,考虑按位确定答案。

先特判掉 \(\sum b_i\le m\) 的情况,此时答案就是 \(\min a_i+2^k-1\)。否则可以注意到至少一个数不会参与加法。换句话说,答案的位数不会超过 \(k\) 位。

直接做貌似并不好处理,考虑放在 01-trie 上做。

具体来说,设计一个函数 solve(p,bit,cost,mn,x,ans) 表示当前走到节点 \(p\)\(ans\)异或部分的最小值,要确定 \(x\)\(ans\) 在第 \(bit\) 位的取值。同时加法部分已经花费了 \(cost\),加法部分最小值为 \(mn\)

如果递归到叶子,就直接用 \(\min(mn+x,ans)\) 更新答案即可。

否则,不妨假设当前点有两个儿子。显然,如果两个儿子都选异或,那么答案的这一位一定会 \(=0\)。我们不希望这种情况发生,所以要考虑将某棵子树全部放进加法部分,记为“删除”操作。

以删除左儿子为例。首先肯定要满足加上左子树之后的 \(sum\le m\)。那么此时只有右儿子在异或部分,那么 \(x_{bit}=0\)。然而,我们仍然需要考虑加法部分和异或部分的关系。考虑什么时候加法部分永远比异或部分小:显然,当 \(x\)\([0,bit-1]\) 全取 \(1\)\(ans\)\([0,bit-1]\) 位全取 \(0\) 的时候两者相差最小。若 \(\min(mn,mina_{ls})+x+2^{bit}-1\ge ans+2^{bit}\)\(\min(mn,mina_{ls})+z\ge ans\),仍不能分辨出两者的大小关系,递归到右儿子继续计算;否则,加法部分永远小于异或部分,令 \(x\) 的后面几位全选 \(1\) 即可,用 \(\min(mn,mina_{ls})+x+2^{bit}-1\) 更新答案。

对于删除右儿子以及只有一个儿子的情况也是类似的,具体可以看代码。

时间复杂度 \(O(nk)\)

Code

P10219 [省选联考 2024] 虫洞

P10220 [省选联考 2024] 迷宫守卫

题目要求最大化字典序,不妨先考虑考虑如何最大化第一个数

考虑二分,每次二分一个数 \(mid\),考虑 dp 求解,设 \(f_u\) 表示 \(u\) 子树内最多需要花费多少代价,使得第一个能到的叶子 只能是 \(q\ge mid\) 的点。

根据是否封锁当前节点讨论,有 \(f_u=\min(f_{ls}+f_{rs},f_{ls}+w_u)\)。这样只要 \(f_{rt}\le k\) 就合法。

然后这个东西也是可以直接 dp 的,具体就是把 \(mid\) 扔到数组第二维。但是需要离散化 \(+\) 归并排序转移才能保证复杂度,很不优雅。

然后假设第一个走到的是叶子 \(p\),考虑将根到叶子的路径拿出来,显然剩下的部分会分成 \(O(n)\) 个子树。那么根据 dfs 的性质,最终的序列显然就是 \(q_p\) 加上这些子树按根的深度从大到小排序得到的序列依次拼接。于是问题变为了 \(O(n)\) 个规模更小的子问题,可以考虑递归。

但是还有一个问题没有解决:就是删掉这条路径之后,\(k\) 的变化。显然直接减掉根的 \(f\) 不一定是最优的,我们考虑什么时候可以做到更优。考虑路径上(不包括根)的每一个点 \(x\)

  • \(x\) 是右儿子。此时其父亲显然是没有封锁过的(否则会从左兄弟下去,\(p\) 就不是第一个点了),也就是 \(f_{fa}=f_x+f_{lbro}\)。此时我们直接把左兄弟的 \(f\) 值加回到 \(k\) 里即可。

  • \(x\) 是左儿子:此时父亲可能被封锁过。首先如果没被封锁和上面是一样的,此时有 \(f_{rbro}\le w_{fa}\)。否则,我们考虑把 \(w_{fa}\) 加回去,也就是撤销掉这次封锁,这样可以使右兄弟的答案变大。但是加回去需要满足从右兄弟下去只能走到 \(>q_p\) 的点,否则从右兄弟下去最优解就不是 \(p\) 了。判断很简单,只需要检验是否 \(f_{rbro}\le k+w_{fa}\) 即可。

复杂度:设 \(T(n)\) 为解决高度为 \(n\) 的满二叉树所需的时间复杂度,有:

\[T(n)=O(n2^n)+\sum_{i=1}^{n-1}T(n-i) \]

然后随便分析分析就知道 \(T(n)=O(n2^n)\) 了。或者直接打表都知道能过。

Code

P10221 [省选联考 2024] 重塑时光

P10222 [省选联考 2024] 最长待机

posted @ 2024-03-12 21:21  Southern_Dynasty  阅读(84)  评论(3编辑  收藏  举报