CF1895

A

题意:你在数轴原点。有一个宝箱在 x,钥匙在 y。每移动一单位,耗费 1 时间。你可以到了 x 然后抱着宝箱走,但是抱着宝箱走的总路程不能超过 k 单位。如果某时刻你、钥匙、宝箱在同一个单位上,就能开宝箱。问:最快要多久开宝箱?

要么是拿钥匙,向宝箱走;要么是去抱着宝箱,向钥匙走 k 单位,或者直接走到钥匙那里。两种情况取 min 即可。

B

给定一个长 2n 的数组,将其分为 n 个 pair 表示 n 个点。定义 si 为第 i 个点与第 i+1 个点的曼哈顿距离,请最小化 i=1n1si

显然,如果两个点之间插入一个两个坐标都在它们之间的点,答案不会变。

所以数组排序,让 (a[1],a[2n]) 作为第一个点,(a[n],a[n+1]) 作为最后一个点,答案就是它俩的曼哈顿距离。

C

题意:给出 n 个字符串(len5),每个字符都是数字。问有多少对字符串拼起来之后,前半部分的数字和等于后半部分?(若拼起来不是偶数长度,忽略)

关注:给出的长度 5,直接枚举哪两种长度的字符串拼在一起,用个 map 记录就行了。

D

题意:给出一个长 n1 的数组 bbi=aiai+1。要求能否构造一个数组 a 满足 b,且 ai[0,n1]

si=b1bi,则 si=a1ai+1。将 si 插入 01-Trie 中。

枚举 a1:0n1,查询此时 a1 与哪个 s 异或最大,看这个最大值是否超过 n1:如果没超过,a1 就决定好了,可以输出。

E

小 A 和小 B 在打牌,各有 n,m 张牌。每张牌有自己的攻击力和防御。小 A 先手。

一张牌 a 能打败另一张牌 b,当且仅当 a.attack>b.defence

每当对手打出一张牌,此时的人就必须打出一张能打败它的牌;否则此时的人就输了。当一张牌被打败,它会回到主人手中。

问当两人绝顶聪明,最终的结果是谁赢或者平局。

首先一个局面可以用正打出来的那张牌来代表。把一个局面抽象成一个结点,构建一张有向图。这已经是一个解法,但是是 O(nm) 的。因为边数是 O(nm) 的。

尝试优化边数。发现每次打出去的牌,一定是能击败对面的,防御值最高的牌。将两人的牌按攻击排序,求后缀防御最大值,再套一个二分,就可以求出每个人会使用哪张牌来击败对面的哪张牌。

此时的边数就被优化到 O(n) 级别了,一次 dfs 搞定。

复杂度 O(nlogn)。(排序、二分的复杂度)

F

定义一个长度为 n 的非负整数序列是 Fancy 的,当且仅当:

  1. i[1,n]ai[x,x+k1]

  2. i[2,n]|aiai1|k

多测,给定 n,x,k,求有多少 Fancy 序列,答案对 109+7 取模。
1n,k1090x40

直接求两个条件,很难;所以我们改为求满足第二个条件,但是违反第一个条件的个数。

由于第二个条件,所以 a 要么全部属于 [0,x),要么属于 (x+k1,M],其中 M 代表上界,可以视为 10500

f(l,r) 为违反第一个条件、满足第二个条件、所有元素都在 [l,r] 内的 {a} 的数量。则我们要求的就是 f(0,M)f(0,x1)f(x+k,M)

由条件二的做差,考虑将 a 转用差分数组表示。记差分数组为

cnt(l,r,):固定了差分数组为 后,有多少个 a1 使得 {a} 中每个元素都在 [l,r] 之间。

f(l,r)=cnt(l,r,)

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