省选题选做

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

打 zr 遇到的某题加强版。

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

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

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

  • 基环树

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

此题真正难点。

首先将 |ST|1 的位置都选了。

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

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

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

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

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

P10217 [省选联考 2024] 季风

约定:令 ai,bi 代替原来的 xi,yi,避免变量重名。

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

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

|m×suman+sumaix|+|m×sumbn+sumbiy|(mn+i)

注:mn+i 是实际的 m

于是做一点转化,令 xxsumai,yysumbi,那么不难发现此时绝对值内的 sumai,sumbi 消失了。于是只需要分四段大力分讨即可。

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

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

Code

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

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

先特判掉 bim 的情况,此时答案就是 minai+2k1。否则可以注意到至少一个数不会参与加法。换句话说,答案的位数不会超过 k 位。

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

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

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

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

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

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

时间复杂度 O(nk)

Code

P10219 [省选联考 2024] 虫洞

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

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

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

根据是否封锁当前节点讨论,有 fu=min(fls+frs,fls+wu)。这样只要 frtk 就合法。

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

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

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

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

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

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

T(n)=O(n2n)+i=1n1T(ni)

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

Code

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

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

posted @   Southern_Dynasty  阅读(95)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示