CF1859

CF1859

A. United We Stand

Statement

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

Solution

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

B. Olya and Game with Arrays

Statement

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

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

美丽值的定义是每个数列中的最小值之和,即 $ \sum_{i=1}^{n} min_{j=1}^{m_i}a_{i,j} $ 。

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

共有 $ T $ 组数据 , $ 1 \leq T \leq 25000 $ ,$ 1 \leq n \leq 25000 $ ,$ 2 \leq m \leq 50000 $ ,$ 1 \leq a_{i,j} \leq 10^9 $ 。

Solution

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

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

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

C. Another Permutation Problem

Statement

给定 \(n \ (\leqslant 250)\),求一个 \(1\)\(n\) 的排列 \(\{ p_n \}\) 使 \(\sum_{i=1}^n p_i \cdot i - \max_{j=1}^n\{ p_j \cdot j \}\) 最大,输出最大值。

Solution

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

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

D. Andrey and Escape from Capygrad

Statement

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

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

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

Solution

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

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

值域 \(1e9\)\(n,m\) 范围 \(2e5\),离散化就行。

线段树空间要开 \(8e5\)

离散化别写挂了!。

E. Maximum Monogonosity

Statement

有两个长度为 \(n\) 的序列 \(a\)\(b\)。其中区间 \([l,r]\)\((1 \le l \le r \le n)\) 的价值是 \(|b_l-a_r|+|b_r-a_l|\)

区间 \([l_1,r_1]\) \((1 \le l_1 \le r_1 \le n)\) 和区间 \([l_2,r_2]\) \((1 \le l_2 \le r_2 \le n)\) 不相交,是指 \(r_1 < l_2\) 满足或 \(r_2 < l_1\) 满足。

区间 \([l,r]\) \((1 \le l \le r \le n)\) 的长度被定义为 \(r-l+1\)

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

Solution

\(dp_{i,j}\) 表示前 \(i\) 个填了 \(j\) 个长度的最大价值。

\(dp_{i,j}=\max(dp_{i-1,j},\max\limits_{k=1}^j dp_{i-k,j-k}+|a_i-b_{i-k+1}|+|b_i-a_{i-k+1}|)\)

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

F. Teleportation in Byteland

第一个 *3200。

Statement

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

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

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

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

Solution

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

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

\(g_{x,k}\) 表示路径经过 \(k\) 次学习之后,从 \(x\) 走到根的最短距离,特别的 \(dis_{x}=g_{x,0}\)

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

考虑答案会是什么样子的,如果什么也不学,那么答案就是 \(dis_x+dis_y-2\times dis_{lca(x,y)}\)

如果从 \(x\to lca(x,y)\) 路径上一点 \(v\) 出发去某个点学习,那么答案就是 \(dis_x+g_{y,k}-2\times g_{lca(x,y),k}+f_v-dis_v+g_{i,k}+m\times k\)

如果从 \(lca(x,y)\to y\) 路径上一点 \(v\) 出发去某个点学习,那么答案就是 \(dis_x+g_{y,k}-2\times dis_{lca(x,y)}+f_v+dis_v-g_{i,k}+m\times k\)

其中 \(f_v-dis_v+g_{i,k}\)\(f_v+dis_v-g{i,k}\) 可以用树剖+ST 表维护路径上的最小值,复杂度 \(\log\)

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

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

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

Code

posted @ 2023-10-26 15:52  Zimo_666  阅读(550)  评论(0)    收藏  举报