CF1859

CF1859

A. United We Stand

Statement

一共 t 组数据,每组数据给定一个长度为 n 数组 a,将其分为两个数组,使得任意第二个数组中的数不可以整除任意第一个数组中的数。

Solution

呆呆A。直接排序将最小的分进去即可。

B. Olya and Game with Arrays

Statement

这里有 n 个数列,第 i 个数列包含 mi 个正整数 。

现在你可以在每个数列中挑出至多一个元素移动至另外一个数列(当然也可以不移动),一个数列中可以接受多个元素加入进来,但是一个数列中只有一个元素可以被挑出移动至其他数列,所有操作在同一时刻完成 。

美丽值的定义是每个数列中的最小值之和,即 i=1nminj=1miai,j

现在求通过操作后,这 n 个数列最大的美丽值 。

共有 T 组数据 , 1T250001n250002m500001ai,j109

Solution

我们看看总贡献中会由什么构成,显然由一些最小值和次小值构成。

那么我们考虑一定要让次小值构成,但是必须得有一个最小值也产生一次贡献,那么我就让一个最小值代替掉最小的次小值。

直接 O(n) 维护次小值和最小值。

C. Another Permutation Problem

Statement

给定 n (250),求一个 1n 的排列 {pn} 使 i=1npiimaxj=1n{pjj} 最大,输出最大值。

Solution

找规律题。打表可以发现一些规律。

然后可以发现他是翻转一段。枚举反转点即可。

D. Andrey and Escape from Capygrad

Statement

给定 n 对区间,每对区间由大区间 [li,ri] 和小区间 [ai,bi] 构成,保证小区间是大区间的子区间。在任意时间,你可以任意多次使用(可以不使用)以下技能来改变你的当前位置:

  • 选择一个数 i(1in) ,满足你当前位置在第 i 对区间的大区间内,则你可以立即传送到这对区间的小区间里的你指定的任意位置。

q 组询问,每组询问给定一个初始位置 x ,回答当你初始位置为 x 时,你能只通过传送技能传送到的最大位置。

Solution

看起来很板子,但是离散化会写挂,这是为什么呢?

线段树维护当前点跳一次能到的最大值,然后从后往前扫一遍就行。

值域 1e9n,m 范围 2e5,离散化就行。

线段树空间要开 8e5

离散化别写挂了!。

E. Maximum Monogonosity

Statement

有两个长度为 n 的序列 ab。其中区间 [l,r](1lrn) 的价值是 |blar|+|bral|

区间 [l1,r1] (1l1r1n) 和区间 [l2,r2] (1l2r2n) 不相交,是指 r1<l2 满足或 r2<l1 满足。

区间 [l,r] (1lrn) 的长度被定义为 rl+1

给定 a,b,求若干个互不相交的,总长度为 k [l,r] 的价值总和的最大值。

Solution

dpi,j 表示前 i 个填了 j 个长度的最大价值。

dpi,j=max(dpi1,j,maxk=1jdpik,jk+|aibik+1|+|biaik+1|)

其中后面那个 max 可以另开一个数组枚举四种情况维护就行。

F. Teleportation in Byteland

第一个 *3200。

Statement

比特兰有 n 个城市,其中一些城市由道路连接,道路可以双向通行。第 i 条道路有其自身的难度参数 wi。以难度为 wi 的道路上的通行时间为 wic,其中 c 是当前驾驶技能。

比特兰的旅行网络是一棵树。换句话说,在任意两个城市之间,最多只有一条经过每个城市的路径。

在一些城市中,您可以参加驾驶课程。完成单个课程需要 T 时间,并且完成课程后驾驶员的技能 c 翻倍。请注意,完成课程所需的时间 T 在所有城市中是相同的,并且可以在同一个城市中多次完成课程。

您需要回答 q 个查询:如果您从技能 c=1 开始旅行,从城市 a 到城市 b 所需的最短时间是多少?

Solution

首先,经过 log 次学习之后肯定是无效的,而且我们对于一次询问 uv,我们策略要么是不学习,要么就是 uv 路径上某个点 x 一次性学习 K(K<log) 次,然后从 x 走到 v

我们设 fx,k 表示从 x 走到某个距离它最近的可以学习的点经过 k 次学习之后再走回来的最近距离。

gx,k 表示路径经过 k 次学习之后,从 x 走到根的最短距离,特别的 disx=gx,0

将询问离线下来,然后考虑枚举学习次数,每个次数分别处理每个询问。

考虑答案会是什么样子的,如果什么也不学,那么答案就是 disx+disy2×dislca(x,y)

如果从 xlca(x,y) 路径上一点 v 出发去某个点学习,那么答案就是 disx+gy,k2×glca(x,y),k+fvdisv+gi,k+m×k

如果从 lca(x,y)y 路径上一点 v 出发去某个点学习,那么答案就是 disx+gy,k2×dislca(x,y)+fv+disvgi,k+m×k

其中 fvdisv+gi,kfv+disvgi,k 可以用树剖+ST 表维护路径上的最小值,复杂度 log

fx,k 可以用 Dijkstra 最短路,开始先把所有特殊点丢进优先队列中,其中对于每次每次枚举的学习次数,分别处理边权即可。

代码还是比较好写的,注意一些细节比如枚举学习次数的上限是 logmaxw,最大值要 1e18,对于不需要加减的最大值可以赋 Long_Long_Max,树剖的东西要每次清空,LCA 不要写挂诸如此类的。

还是比较好实现的,具体可以看看代码。

Code

posted @   Zimo_666  阅读(432)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示