AtCoder-ABC-409 题解

在这里插入图片描述



比赛速览

  • A. 模拟
  • B. 枚举
  • C. 枚举
  • D. 贪心
  • E. DFS
  • F. 优先队列 + 并查集

A - Conflict

NNN 个物品。给定两个长度为 NNN 的字符串 TTTAAA ,分别表示 Takahashi 和 Aoki 对物品的需求。其中:

  • TiT_iTi 表示第 iii 个物品的 Takahashi 需求状态:
  • Ti=T_i =Ti= o 时,Takahashi 想要该物品;
  • Ti=T_i =Ti= x 时,Takahashi 不想要该物品。
  • AiA_iAi 表示第 iii 个物品的 Aoki 需求状态:
  • Ai=A_i =Ai= o 时,Aoki 想要该物品;
  • Ai=A_i =Ai= x 时,Aoki 不想要该物品。

请判断是否存在至少一个物品,使得 Takahashi 和 Aoki 同时想要该物品。即,是否存在满足以下条件的索引 iii (1≤i≤N)(1 \leq i \leq N)(1iN)

  • Ti=T_i =Ti= oAi=A_i =Ai= o

B - Citation

给定一个长度为 NNN 的非负整数序列 A=(A1,A2,…,AN)A=(A_1,A_2,\dots,A_N)A=(A1,A2,,AN),请找到满足以下条件的最大非负整数 xxx

条件
在序列 AAA 中,大于或等于 xxx 的元素(包括重复项)至少出现 xxx 次。

示例解释

例如,若存在某个 x=3x=3x=3 ,则序列中需有至少 3 个元素(可重复)的值 ≥3\geq 33 。若同时满足 x=4x=4x=4 时仅有 3 个元素 ≥4\geq 44,则最大有效 xxx3

而A序列最多只有100个数字,也就是数字最多只能出现100次,所以x最大就是100, 从0开始枚举到100, 然后暴力检查是否符合条件即可。

C - Equilateral Triangle

定一个周长为 LLL 的圆,圆周上按顺时针方向依次放置了 NNN 个点,编号为 1,2,…,N1, 2, \ldots, N1,2,,N 。对于每个 i=1,2,…,N−1i=1, 2, \ldots, N-1i=1,2,,N1 ,点 i+1i+1i+1 位于点 iii 顺时针方向 did_idi 距离的位置。

请找出满足以下两个条件的整数三元组 (a,b,c) (1≤a<b<c≤N)(a, b, c)\ (1 \leq a < b < c \leq N)(a,b,c) (1a<b<cN) 的数量:

  1. 位置不同
    三个点 aaabbbccc 必须位于圆周上的不同位置。
  2. 等边三角形
    以这三个点为顶点的三角形必须是等边三角形。

在圆环上的等边三角形,要求就是三个点之间的弧一样长,可以直接把圆环展开成一条直线,如图。

  1. 如果L不是3的倍数,则无解,因为点都在整数位上。
  2. 一旦我们选定一个位置xix_ixi作为等边三角形的一个顶点,另外两个顶点的位置直接可以计算出来:xi+L/3,x+i+L/3+L/3x_i + L/3, x+i + L/3 + L/3xi+L/3,x+i+L/3+L/3
  3. 然后三个位置上的点数之积统计进入答案(组合数学,乘法原理)

D - String Rotation

给定一个长度为 NNN 的由小写字母组成的字符串 S=S1S2…SNS = S_1S_2\dots S_NS=S1S2SN。你需要对 SSS 执行一次如下操作:

操作定义
选择一个长度至少为 1 的连续子串,将其循环左移一位。具体步骤为:

  1. 选择区间 [l,r][l, r][l,r](满足 1≤l≤r≤N1 \leq l \leq r \leq N1lrN);
  2. 将子串的第一个字符 SlS_lSl 移动到该子串的末尾(即插入到 rrr 的右侧);
  3. 删除原 SlS_lSl 字符。

示例
若子串为 abc,操作后变为 bca

目标
通过一次上述操作,找到能得到的所有可能字符串中字典序最小的字符串。

字符串贪心。

考虑如下的几个Case:

  1. aattaaaattxx。对于第一个,t可以挪到最后面。对于第二个,无法挪动。
  2. aattaabcdeaettaxyz, 需要把t一直向后挪动,直到遇到x。

找到第一组相邻的字符满足前大后小的特征,然后一直向后查找,直到找到比这个字符更大的位置。

代码实现即可。

E - Pair Annihilation

