【题解】AtCoder Beginner Contest 247 补题记录

AtCoder Beginner Contest 247

A Move Right

题意

给出一个长度为 4 且由 01 组成的序列。现在将除最后一位外每个位置上的字符右移一位。求最终得到的序列(第一位视作 0)。

思路

模拟。

B Unique Nicknames

题意

n 个人,每个人有其名 si 和姓 ti。尝试给每个人起一个昵称 ai,使得 1jnijaisjaitj。问是否存在合法方案。

2n100

思路

模拟。

map 记录每个人的姓和名在所有姓名里的出现次数。显然当一个人的姓和名出现次数均大于 2 时无解。注意特判一个人的姓名相同的情况。

C 1 2 1 3 1 2 1

题意

按以下方式定义序列 Sn

  • S1=1

  • Sn=Sn1,n,Sn1,n2

给定 n,输出 Sn

1n16

思路

n16,暴力递归模拟即可。

D Cylinder

给定 Q 个操作,对于序列 S,每次操作可以:

1S 末尾加入 cx

2 取出 S 开头的 c 个元素,求它们的和。

数据保证对于操作 2,当时序列中的元素总数大于等于 c

1Q2×105

0x109

1c109

思路

树状数组 + 二分。

考虑将每个操作 1 视作一个元素,维护由这些元素组成的序列:

用两个树状数组分别维护序列中 c 的前缀和 totc×x 的前缀和 sum,同时用两个指针 s,t 表示当前 S[s,t] 中的元素组成。

对于操作 1,直接更改树状数组和指针。

对于操作 2,考虑在 [s,t] 中二分出第一个位置 l,使得 i=slcic。此时分类讨论:

  • i=slci=c,直接树状数组求和。然后 s=l+1

  • i=slci>c,此时前 c 个元素和为 i=sl1ci×xi+(ci=sl1ci)xl。此时 clcl(ci=sl1ci),相应地需要修改树状数组。

树状数组复杂度 O(logn),二分复杂度 O(logn),总时间复杂度 O(Qlog2n)

E Max Min

题意

给定一个长度为 N 的序列 A 和两个正整数 X,Y。试求出满足 LiR,max(Ai)=Xmin(Ai)=Y 的有序正整数对 (L,R) 的个数。

1N,Ai2×105

1YX2×105

思路

ST表 + 二分。

考虑用 ST 表维护区间最值。枚举 L,用四次二分得到 [L,N] 中:

  • 第一个令 Lil1,max(Ai)=X 的位置 l1

  • 最后一个令 Lir1,max(Ai)=X 的位置 r1

  • 第一个令 Lil1,min(Ai)=Y 的位置 l2

  • 最后一个令 Lir2,min(Ai)=Y 的位置 r2

显然 [l1,r1][l2,r2] 的交区间中,每一个下标都可以和 L 构成一对满足条件的有序数对,直接统计答案。

ST表预处理复杂度 O(nlogn),单次查询最值 O(1),二分复杂度 O(logn),总时间复杂度 O(nlogn)

注意 O(nlog2n) 的线段树做法会被卡(或许是因为我常数大?)

F Cards

题意

n 张卡牌,第 i 张卡牌正面的数字为 Pi,背面的数字为 Qi,其中 Pi,Qi 均为 1n 的排列。问有多少种方式,使得 1n 中每个数字至少在一张卡牌的某一面中出现一次。

方案数对 998244353 取模。

1N2×105

1Pi,QiN

思路

转化。

先考虑一个前置问题:若在 1n 中,两个相邻数字至少要选一个,一共有多少种方案?

考虑令 n 个数的方案总数为 F(n)。分类讨论:

  • 若选 n,则方案数为 F(n1)

  • 若不选 n,则必须选 n1,方案数为 F(n2)

显然 F(1)=1,F(2)=3,F(n)=F(n1)+F(n2),n3

回到问题。不妨构造一个包含 n 个结点的图,并在 Pi,Qi 直接连边。显然图中每个结点的度数都是 2,因此这个图是由若干个环组成的。现在问题被转化成:求原图的边覆盖总数。

显然所有环都是等价的,因此考虑一个环的情况。令长度为 m 的环的边覆盖总数为 G(m)。将环的结点依次标号为 1m,分类讨论:

    1. 选择边 (1,m)。此时将除 (1,m) 外的边依次标号为 1,m1,显然标号相邻的边至少要选择一条。方案总数为 F(m1)
    1. 不选择边 (1,m)。此时边 (m1,m) 和边 (1,2) 都必须被选择。同理,方案总数为 F(m3)

所以 G(m)=F(m1)+F(m3)

F 表达 G(m2),G(m1),G(m)

G(m2)=F(m3)+F(m5)G(m1)=F(m2)+F(m4)G(m)=F(m1)+F(m3)

又有

F(m1)=F(m2)+F(m3)F(m3)=F(m4)+F(m5)

所以 G(m)=G(m1)+G(m2)

手推可以发现 G(1)=1,G(2)=3,G(m)=G(m1)+G(m2),m3

最后所有环的 G 值乘积就是答案。

时间复杂度 O(n)

G Dream Team

题意

N 个人,第 i 个人来自第 Ai 所大学,擅长第 Bi 门学科,权值为 Ci。定义 Dream Team 为若干个人的组合,满足:

  • Dream Team 中的所有人来自不同的大学

  • Dream Team 中所有人擅长的学科不同

设 Dream Team 最多有 k 个人。试对于 1ik,求包含 i 个人的 Dream Team 的最大权值和。

1N3×104

1Ai,Bi150

1Ci109

思路

费用流。

考虑新建两个起点 s1,s2 和汇点 t,将每所大学和每个学科分别视作一个结点。

Ai,Bi 之间连接一条容量为 1,费用为 Ci 的边。

s2,Ai 之间连一条容量为 1,费用为 0 的边。

Bi,t 之间连一条容量为 1,费用为 0 的边。

枚举最大人数 k。每次在 s1,s2 之间连接一条容量为 1,费用为 0 的边,表示尝试增加 1 个人。如果增广的流量为 0,说明此时已经得到最大人数,退出;反之,此时增广该流量的最大费用就是加入的人的权值,求前缀和即可。

显然 k150,时间复杂度是 O(能过)

posted @   kymru  阅读(112)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示
主题色彩