CF1851

A

B

把奇数和偶数拿出来分别排序,然后按下标归并,看看得出的结果是不是排好序的。

C

如果头尾同色,就找有没有 k 个位置和头尾同色;

否则从头找 k 个和头同色的,然后再在这之后k 个和尾同色的。

D

把每个前缀和相邻的相减,得出的结果:

  1. 有大于 n 的,拆成两个没出现的数相加;

  2. 有重复的,把其中一个拆了;

  3. 没有重复的且在 1n 内,肯定在尾巴处补一个。

如果有两个大于 n,或者两对重复,或者大于 n 的和重复的都有,那就不可行。

如果发现拆了之后不能构成排列,也不行。

E

赛时没看见无环

就是一个类似拓扑排序/深搜的题。从无限的药出发,不停更新。每种药可以混合(找前驱)/买。

F

法一:

考虑每个位单独看。如果 ai,aj 位上相等,那么 x 这一位应该和 ai,aj 的这一位相反。

建立 01 Trie。

枚举 i,遍历 ai 所有二进制位,如果当前位上有和 ai 的位相等的分支,就必定走这个分支,同时把这一位对应的数累加进答案(这是贪心的想法,如果这里不选,即使后面 x 可以满足所有位,2t>x=0t12x);否则就只有一条路可以走。

等走到了叶节点,我们就选好了 ajx —— 这是对于 ai 的最大答案。

复杂度 O(nk)

法二:

a 从小到大排序,下证最大答案一定是相邻的 ai 产生。

排序后,假设答案不是相邻的 ai,ai+1 产生,那么必然是 ai,aj 产生,ji>1

ai=aj,因为排了序,i<i+1<jai=ai+1=ajai,aj 产生的答案 ai,ai+1 也能产生。

否则 ai,aj 的二进制位一定有第一个不同的二进制位。由于 ai<aj,所以这一位上 ai=0,aj=1

此时 ai+1 这一位上若是 0ai,ai+1 产生的答案必然比 ai,aj 更优;若是 1ai+1,aj 产生的答案也更优。

矛盾。故一定是相邻的 ai,ai+1 产生答案。

之后的事情就是排一下序就行。

G

观察发现,hihj+hjhk=hihk,所以 ijk 的代价就等于 ik 的代价。

所以,点 i 能到达点 j,只需要 ij 有一路径上的点高度均 hi+e 即可。

注意到到达关系具有传递性,考虑并查集。

将所有询问离线,然后按照 hstart+e 从小到大排序,每次遇到一个询问,都把所有相互可到达的点并成一个块。

同时我们把所有边 (u,v) 按照 max(hu,hv) 从小到大排序。当此次询问 hstart+e=x 时,对于一条边 (u,v),如果 max(hu,hv)x,那就可以合并 u,v

等把所有边都合并完了之后,检查 start,end 是否在一个连通块内。

注意取出边合并两端的操作,不用每次询问都从头开始,所以总共是 O(m) 的。不会超时。

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