给定一棵包含 NNN 个顶点的树,顶点编号为 1,2,…,N1,2,\dots,N1,2,,N ,边编号为 1,2,…,N−11,2,\dots,N-11,2,,N1 。每条边 jjj 双向连接顶点 uju_jujvjv_jvj ,并具有权重 wjw_jwj 。每个顶点 iii 被赋予一个整数 xix_ixi ,其含义如下:

  • xi>0x_i > 0xi>0 ,表示顶点 iii 上有 xix_ixi 个正电子;
  • xi<0x_i < 0xi<0 ,表示顶点 iii 上有 −xi-x_ixi 个电子;
  • xi=0x_i = 0xi=0 ,表示顶点 iii 无粒子。
    保证:所有顶点粒子数之和为 ∑i=1Nxi=0\sum_{i=1}^N x_i = 0i=1Nxi=0

粒子移动规则

  • 沿边 jjj 移动一个正电子或电子需消耗 wjw_jwj 能量;
  • 当正电子与电子处于同一顶点时,会以相等数量成对湮灭。

目标
计算湮灭所有粒子所需的最小总能量

示例说明

例如,若顶点 AAA 有 2 个正电子,顶点 BBB 有 2 个电子,将它们沿权重为 3 的边移动到同一顶点后湮灭,总能耗为 2×3+2×3=122 \times 3 + 2 \times 3 = 122×3+2×3=12 (需考虑最优路径)。

首先我们可以看出来移动的等价性,无论是正电荷向负电子移动还是负电子向正电荷移动都是等价的。这里的等价性,无论是移动后的终态还是移动产生的代价都是等价的。

其实我们考虑对于一个节点,我们需要知道他具体向不同的邻居分多少去移动,但是这个问题我们不好解决,所以我们考虑将这棵树拎起来以后从叶节点开始考虑。

对于一个业界点节点上的电荷,如果想被中和,那么除非是从父亲移动过来或者向父亲移动,我们又证明了移动的等价性,所以我们将业节点的电荷全部移动到父节点身上,那么所有儿子都移动到父节点身上之后,电荷在父节点会产生一些中和,剩余的电荷,继续向上移动给祖父即可。

综上,我们只需要写一个DFS,实现这个过程就可以了。

F - Connecting Points

给定一个二维平面上的图 GGG ,包含 NNN 个顶点和 0 条边。顶点编号为 111NNN ,其中顶点 iii 的坐标为 (xi,yi)(x_i, y_i)(xi,yi)

距离定义

  1. 顶点间距离:顶点 uuuvvv 的曼哈顿距离为
    d(u,v)=∣xu−xv∣+∣yu−yv∣d(u,v) = |x_u - x_v| + |y_u - y_v|d(u,v)=xuxv+yuyv
  2. 连通块间距离:对于图的两个连通块 AAABBB (顶点集分别为 V(A)V(A)V(A)V(B)V(B)V(B) ),定义其距离为
    d(A,B)=min⁡a∈V(A),b∈V(B)d(a,b)d(A,B) = \min_{a \in V(A), b \in V(B)} d(a,b)d(A,B)=minaV(A),bV(B)d(a,b)

需处理 QQQ 个操作,每个操作属于以下三种类型之一:

  1. 添加顶点 1 a b
  • 参数
    • a: 新顶点的横坐标
    • b: 新顶点的纵坐标
  • 操作
    • 若当前图 GGGnnn 个顶点,则添加编号为 n+1n+1n+1 的新顶点,坐标为 (a,b)(a, b)(a,b)
  1. 合并连通分量 2
  • 前置条件
  • 当前图 GGGnnn 个顶点, mmm 个连通分量。
  • 处理逻辑
  • m=1m=1m=1 (图已连通):
    • 输出 -1
  • m≥2m \geq 2m2
  1. 计算最小距离
    • 对所有连通分量对 Ai,AjA_i, A_jAi,Aj ,计算 d(Ai,Aj)d(A_i, A_j)d(Ai,Aj)
    • 取最小值 k=min⁡1≤i<j≤md(Ai,Aj)k = \min_{1 \leq i < j \leq m} d(A_i, A_j)k=min1i<jmd(Ai,Aj)
  2. 添加边
    • 对所有顶点对 (u,v)(u, v)(u,v) ,若满足:
      • uuuvvv 属于不同连通分量;
      • d(u,v)=kd(u, v) = kd(u,v)=k
    • 添加边 u↔vu \leftrightarrow vuv
  3. 输出结果
    • 输出 kkk
  4. 查询连通性 3 u v
  • 参数
    • u: 顶点编号
    • v: 顶点编号
  • 操作
    • 若顶点 uuuvvv 属于同一连通分量:输出 Yes
    • 否则:输出 No

本题其实是一个简单题,只要分析清楚复杂度就可以了。

三种操作中,第二种操作需要我们快速查找距离最近的点对;第三种操作需要我们使用并查集来查询联通块关系,那只剩第一种操作比较难处理。

考虑数据的范围只有1500,所以我们可以预处理除所有点对的距离放入优先队列中,并且当新增一个点的时候,我们也将这个点所产生的所有新点对全部加入优先队列中。这样对于第二个操作,我们只需要从优先对待中取出最小的点对即可。

剩余的部分就是常规操作了。


赛后交流
微信号:jikecheng11,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值