AtCoder Regular Contest 120 题解

ARC120 题解

[toc]

AC代码

A – Max Add

题意很迷惑,看晕了,不想翻译了。。。看懂了就会做的题。。。

B – Uniformly Distributed

给定一个 $H\times W$ 的网格图,每个单元格中要么被染为红色或蓝色,要么未染色。现在你要从 $(1,1)$ 走到 $(H,W)$ ,只能向右或者向下移动一个单位,询问有多少种染色方法(所有未染色的方格都必须上色)使得所有走法遍历到的红色格子数量相同。

$H,W\leq 500$ 。

画一画就不难发现:所有 $i+j=k(k=0,1,\ldots,h+w-2)$ 的单元格 $(i,j)$ 的颜色都必须一样,因此只需要枚举 $k$ ,然后扫一遍是否存在已经染色的格子:

  1. 两种颜色都存在:无解,直接退出。
  2. 只存在一种颜色:对答案无影响。
  3. 未染色:答案乘二。

C – Swaps 2

给定两个大小为 $N$ 的数列 $A,B$ ,询问你能否通过下方操作在有限次操作内将 $A$ 变为 $B$ :

  1. 选择一个 $i$ ,然后交换 $A_i,A_{i+1}$ ;
  2. 当前的 $A_i$ 加 $1$ ;
  3. 当前的 $A_{i+1}$ 减 $1$ 。

上方三个操作必须依次执行。如果可以,求出最少操作次数。

$2\leq N\leq 2\times 10^5$ 。

上述操作相当于将 $(A_i,A_{i+1})$ 变换为 $(A_{i+1}+1,A_i-1)$ ,因此我们构造 $A’i=A_i+i,B’_i=B_i+i$ 。这样 $(A’_i,A’{i+1})$ 变换后就是 $(A’_{i+1},A’_i)$ 。

因此只需要解决一个简单的问题:数列 $A$ 交换几次相邻的元素能够得到数列 $B$ ,离散化后求逆序对即可解决。

D – Bracket Score 2

给定一个大小为 $2N$ 的数列 $A$ ,构造一个大小为 $2N$ 的合法括号序列 $S$ (所有括号都有单独对应的匹配括号)使得其权值最大。括号序列的权值定义为:$S$ 中 $N$ 对匹配的括号 $(i,j)$ 在数组 $A$ 中元素差值的绝对值 $|A_i-A_j|$ ,例如 $A=(1,2,3,4);S=(())$ ,那么 $S$ 的权值就是 $|1-4|+|2-3|=4$ 。

$N\leq 2\times 10^5$ 。

本题的核心在于:如果我们能让较大的 $N$ 个元素和较小的 $N$ 个元素匹配,那么该括号序列的权值一定是最大的。

因此我们将数组 $A$ 中较大的 $N$ 个元素染为白色,较小的 $N$ 个元素染为黑色,设法将 $N$ 对括号都设置为一白一黑。从 $i=0,1,2,\ldots,2n-1$ 开始遍历,并用一个栈 $stk$ 维护以下操作:

  1. 如果 $stk$ 为空,则直接入栈。
  2. 如果 $stk$ 非空,且 $A_i$ 与栈顶元素的颜色相同,则 $A_i$ 入栈。
  3. 如果 $stk$ 非空,且 $A_i$ 与栈顶元素的颜色不同,则栈顶元素对应位置设置为 ( ,$S_i$ 设置为 ) ,栈顶元素弹出。

由于黑白元素数量相等,这样构造的括号序列一定是合法的,并且绝对值差值之和一定最大。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